{
  "version": "4.6.0",
  "generatedAt": "2026-11-01T13:44:04.937Z",
  "components": [
    {
      "name": "Accordion",
      "description": "Stacks sections behind their own headers and opens each on demand — reach for `Tabs` when a few primary sections get switched between often, and leave content on the page when people read most of it anyway. `primary` and `secondary` are inline rows for grouping; `section` is the bordered panel, and the only variant with room for `AccordionActions`.",
      "importPath": "@wallarm-org/design-system/Accordion",
      "props": [
        {
          "name": "variant",
          "type": "AccordionVariant | undefined",
          "required": false,
          "description": "Visual variant of the accordion",
          "defaultValue": "primary"
        },
        {
          "name": "multiple",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether multiple items can be expanded at the same time",
          "defaultValue": "false"
        },
        {
          "name": "collapsible",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether an expanded item can be collapsed (when `multiple` is false)",
          "defaultValue": "true"
        },
        {
          "name": "value",
          "type": "string[] | undefined",
          "required": false,
          "description": "Controlled expanded item values"
        },
        {
          "name": "defaultValue",
          "type": "string[] | undefined",
          "required": false,
          "description": "Initial expanded item values for uncontrolled usage"
        },
        {
          "name": "onValueChange",
          "type": "complex",
          "required": false,
          "description": "Callback fired when expanded items change"
        },
        {
          "name": "disabled",
          "type": "boolean | undefined",
          "required": false,
          "description": "Disable all interaction"
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "variant",
          "options": [
            "primary",
            "secondary",
            "section"
          ],
          "defaultValue": "primary"
        }
      ],
      "subComponents": [
        {
          "name": "AccordionActions",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "AccordionContent",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "description": "Use the provided child element as the default rendered element, combining their props and behavior."
            }
          ]
        },
        {
          "name": "AccordionItem",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string",
              "required": true,
              "description": "The value of the accordion item."
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false,
              "description": "Whether the accordion item is disabled."
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "description": "Use the provided child element as the default rendered element, combining their props and behavior."
            }
          ]
        },
        {
          "name": "AccordionTrigger",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "description": "Use the provided child element as the default rendered element, combining their props and behavior."
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Primary",
          "code": "import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@wallarm-org/design-system/Accordion';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const Primary = () => (\n  <div className='w-440'>\n    <Accordion variant='primary' data-testid='accordion-primary'>\n      <AccordionItem value='1'>\n        <AccordionTrigger>Title</AccordionTrigger>\n        <AccordionContent>\n          <Text>{sampleText}</Text>\n        </AccordionContent>\n      </AccordionItem>\n      <AccordionItem value='2'>\n        <AccordionTrigger>Title</AccordionTrigger>\n        <AccordionContent>\n          <Text>{sampleText}</Text>\n        </AccordionContent>\n      </AccordionItem>\n    </Accordion>\n  </div>\n);",
          "storyFile": "Accordion/Accordion.stories.tsx",
          "storyTitle": "Data Display/Accordion",
          "description": "The default variant — a 40px row with the chevron ahead of the title and a hover\nfill across the full width. Opening one section closes the other: `multiple` is\noff unless you ask for it."
        },
        {
          "name": "Secondary",
          "code": "import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@wallarm-org/design-system/Accordion';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const Secondary = () => (\n  <div className='w-440'>\n    <Accordion variant='secondary' data-testid='accordion-secondary'>\n      <AccordionItem value='1'>\n        <AccordionTrigger>Title</AccordionTrigger>\n        <AccordionContent>\n          <Text>{sampleText}</Text>\n        </AccordionContent>\n      </AccordionItem>\n      <AccordionItem value='2'>\n        <AccordionTrigger>Title</AccordionTrigger>\n        <AccordionContent>\n          <Text>{sampleText}</Text>\n        </AccordionContent>\n      </AccordionItem>\n    </Accordion>\n  </div>\n);",
          "storyFile": "Accordion/Accordion.stories.tsx",
          "storyTitle": "Data Display/Accordion",
          "description": "A 24px row in small medium-weight muted type with no hover fill, for dense or\nnested groups where the header should sit behind the content it labels."
        },
        {
          "name": "Section",
          "code": "import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@wallarm-org/design-system/Accordion';\nimport { NumericBadge } from '@wallarm-org/design-system/NumericBadge';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const Section = () => (\n  <div className='w-440'>\n    <Accordion variant='section' defaultValue={['1']} data-testid='accordion-section'>\n      <AccordionItem value='1'>\n        <AccordionTrigger>\n          Title <NumericBadge>2</NumericBadge>\n        </AccordionTrigger>\n        <AccordionContent>\n          <Text>{sampleText}</Text>\n        </AccordionContent>\n      </AccordionItem>\n      <AccordionItem value='2'>\n        <AccordionTrigger>\n          Title <NumericBadge>2</NumericBadge>\n        </AccordionTrigger>\n        <AccordionContent>\n          <Text>{sampleText}</Text>\n        </AccordionContent>\n      </AccordionItem>\n    </Accordion>\n  </div>\n);",
          "storyFile": "Accordion/Accordion.stories.tsx",
          "storyTitle": "Data Display/Accordion",
          "description": "`section` draws each item as a bordered panel row — title left, chevron right —\nand the title takes inline content, here a `NumericBadge` carrying a count."
        },
        {
          "name": "SectionWithActions",
          "code": "import { Accordion, AccordionActions, AccordionContent, AccordionItem, AccordionTrigger } from '@wallarm-org/design-system/Accordion';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { NumericBadge } from '@wallarm-org/design-system/NumericBadge';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const SectionWithActions = () => (\n  <div className='w-560'>\n    <Accordion\n      variant='section'\n      defaultValue={['1']}\n      data-testid='accordion-section-actions'\n    >\n      <AccordionItem value='1'>\n        <AccordionTrigger>\n          Title <NumericBadge>2</NumericBadge>\n        </AccordionTrigger>\n        <AccordionActions>\n          <Button variant='ghost' size='small'>\n            Delete\n          </Button>\n          <Button variant='outline' size='small'>\n            Edit\n          </Button>\n        </AccordionActions>\n        <AccordionContent>\n          <Text>{sampleText}</Text>\n        </AccordionContent>\n      </AccordionItem>\n      <AccordionItem value='2'>\n        <AccordionTrigger>\n          Title <NumericBadge>2</NumericBadge>\n        </AccordionTrigger>\n        <AccordionActions>\n          <Button variant='ghost' size='small'>\n            Delete\n          </Button>\n          <Button variant='outline' size='small'>\n            Edit\n          </Button>\n        </AccordionActions>\n        <AccordionContent>\n          <Text>{sampleText}</Text>\n        </AccordionContent>\n      </AccordionItem>\n    </Accordion>\n  </div>\n);",
          "storyFile": "Accordion/Accordion.stories.tsx",
          "storyTitle": "Data Display/Accordion",
          "description": "`AccordionActions` renders beside the trigger rather than inside it, so buttons in\nthe header act on the section without toggling it open."
        },
        {
          "name": "LongTitlePrimary",
          "code": "import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@wallarm-org/design-system/Accordion';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const LongTitlePrimary = () => (\n  <div className='w-320'>\n    <Accordion variant='primary' data-testid='accordion-long-title-primary'>\n      <AccordionItem value='1'>\n        <AccordionTrigger>{longTitleText}</AccordionTrigger>\n        <AccordionContent>\n          <Text>{sampleText}</Text>\n        </AccordionContent>\n      </AccordionItem>\n    </Accordion>\n  </div>\n);",
          "storyFile": "Accordion/Accordion.stories.tsx",
          "storyTitle": "Data Display/Accordion",
          "description": "Titles truncate to one line rather than wrapping — the row is a fixed height, so\nreword a long header instead of relying on the ellipsis."
        },
        {
          "name": "LongTitleSecondary",
          "code": "import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@wallarm-org/design-system/Accordion';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const LongTitleSecondary = () => (\n  <div className='w-320'>\n    <Accordion variant='secondary' data-testid='accordion-long-title-secondary'>\n      <AccordionItem value='1'>\n        <AccordionTrigger>{longTitleText}</AccordionTrigger>\n        <AccordionContent>\n          <Text>{sampleText}</Text>\n        </AccordionContent>\n      </AccordionItem>\n    </Accordion>\n  </div>\n);",
          "storyFile": "Accordion/Accordion.stories.tsx",
          "storyTitle": "Data Display/Accordion",
          "description": "The same 320px column at `secondary` size, where smaller type and no row padding\nleave a little more of the title visible before the ellipsis."
        },
        {
          "name": "Multiple",
          "code": "import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@wallarm-org/design-system/Accordion';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const Multiple = () => (\n  <div className='w-440'>\n    <Accordion\n      variant='section'\n      multiple\n      defaultValue={['1', '2']}\n      data-testid='accordion-multiple'\n    >\n      <AccordionItem value='1'>\n        <AccordionTrigger>Section A</AccordionTrigger>\n        <AccordionContent>\n          <Text>{sampleText}</Text>\n        </AccordionContent>\n      </AccordionItem>\n      <AccordionItem value='2'>\n        <AccordionTrigger>Section B</AccordionTrigger>\n        <AccordionContent>\n          <Text>{sampleText}</Text>\n        </AccordionContent>\n      </AccordionItem>\n      <AccordionItem value='3'>\n        <AccordionTrigger>Section C</AccordionTrigger>\n        <AccordionContent>\n          <Text>{sampleText}</Text>\n        </AccordionContent>\n      </AccordionItem>\n    </Accordion>\n  </div>\n);",
          "storyFile": "Accordion/Accordion.stories.tsx",
          "storyTitle": "Data Display/Accordion",
          "description": "`multiple` keeps several sections open at once, for when people reference sections\non their own terms — not when the sections have to be read side by side, which is\na layout rather than an accordion."
        },
        {
          "name": "Disabled",
          "code": "import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@wallarm-org/design-system/Accordion';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const Disabled = () => (\n  <div className='w-440'>\n    <Accordion variant='primary' data-testid='accordion-disabled'>\n      <AccordionItem value='1'>\n        <AccordionTrigger>Available</AccordionTrigger>\n        <AccordionContent>\n          <Text>{sampleText}</Text>\n        </AccordionContent>\n      </AccordionItem>\n      <AccordionItem value='2' disabled>\n        <AccordionTrigger>Disabled item</AccordionTrigger>\n        <AccordionContent>\n          <Text>{sampleText}</Text>\n        </AccordionContent>\n      </AccordionItem>\n    </Accordion>\n  </div>\n);",
          "storyFile": "Accordion/Accordion.stories.tsx",
          "storyTitle": "Data Display/Accordion",
          "description": "`disabled` on a single `AccordionItem` fades the row and blocks its toggle while the\nrest stay live; the same prop on `Accordion` locks every row at once."
        }
      ]
    },
    {
      "name": "Alert",
      "description": "An inline message bound to one part of the screen, which stays until the state changes or the reader dismisses it — reach for `Banner` when the message would still matter on another page, `Toast` for a transient confirmation, and the field’s own error for a single invalid input. `color` carries the meaning and `AlertIcon` takes its icon from it, so the pair is not yours to mix; `primary` is the neutral default for a notice with no status to encode.",
      "importPath": "@wallarm-org/design-system/Alert",
      "props": [
        {
          "name": "color",
          "type": "AlertColor | undefined",
          "required": false,
          "description": "Color variant of the alert",
          "defaultValue": "primary"
        },
        {
          "name": "minWidth",
          "type": "number | undefined",
          "required": false,
          "description": "Minimum width in pixels (default: 256)",
          "defaultValue": "ALERT_MIN_WIDTH"
        },
        {
          "name": "maxWidth",
          "type": "number | undefined",
          "required": false,
          "description": "Maximum width in pixels (default: 980)",
          "defaultValue": "ALERT_MAX_WIDTH"
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "color",
          "options": [
            "primary",
            "destructive",
            "info",
            "warning",
            "success"
          ],
          "defaultValue": "primary"
        }
      ],
      "subComponents": [
        {
          "name": "AlertClose",
          "props": [
            {
              "name": "onClick",
              "type": "(() => void) | undefined",
              "required": false,
              "description": "Callback when the close button is clicked"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "AlertContent",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "AlertControls",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "AlertDescription",
          "props": [
            {
              "name": "lineClamp",
              "type": "number | undefined",
              "required": false,
              "description": "Maximum number of lines before truncation (default: 4). Set to 0 to disable truncation."
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "AlertIcon",
          "props": [
            {
              "name": "icon",
              "type": "ReactNode",
              "required": false,
              "description": "Override the default icon for the variant"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "AlertTitle",
          "props": [
            {
              "name": "lineClamp",
              "type": "number | undefined",
              "required": false,
              "description": "Maximum number of lines before truncation (default: 4). Set to 0 to disable truncation."
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "AllColors",
          "code": "import { Alert, AlertContent, AlertDescription, AlertIcon, AlertTitle } from '@wallarm-org/design-system/Alert';\n\nexport const AllColors = () => (\n  <div className='flex flex-col gap-16 w-[600px]'>\n    <Alert color='primary'>\n      <AlertIcon />\n      <AlertContent>\n        <AlertTitle>Primary Alert</AlertTitle>\n        <AlertDescription>This is a neutral alert for general information.</AlertDescription>\n      </AlertContent>\n    </Alert>\n\n    <Alert color='destructive'>\n      <AlertIcon />\n      <AlertContent>\n        <AlertTitle>Destructive Alert</AlertTitle>\n        <AlertDescription>This alert indicates an error or dangerous action.</AlertDescription>\n      </AlertContent>\n    </Alert>\n\n    <Alert color='info'>\n      <AlertIcon />\n      <AlertContent>\n        <AlertTitle>Info Alert</AlertTitle>\n        <AlertDescription>This alert provides informational content to the user.</AlertDescription>\n      </AlertContent>\n    </Alert>\n\n    <Alert color='warning'>\n      <AlertIcon />\n      <AlertContent>\n        <AlertTitle>Warning Alert</AlertTitle>\n        <AlertDescription>This alert warns the user about potential issues.</AlertDescription>\n      </AlertContent>\n    </Alert>\n\n    <Alert color='success'>\n      <AlertIcon />\n      <AlertContent>\n        <AlertTitle>Success Alert</AlertTitle>\n        <AlertDescription>This alert confirms a successful action or operation.</AlertDescription>\n      </AlertContent>\n    </Alert>\n  </div>\n);",
          "storyFile": "Alert/Alert.stories.tsx",
          "storyTitle": "Messaging/Alert",
          "description": "The five colours with the icon each implies: neutral `primary` for a general notice, then destructive, info, warning and success for real status."
        },
        {
          "name": "TitleOnly",
          "code": "import { Alert, AlertContent, AlertIcon, AlertTitle } from '@wallarm-org/design-system/Alert';\n\nexport const TitleOnly = () => {\n  return (\n    <div className='flex flex-col gap-16 w-[600px]'>\n      <Alert color='primary'>\n        <AlertIcon />\n        <AlertContent>\n          <AlertTitle>Alert with title only</AlertTitle>\n        </AlertContent>\n      </Alert>\n\n      <Alert color='info'>\n        <AlertIcon />\n        <AlertContent>\n          <AlertTitle>Information message without description</AlertTitle>\n        </AlertContent>\n      </Alert>\n    </div>\n  );\n};",
          "storyFile": "Alert/Alert.stories.tsx",
          "storyTitle": "Messaging/Alert",
          "description": "A title on its own is a complete alert. Add a description only when it says something the title does not."
        },
        {
          "name": "WithCloseButton",
          "code": "import { useState } from 'react';\nimport { Alert, AlertClose, AlertContent, AlertDescription, AlertIcon, AlertTitle } from '@wallarm-org/design-system/Alert';\n\nexport const WithCloseButton = () => {\n  const [showInfo, setShowInfo] = useState(true);\n  const [showWarning, setShowWarning] = useState(true);\n\n  return (\n    <div className='flex flex-col gap-16 w-[600px]'>\n      {showInfo && (\n        <Alert color='info'>\n          <AlertIcon />\n          <AlertContent>\n            <AlertTitle>Dismissable Alert</AlertTitle>\n            <AlertDescription>This alert can be closed by clicking the X button.</AlertDescription>\n          </AlertContent>\n          <AlertClose onClick={() => setShowInfo(false)} />\n        </Alert>\n      )}\n\n      {showWarning && (\n        <Alert color='warning'>\n          <AlertIcon />\n          <AlertContent>\n            <AlertTitle>Warning with close</AlertTitle>\n          </AlertContent>\n          <AlertClose onClick={() => setShowWarning(false)} />\n        </Alert>\n      )}\n    </div>\n  );\n};",
          "storyFile": "Alert/Alert.stories.tsx",
          "storyTitle": "Messaging/Alert",
          "description": "`AlertClose` gives the reader a way out — add it where dismissing is reasonable, and leave it off while the condition still holds."
        },
        {
          "name": "WithControls",
          "code": "import { Alert, AlertClose, AlertContent, AlertControls, AlertDescription, AlertIcon, AlertTitle } from '@wallarm-org/design-system/Alert';\nimport { Button } from '@wallarm-org/design-system/Button';\n\nexport const WithControls = () => {\n  return (\n    <div className='flex flex-col gap-16 w-[600px]'>\n      <Alert color='info'>\n        <AlertIcon />\n        <AlertContent>\n          <AlertTitle>Alert with Two Action Buttons</AlertTitle>\n          <AlertDescription>\n            This alert has two action buttons on the right side without a close button.\n          </AlertDescription>\n        </AlertContent>\n        <AlertControls>\n          <Button variant='secondary' color='neutral' size='small'>\n            Learn more\n          </Button>\n          <Button variant='secondary' color='neutral' size='small'>\n            Dismiss\n          </Button>\n        </AlertControls>\n      </Alert>\n\n      <Alert color='info'>\n        <AlertIcon />\n        <AlertContent>\n          <AlertTitle>Alert with Actions and Close</AlertTitle>\n          <AlertDescription>This alert has action buttons and a close button.</AlertDescription>\n        </AlertContent>\n        <AlertControls>\n          <Button variant='secondary' color='neutral' size='small'>\n            Learn more\n          </Button>\n        </AlertControls>\n        <AlertClose />\n      </Alert>\n\n      <Alert color='destructive'>\n        <AlertIcon />\n        <AlertContent>\n          <AlertTitle>Critical Error</AlertTitle>\n          <AlertDescription>An error occurred that requires your attention.</AlertDescription>\n        </AlertContent>\n        <AlertControls>\n          <Button variant='secondary' color='destructive' size='small'>\n            Fix now\n          </Button>\n        </AlertControls>\n        <AlertClose />\n      </Alert>\n    </div>\n  );\n};",
          "storyFile": "Alert/Alert.stories.tsx",
          "storyTitle": "Messaging/Alert",
          "description": "`AlertControls` as a direct child of `Alert` puts the actions top-right, which is what a wide alert wants. The buttons are always `secondary` and `small`, neutral or destructive to match the alert, never a solid primary."
        },
        {
          "name": "WithBottomActions",
          "code": "import { Alert, AlertClose, AlertContent, AlertControls, AlertDescription, AlertIcon, AlertTitle } from '@wallarm-org/design-system/Alert';\nimport { Button } from '@wallarm-org/design-system/Button';\n\nexport const WithBottomActions = () => {\n  return (\n    <div className='flex flex-col gap-16 w-[600px]'>\n      <Alert color='info'>\n        <AlertIcon />\n        <AlertContent>\n          <AlertTitle>Alert with Bottom Actions</AlertTitle>\n          <AlertDescription>\n            This alert has action buttons at the bottom of the content area.\n          </AlertDescription>\n          <AlertControls>\n            <Button variant='secondary' color='neutral' size='small'>\n              Primary Action\n            </Button>\n            <Button variant='secondary' color='neutral' size='small'>\n              Secondary\n            </Button>\n          </AlertControls>\n        </AlertContent>\n        <AlertClose />\n      </Alert>\n\n      <Alert color='destructive'>\n        <AlertIcon />\n        <AlertContent>\n          <AlertTitle>Destructive Alert with Actions</AlertTitle>\n          <AlertDescription>\n            This error requires immediate action. Please review and take necessary steps.\n          </AlertDescription>\n          <AlertControls>\n            <Button variant='secondary' color='destructive' size='small'>\n              Delete\n            </Button>\n            <Button variant='secondary' color='neutral' size='small'>\n              Cancel\n            </Button>\n          </AlertControls>\n        </AlertContent>\n      </Alert>\n    </div>\n  );\n};",
          "storyFile": "Alert/Alert.stories.tsx",
          "storyTitle": "Messaging/Alert",
          "description": "The same controls nested inside `AlertContent` drop below the text instead, which is what a narrow alert wants. Placement follows the width rather than a rule."
        },
        {
          "name": "MinMaxWidth",
          "code": "import { Alert, AlertClose, AlertContent, AlertDescription, AlertIcon, AlertTitle } from '@wallarm-org/design-system/Alert';\n\nexport const MinMaxWidth = () => {\n  const edge = 'border border-dashed border-border-primary';\n  return (\n    <div className='flex flex-col gap-24'>\n      <div>\n        <div className={`w-[200px] ${edge}`}>\n          <Alert color='info'>\n            <AlertIcon />\n            <AlertContent>\n              <AlertTitle>Short</AlertTitle>\n            </AlertContent>\n          </Alert>\n        </div>\n      </div>\n      <div>\n        <div className={`w-[600px] ${edge}`}>\n          <Alert color='warning'>\n            <AlertIcon />\n            <AlertContent>\n              <AlertTitle>\n                This is a very long alert title that demonstrates the maximum width behavior of the\n                component\n              </AlertTitle>\n              <AlertDescription>\n                This is an extended description that shows how the alert handles longer content, and\n                wraps within whatever width the container gives it.\n              </AlertDescription>\n            </AlertContent>\n            <AlertClose />\n          </Alert>\n        </div>\n      </div>\n      <div className='overflow-x-auto'>\n        <div className={`w-[1100px] ${edge}`}>\n          <Alert color='primary'>\n            <AlertIcon />\n            <AlertContent>\n              <AlertTitle>\n                Past 980px the alert stops widening and leaves the rest of the container empty\n              </AlertTitle>\n              <AlertDescription>\n                A line of text long enough to reach the ceiling, so the gap on the right is the\n                ceiling rather than the content running out.\n              </AlertDescription>\n            </AlertContent>\n            <AlertClose />\n          </Alert>\n        </div>\n      </div>\n      <div>\n        <div className={`w-[600px] ${edge}`}>\n          <Alert color='success' maxWidth={500}>\n            <AlertIcon />\n            <AlertContent>\n              <AlertTitle>\n                This is a very long alert title that demonstrates the custom maximum width behavior\n              </AlertTitle>\n              <AlertDescription>\n                This alert has a custom maxWidth of 500px set via prop.\n              </AlertDescription>\n            </AlertContent>\n            <AlertClose />\n          </Alert>\n        </div>\n      </div>\n    </div>\n  );\n};",
          "storyFile": "Alert/Alert.stories.tsx",
          "storyTitle": "Messaging/Alert",
          "description": "Each row puts the alert in a container that crosses one of its bounds, since\nneither is visible in a container that sits between them. The alert has no width\nof its own: it takes the container's, clamped between 256 and 980px."
        },
        {
          "name": "MaxLines",
          "code": "import { Alert, AlertContent, AlertDescription, AlertIcon, AlertTitle } from '@wallarm-org/design-system/Alert';\n\nexport const MaxLines = () => {\n  const longTitle =\n    'This is a very long title that should be truncated after a certain number of lines. It keeps going and going to demonstrate the line clamp functionality. We need even more text to ensure it exceeds the maximum number of lines allowed.';\n  const longDescription =\n    'This is a very long description that demonstrates the text truncation feature. The description can be quite lengthy and should be limited to a maximum of 4 lines by default. When the text exceeds this limit, it will be truncated with an ellipsis. This behavior ensures that the alert remains compact and does not take up too much vertical space on the page. Additional text is added here to make sure the truncation is visible.';\n  return (\n    <div className='flex flex-col gap-16 w-600'>\n      <div>\n        <Alert color='info'>\n          <AlertIcon />\n          <AlertContent>\n            <AlertTitle lineClamp={4}>{longTitle}</AlertTitle>\n            <AlertDescription lineClamp={4}>{longDescription}</AlertDescription>\n          </AlertContent>\n        </Alert>\n      </div>\n      <div>\n        <Alert color='warning'>\n          <AlertIcon />\n          <AlertContent>\n            <AlertTitle lineClamp={2}>{longTitle}</AlertTitle>\n            <AlertDescription lineClamp={2}>{longDescription}</AlertDescription>\n          </AlertContent>\n        </Alert>\n      </div>\n      <div>\n        <Alert color='success'>\n          <AlertIcon />\n          <AlertContent>\n            <AlertTitle>{longTitle}</AlertTitle>\n            <AlertDescription>{longDescription}</AlertDescription>\n          </AlertContent>\n        </Alert>\n      </div>\n    </div>\n  );\n};",
          "storyFile": "Alert/Alert.stories.tsx",
          "storyTitle": "Messaging/Alert",
          "description": "`lineClamp` is opt-in: without it long text wraps freely, and with it the text truncates and the full string moves into a tooltip. Four lines is the usual cap."
        },
        {
          "name": "WithCode",
          "code": "import { Alert, AlertClose, AlertContent, AlertDescription, AlertIcon, AlertTitle } from '@wallarm-org/design-system/Alert';\nimport { Code } from '@wallarm-org/design-system/Code';\n\nexport const WithCode = () => (\n  <div className='flex flex-col gap-16 w-700'>\n    <Alert color='destructive'>\n      <AlertIcon />\n      <AlertContent>\n        <AlertTitle>Message goes here</AlertTitle>\n        <AlertDescription>Description goes here</AlertDescription>\n        <div className='pt-8'>\n          <Code size='s' color='destructive'>\n            Optional code output\n          </Code>\n        </div>\n      </AlertContent>\n    </Alert>\n\n    <Alert color='destructive'>\n      <AlertIcon />\n      <AlertContent>\n        <AlertTitle>Syntax Error in Configuration</AlertTitle>\n        <AlertDescription>An error occurred while parsing the configuration file.</AlertDescription>\n\n        <div className='pt-8'>\n          <Code size='s' color='destructive'>\n            Error: Unexpected token at line 42, column 15\n          </Code>\n        </div>\n      </AlertContent>\n      <AlertClose />\n    </Alert>\n  </div>\n);",
          "storyFile": "Alert/Alert.stories.tsx",
          "storyTitle": "Messaging/Alert",
          "description": "An inline `Code` line inside the content, for the error code or the command that failed — the one piece of rich content an alert is built to carry."
        }
      ]
    },
    {
      "name": "AnimatedBackground",
      "description": "The decorative backdrop behind the surfaces that have no chrome of their own — sign-in, the splash screen, the assistant. `pixel`, the default, sweeps a canvas dot grid; `blur` drifts a mesh gradient. Children sit centred above it. It is `aria-hidden` and lets the pointer through, with one exception: the pixel variant’s `game`, which takes pointer events for as long as it is running.",
      "importPath": "@wallarm-org/design-system/AnimatedBackground",
      "props": [
        {
          "name": "variant",
          "type": "\"pixel\" | undefined",
          "required": false,
          "defaultValue": "pixel"
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [
        {
          "name": "BlurBackground",
          "props": [
            {
              "name": "palette",
              "type": "BlurBackgroundPalette | undefined",
              "required": false,
              "description": "Blob colours and layout. `'chat'` is the Wally chat panel mesh (Figma chat-bg 67:1254),\ntuned for a ~480px-wide panel and meant to be dimmed by the host (5–12% opacity).",
              "defaultValue": "default"
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "PixelBackground",
          "props": [
            {
              "name": "game",
              "type": "boolean | undefined",
              "required": false,
              "defaultValue": "false"
            },
            {
              "name": "excludeCardSize",
              "type": "{ width: number; height: number; } | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Pixel",
          "code": "import { AnimatedBackground } from '@wallarm-org/design-system/AnimatedBackground';\n\nexport const Pixel = () => (\n  <AnimatedBackground className='h-screen w-screen' />\n);",
          "storyFile": "AnimatedBackground/AnimatedBackground.stories.tsx",
          "storyTitle": "Layout/AnimatedBackground",
          "description": "The default sweep across the dot grid, full-bleed with nothing on top of it."
        },
        {
          "name": "PixelWithCard",
          "code": "import { AnimatedBackground } from '@wallarm-org/design-system/AnimatedBackground';\nimport { Card, CardContent, CardHeader, CardTitle } from '@wallarm-org/design-system/Card';\n\nexport const PixelWithCard = () => (\n  <AnimatedBackground\n    className='h-screen w-screen'\n    game\n    excludeCardSize={{ width: 300, height: 200 }}\n  >\n    <Card className='w-[300px] h-[200px]'>\n      <CardHeader>\n        <CardTitle>Sign In</CardTitle>\n      </CardHeader>\n      <CardContent>\n        <p className='text-sm text-text-secondary'>\n          Decorative background renders behind interactive content.\n        </p>\n      </CardContent>\n    </Card>\n  </AnimatedBackground>\n);",
          "storyFile": "AnimatedBackground/AnimatedBackground.stories.tsx",
          "storyTitle": "Layout/AnimatedBackground",
          "description": "A card above the grid, with `excludeCardSize` keeping the dots clear behind it. This story also switches on `game` — the easter egg, and the one case where the backdrop accepts clicks."
        },
        {
          "name": "Blur",
          "code": "import { AnimatedBackground } from '@wallarm-org/design-system/AnimatedBackground';\n\nexport const Blur = () => (\n  <AnimatedBackground variant='blur' className='h-screen w-screen' />\n);",
          "storyFile": "AnimatedBackground/AnimatedBackground.stories.tsx",
          "storyTitle": "Layout/AnimatedBackground",
          "description": "`variant='blur'`: colour blobs drifting behind a frosted layer, which is the assistant’s backdrop rather than the console’s."
        },
        {
          "name": "BlurWithCard",
          "code": "import { AnimatedBackground } from '@wallarm-org/design-system/AnimatedBackground';\nimport { Card, CardContent, CardHeader, CardTitle } from '@wallarm-org/design-system/Card';\n\nexport const BlurWithCard = () => (\n  <AnimatedBackground variant='blur' className='h-screen w-screen'>\n    <Card className='w-[300px] h-[200px]'>\n      <CardHeader>\n        <CardTitle>Wally Chat</CardTitle>\n      </CardHeader>\n      <CardContent>\n        <p className='text-sm text-text-secondary'>\n          Liquid gradient background renders behind chat content.\n        </p>\n      </CardContent>\n    </Card>\n  </AnimatedBackground>\n);",
          "storyFile": "AnimatedBackground/AnimatedBackground.stories.tsx",
          "storyTitle": "Layout/AnimatedBackground",
          "description": "The same gradient with content over it. There is no exclusion to set here, since the blur has no grid for a card to interrupt."
        }
      ]
    },
    {
      "name": "AppShell",
      "description": "The platform’s outermost frame — global top bar, product rail, and the content surface products mount into, with an optional `AppShellAside` panel docked to its right. There is exactly one, at the app root, and it persists while the content swaps. Do not wrap a page in it: a single product screen renders `RemoteShell` and its own content, blind to the shell. In-product navigation is `NavPanel`, and laying out a page’s insides is `Stack` and `Flex`. The gray surround — header bar plus rail, everything that is not the canvas — is the **Frame**. It carries **Ambient**, a faint still layer of soft blooms, grain and a dot cluster pooled bottom-left, painted under everything. Ambient is on by default; `ambient={false}` leaves the flat Frame fill. The Frame comes in two styles, **Neutral** and **Branded**: a user preference next to light/dark, set with `useTheme().setFrameStyle` (from `ThemeProvider`) and written on `<html>` so every micro-frontend follows it. Branded warms the Frame and turns active navigation to the brand colour; try it from the account item → Appearance.",
      "importPath": "@wallarm-org/design-system/AppShell",
      "props": [
        {
          "name": "reveal",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "expandFrom",
          "type": "AppShellExpandFrom | undefined",
          "required": false
        },
        {
          "name": "onRevealed",
          "type": "(() => void) | undefined",
          "required": false
        },
        {
          "name": "appeared",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "ambient",
          "type": "boolean | undefined",
          "required": false,
          "description": "The Frame's ambient layer — soft blooms, grain and a dot cluster behind the header and\nrail. On by default; `false` leaves the flat Frame token fill.",
          "defaultValue": "true"
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [
        {
          "name": "AppShellAside",
          "props": [
            {
              "name": "open",
              "type": "boolean",
              "required": true,
              "description": "Shows the panel, sliding it in from the right as the canvas narrows. Closing makes it\n`hidden` and `inert` at once while the column slides shut, after which it takes no space.\nThe panel stays painted through that slide only where `display` can transition\n(`transition-behavior: allow-discrete`: Chromium, WebKit); in Firefox it hides at once while\nthe column still closes smoothly. Under reduced motion both directions are instant. Its\nchildren stay mounted throughout, so whatever state they hold survives a close and reopen."
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "AppShellHeader",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "AppShellRail",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "AppShellRemote",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Basic",
          "code": "import { StoryRouter } from './story-content';\n\nexport const Basic = ({ ambient }) => (\n  <StoryRouter>\n    <Shell ambient={ambient} />\n  </StoryRouter>\n);",
          "storyFile": "AppShell/AppShell.stories.tsx",
          "storyTitle": "Navigation/AppShell",
          "description": "The three regions composed once — `AppShellHeader`, `AppShellRail`, `AppShellRemote` — with the content surface being the only part that scrolls. Pick a product in the rail to drill into it, and the account item at the bottom for appearance and sidebar mode."
        },
        {
          "name": "Loading",
          "code": "import { StoryRouter } from './story-content';\n\nexport const Loading = ({ ambient, loading }) => (\n  <StoryRouter>\n    <Shell ambient={ambient} loading={loading} simulateProductLoading />\n  </StoryRouter>\n);",
          "storyFile": "AppShell/AppShell.stories.tsx",
          "storyTitle": "Navigation/AppShell",
          "description": "How the shell looks while the platform loads. The header actions and the product rail hold skeletons that sit exactly where the real items land, so nothing jumps when they arrive. Turn `loading` off in Controls to watch the swap. Opening a product also shows its own panel and content loading."
        },
        {
          "name": "WithAside",
          "code": "import { StoryRouter } from './story-content';\n\nexport const WithAside = ({ ambient }) => (\n  <StoryRouter>\n    <Shell ambient={ambient} aside />\n  </StoryRouter>\n);",
          "storyFile": "AppShell/AppShell.stories.tsx",
          "storyTitle": "Navigation/AppShell",
          "description": "`AppShellAside` docks a panel right of the content surface — the real `WallyAssistant` here, driven by the `useMockWally` streaming mock and toggled from the header's `ChatTrigger` — that slides in as the canvas narrows, while closing widens the canvas back and hides the region without unmounting what is inside, so the conversation and text typed into the panel survive a close and reopen."
        },
        {
          "name": "RevealFlow",
          "code": "import { StoryRouter } from './story-content';\n\nexport const RevealFlow = () => (\n  <StoryRouter>\n    <RevealFlowShell />\n  </StoryRouter>\n);",
          "storyFile": "AppShell/AppShell.stories.tsx",
          "storyTitle": "Navigation/AppShell",
          "description": "`reveal` animates the chrome in on the first application load only. Leave it unset for an ordinary screen; this exists for prototyping the boot moment itself."
        },
        {
          "name": "LoginFlow",
          "code": "import { StoryRouter } from './story-content';\n\nexport const LoginFlow = () => (\n  <StoryRouter>\n    <LoginFlowShell />\n  </StoryRouter>\n);",
          "storyFile": "AppShell/AppShell.stories.tsx",
          "storyTitle": "Navigation/AppShell",
          "description": "The whole entrance: the splash hands off, the content surface expands from the sign-in card into the full shell. `onRevealed` fires when it has settled."
        },
        {
          "name": "WithTanStackRouter",
          "code": "import { useState } from 'react';\nimport { RouterProvider } from '@tanstack/react-router';\n\nexport const WithTanStackRouter = () => {\n  const [router] = useState(createShellRouter);\n\n  return <RouterProvider router={router} />;\n};",
          "storyFile": "AppShell/AppShell.stories.tsx",
          "storyTitle": "Navigation/AppShell",
          "description": "`AppShell` and a `RemoteShell` per product on one TanStack Router: the root route is\nthe shell (rail → `navigate`, `AppShellRemote` → `<Outlet />`), `/$product` is the\nremote (`RemoteShell` with `pathname` + `onNavigate`, content → `<Outlet />`), and\n`/$product/$` is the page. Every way of moving — the rail, the nav panel, the\nbreadcrumbs, links in the page — goes through the router, and the active items follow."
        }
      ]
    },
    {
      "name": "ApprovalCard",
      "description": "Asks the user to approve an action Wally wants to take — a tool call, a config change — before it runs. While `status` is `pending` the card shows its children (`ApprovalCardContent` and `ApprovalCardActions`); once the app sets `approved` or `rejected`, the children are replaced by a one-line status, so the buttons need no gating of their own. The card has no outer margins or horizontal padding: the panel gutter (`ChatBody` / `ChatFooter`) places it, whether it sits inline in the conversation or docked above the input. Buttons are plain DS components composed by the app, which also owns loading — disable them while the request is in flight.",
      "importPath": "@wallarm-org/design-system/ApprovalCard",
      "props": [
        {
          "name": "status",
          "type": "ApprovalCardStatus | undefined",
          "required": false,
          "description": "Pending shows `children` (content + actions); resolved states replace them with a status row.",
          "defaultValue": "pending"
        },
        {
          "name": "caption",
          "type": "ReactNode",
          "required": false,
          "description": "Shown above the card in every state. Pass `null` to hide it.",
          "defaultValue": "Requires your approval"
        },
        {
          "name": "approvedLabel",
          "type": "ReactNode",
          "required": false,
          "defaultValue": "Approved"
        },
        {
          "name": "rejectedLabel",
          "type": "ReactNode",
          "required": false,
          "defaultValue": "Rejected"
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "status",
          "options": [
            "pending",
            "approved",
            "rejected"
          ],
          "defaultValue": "pending"
        }
      ],
      "subComponents": [
        {
          "name": "ApprovalCardActions",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "ApprovalCardContent",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Pending",
          "code": "import { ApprovalCard, ApprovalCardActions, ApprovalCardContent } from '@wallarm-org/design-system/ApprovalCard';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { ChevronDown } from '@wallarm-org/design-system/icons';\nimport { SplitButton } from '@wallarm-org/design-system/SplitButton';\n\nexport const Pending = () => (\n  <ApprovalCard data-testid='approval-card'>\n    <ApprovalCardContent>Add 203.0.113.42 to the denylist on all applications</ApprovalCardContent>\n    <ApprovalCardActions>\n      <DropdownMenu positioning={{ placement: 'bottom-end' }}>\n        <SplitButton>\n          <Button>Always allow in this session</Button>\n          <DropdownMenuTrigger asChild>\n            <Button aria-label='More approval options' data-testid='approval-card-more'>\n              <ChevronDown />\n            </Button>\n          </DropdownMenuTrigger>\n        </SplitButton>\n        <DropdownMenuContent>\n          <DropdownMenuItem data-testid='approval-card-allow-once'>Allow once</DropdownMenuItem>\n        </DropdownMenuContent>\n      </DropdownMenu>\n      <Button variant='secondary' color='neutral'>\n        Reject\n      </Button>\n    </ApprovalCardActions>\n  </ApprovalCard>\n);",
          "storyFile": "ApprovalCard/ApprovalCard.stories.tsx",
          "storyTitle": "AI/ApprovalCard",
          "description": "The default ask: what Wally wants to do, then the split approve button and Reject."
        },
        {
          "name": "PendingLongText",
          "code": "import { ApprovalCard, ApprovalCardActions, ApprovalCardContent } from '@wallarm-org/design-system/ApprovalCard';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { ChevronDown } from '@wallarm-org/design-system/icons';\nimport { SplitButton } from '@wallarm-org/design-system/SplitButton';\n\nexport const PendingLongText = () => (\n  <ApprovalCard data-testid='approval-card'>\n    <ApprovalCardContent>\n      Disable the rule \"Block SQL injection attempts\" for the application \"Payments API\" and\n      redeploy the policy to every node in the eu-west-1 cluster. Affected endpoint:\n      https://payments.example.com/api/v2/transactions/refunds/batch-processing/callbacks\n    </ApprovalCardContent>\n    <ApprovalCardActions>\n      <DropdownMenu positioning={{ placement: 'bottom-end' }}>\n        <SplitButton>\n          <Button>Always allow in this session</Button>\n          <DropdownMenuTrigger asChild>\n            <Button aria-label='More approval options' data-testid='approval-card-more'>\n              <ChevronDown />\n            </Button>\n          </DropdownMenuTrigger>\n        </SplitButton>\n        <DropdownMenuContent>\n          <DropdownMenuItem data-testid='approval-card-allow-once'>Allow once</DropdownMenuItem>\n        </DropdownMenuContent>\n      </DropdownMenu>\n      <Button variant='secondary' color='neutral'>\n        Reject\n      </Button>\n    </ApprovalCardActions>\n  </ApprovalCard>\n);",
          "storyFile": "ApprovalCard/ApprovalCard.stories.tsx",
          "storyTitle": "AI/ApprovalCard",
          "description": "Long text wraps, and unbroken strings such as URLs break rather than overflow the card."
        },
        {
          "name": "PendingWithCodeSnippet",
          "code": "import { ApprovalCard, ApprovalCardActions, ApprovalCardContent } from '@wallarm-org/design-system/ApprovalCard';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { CodeSnippetCode, CodeSnippetContent, CodeSnippetRoot } from '@wallarm-org/design-system/CodeSnippet';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { ChevronDown } from '@wallarm-org/design-system/icons';\nimport { SplitButton } from '@wallarm-org/design-system/SplitButton';\n\nexport const PendingWithCodeSnippet = () => (\n  <ApprovalCard data-testid='approval-card'>\n    <ApprovalCardContent>\n      <p>Run this command on the node:</p>\n      <CodeSnippetRoot\n        code='wallarm-cli rules disable --id 4021 --app payments-api'\n        language='bash'\n      >\n        <CodeSnippetContent>\n          <CodeSnippetCode />\n        </CodeSnippetContent>\n      </CodeSnippetRoot>\n    </ApprovalCardContent>\n    <ApprovalCardActions>\n      <DropdownMenu positioning={{ placement: 'bottom-end' }}>\n        <SplitButton>\n          <Button>Always allow in this session</Button>\n          <DropdownMenuTrigger asChild>\n            <Button aria-label='More approval options' data-testid='approval-card-more'>\n              <ChevronDown />\n            </Button>\n          </DropdownMenuTrigger>\n        </SplitButton>\n        <DropdownMenuContent>\n          <DropdownMenuItem data-testid='approval-card-allow-once'>Allow once</DropdownMenuItem>\n        </DropdownMenuContent>\n      </DropdownMenu>\n      <Button variant='secondary' color='neutral'>\n        Reject\n      </Button>\n    </ApprovalCardActions>\n  </ApprovalCard>\n);",
          "storyFile": "ApprovalCard/ApprovalCard.stories.tsx",
          "storyTitle": "AI/ApprovalCard",
          "description": "Arguments the user should read verbatim go in a `CodeSnippet`, 8px under the text."
        },
        {
          "name": "AllowOnceMenu",
          "code": "import { ApprovalCard, ApprovalCardActions, ApprovalCardContent } from '@wallarm-org/design-system/ApprovalCard';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { ChevronDown } from '@wallarm-org/design-system/icons';\nimport { SplitButton } from '@wallarm-org/design-system/SplitButton';\n\nexport const AllowOnceMenu = () => (\n  <ApprovalCard data-testid='approval-card'>\n    <ApprovalCardContent>Add 203.0.113.42 to the denylist on all applications</ApprovalCardContent>\n    <ApprovalCardActions>\n      <DropdownMenu positioning={{ placement: 'bottom-end' }} defaultOpen>\n        <SplitButton>\n          <Button>Always allow in this session</Button>\n          <DropdownMenuTrigger asChild>\n            <Button aria-label='More approval options' data-testid='approval-card-more'>\n              <ChevronDown />\n            </Button>\n          </DropdownMenuTrigger>\n        </SplitButton>\n        <DropdownMenuContent>\n          <DropdownMenuItem data-testid='approval-card-allow-once'>Allow once</DropdownMenuItem>\n        </DropdownMenuContent>\n      </DropdownMenu>\n      <Button variant='secondary' color='neutral'>\n        Reject\n      </Button>\n    </ApprovalCardActions>\n  </ApprovalCard>\n);",
          "storyFile": "ApprovalCard/ApprovalCard.stories.tsx",
          "storyTitle": "AI/ApprovalCard",
          "description": "The chevron half of the split button opens the narrower \"Allow once\" option."
        },
        {
          "name": "Loading",
          "code": "import { ApprovalCard, ApprovalCardActions, ApprovalCardContent } from '@wallarm-org/design-system/ApprovalCard';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { ChevronDown } from '@wallarm-org/design-system/icons';\nimport { SplitButton } from '@wallarm-org/design-system/SplitButton';\n\nexport const Loading = () => (\n  <ApprovalCard data-testid='approval-card'>\n    <ApprovalCardContent>Add 203.0.113.42 to the denylist on all applications</ApprovalCardContent>\n    <ApprovalCardActions>\n      <DropdownMenu positioning={{ placement: 'bottom-end' }}>\n        <SplitButton>\n          <Button disabled>Always allow in this session</Button>\n          <DropdownMenuTrigger asChild>\n            <Button aria-label='More approval options' data-testid='approval-card-more' disabled>\n              <ChevronDown />\n            </Button>\n          </DropdownMenuTrigger>\n        </SplitButton>\n        <DropdownMenuContent>\n          <DropdownMenuItem data-testid='approval-card-allow-once'>Allow once</DropdownMenuItem>\n        </DropdownMenuContent>\n      </DropdownMenu>\n      <Button variant='secondary' color='neutral' disabled>\n        Reject\n      </Button>\n    </ApprovalCardActions>\n  </ApprovalCard>\n);",
          "storyFile": "ApprovalCard/ApprovalCard.stories.tsx",
          "storyTitle": "AI/ApprovalCard",
          "description": "There is no loading variant: while the decision is being sent, the app disables its own buttons."
        },
        {
          "name": "Approved",
          "code": "import { ApprovalCard, ApprovalCardActions, ApprovalCardContent } from '@wallarm-org/design-system/ApprovalCard';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { ChevronDown } from '@wallarm-org/design-system/icons';\nimport { SplitButton } from '@wallarm-org/design-system/SplitButton';\n\nexport const Approved = () => (\n  <ApprovalCard data-testid='approval-card' status='approved'>\n    <ApprovalCardContent>Add 203.0.113.42 to the denylist on all applications</ApprovalCardContent>\n    <ApprovalCardActions>\n      <DropdownMenu positioning={{ placement: 'bottom-end' }}>\n        <SplitButton>\n          <Button>Always allow in this session</Button>\n          <DropdownMenuTrigger asChild>\n            <Button aria-label='More approval options'>\n              <ChevronDown />\n            </Button>\n          </DropdownMenuTrigger>\n        </SplitButton>\n        <DropdownMenuContent>\n          <DropdownMenuItem>Allow once</DropdownMenuItem>\n        </DropdownMenuContent>\n      </DropdownMenu>\n      <Button variant='secondary' color='neutral'>\n        Reject\n      </Button>\n    </ApprovalCardActions>\n  </ApprovalCard>\n);",
          "storyFile": "ApprovalCard/ApprovalCard.stories.tsx",
          "storyTitle": "AI/ApprovalCard",
          "description": "After approval the content and buttons collapse into a status row; the caption stays. The\nchildren are kept on purpose: the app renders the same tree and only flips `status`."
        },
        {
          "name": "Rejected",
          "code": "import { ApprovalCard, ApprovalCardActions, ApprovalCardContent } from '@wallarm-org/design-system/ApprovalCard';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { ChevronDown } from '@wallarm-org/design-system/icons';\nimport { SplitButton } from '@wallarm-org/design-system/SplitButton';\n\nexport const Rejected = () => (\n  <ApprovalCard\n    data-testid='approval-card'\n    status='rejected'\n    rejectedLabel='Denylist change rejected'\n  >\n    <ApprovalCardContent>Add 203.0.113.42 to the denylist on all applications</ApprovalCardContent>\n    <ApprovalCardActions>\n      <DropdownMenu positioning={{ placement: 'bottom-end' }}>\n        <SplitButton>\n          <Button>Always allow in this session</Button>\n          <DropdownMenuTrigger asChild>\n            <Button aria-label='More approval options'>\n              <ChevronDown />\n            </Button>\n          </DropdownMenuTrigger>\n        </SplitButton>\n        <DropdownMenuContent>\n          <DropdownMenuItem>Allow once</DropdownMenuItem>\n        </DropdownMenuContent>\n      </DropdownMenu>\n      <Button variant='secondary' color='neutral'>\n        Reject\n      </Button>\n    </ApprovalCardActions>\n  </ApprovalCard>\n);",
          "storyFile": "ApprovalCard/ApprovalCard.stories.tsx",
          "storyTitle": "AI/ApprovalCard",
          "description": "The rejected status row. `rejectedLabel` (like `approvedLabel` and `caption`) is a prop, so\nthe app can say what was rejected."
        },
        {
          "name": "Analytics",
          "code": "import { ApprovalCard, ApprovalCardActions, ApprovalCardContent } from '@wallarm-org/design-system/ApprovalCard';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { ChevronDown } from '@wallarm-org/design-system/icons';\nimport { SplitButton } from '@wallarm-org/design-system/SplitButton';\n\nexport const Analytics = () => (\n  <ApprovalCard data-testid='approval-card' data-analytics-id='AI_APPROVAL_CARD'>\n    <ApprovalCardContent>Add 203.0.113.42 to the denylist on all applications</ApprovalCardContent>\n    <ApprovalCardActions>\n      <DropdownMenu positioning={{ placement: 'bottom-end' }}>\n        <SplitButton>\n          <Button data-analytics-id='AI_APPROVAL_ALLOW_SESSION'>\n            Always allow in this session\n          </Button>\n          <DropdownMenuTrigger asChild>\n            <Button aria-label='More approval options' data-analytics-id='AI_APPROVAL_MORE'>\n              <ChevronDown />\n            </Button>\n          </DropdownMenuTrigger>\n        </SplitButton>\n        <DropdownMenuContent>\n          <DropdownMenuItem data-analytics-id='AI_APPROVAL_ALLOW_ONCE'>Allow once</DropdownMenuItem>\n        </DropdownMenuContent>\n      </DropdownMenu>\n      <Button variant='secondary' color='neutral' data-analytics-id='AI_APPROVAL_REJECT'>\n        Reject\n      </Button>\n    </ApprovalCardActions>\n  </ApprovalCard>\n);",
          "storyFile": "ApprovalCard/ApprovalCard.stories.tsx",
          "storyTitle": "AI/ApprovalCard",
          "description": "Analytics attributes go on the composed DS buttons themselves — the card adds no seam of\nits own, so each `data-analytics-id` lands on the real `<button>`."
        }
      ]
    },
    {
      "name": "AssistantMessage",
      "description": "A message from Wally: an `<article>` named \"Wally\" that left-aligns the answer and whatever led up to it. Stack its parts in this order — an optional `ChainOfThought` with the reasoning and tool calls, an optional `ApprovalCard`, the `AssistantMessageContent`, then a `MessageActions` row; the message spaces them 12px and 4px apart and lines the action icons up with the text. `AssistantMessageContent` spaces and styles markdown blocks; put `AssistantMessageMarkdown` inside it (WallyAssistant's default) or your own renderer's output. `AssistantMessageMarkdown` renders untrusted GFM as DS elements — no raw HTML, http/https/mailto/relative links only, images as alt text — and is streaming-safe: pass the whole text so far with `streaming` and it repairs only the unfinished tail. Set `aria-busy` on the message while the answer streams; before the first output, show only an `AssistantMessageLoader` \"Working...\" row, and if the answer fails, an `AssistantMessageError` after the content with your own Retry button in `action`.",
      "importPath": "@wallarm-org/design-system/AssistantMessage",
      "props": [
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "ordered",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        },
        {
          "name": "align",
          "options": [
            "left",
            "center",
            "right"
          ],
          "defaultValue": "right"
        },
        {
          "name": "muted",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        }
      ],
      "subComponents": [
        {
          "name": "AssistantMessageContent",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "AssistantMessageError",
          "props": [
            {
              "name": "action",
              "type": "ReactNode",
              "required": false,
              "description": "Trailing control, e.g. a Retry Button (yours, so analytics land on it). Rendered inside the error's\n test-id cascade: read `useTestId('<slot>')` in the action to get `<error>--<slot>` — `Button` doesn't."
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "AssistantMessageLoader",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "AssistantMessageMarkdown",
          "props": [
            {
              "name": "text",
              "type": "string",
              "required": true,
              "description": "Untrusted GFM: the whole text so far (a snapshot, never a delta)."
            },
            {
              "name": "streaming",
              "type": "boolean | undefined",
              "required": false,
              "description": "The text is still growing: repair the unfinished last block, hold back a half-typed table or an empty fence,\n keep an open fence unhighlighted. Default false.",
              "defaultValue": "false"
            },
            {
              "name": "variant",
              "type": "AssistantMessageMarkdownVariant | undefined",
              "required": false,
              "description": "Where it renders. 'chain-of-thought': muted, non-copyable inline code and 12px links. Default 'answer'.",
              "defaultValue": "answer"
            },
            {
              "name": "components",
              "type": "Partial<AssistantMessageMarkdownComponents> | undefined",
              "required": false,
              "description": "Element overrides merged over the defaults. Module scope: a new object re-renders every block."
            }
          ]
        },
        {
          "name": "AssistantMessageMarkdownCodeBlock",
          "props": [
            {
              "name": "code",
              "type": "string",
              "required": true
            },
            {
              "name": "language",
              "type": "string | undefined",
              "required": false,
              "description": "The fence info string (`yaml`, `json`, `bash`, `http`…). The app's adapter resolves aliases; unknown → plain."
            },
            {
              "name": "complete",
              "type": "boolean | undefined",
              "required": false,
              "description": "false while the fence is still open in a streaming answer: plain text (no re-highlight per token) and no\n copy button. Default true.",
              "defaultValue": "true"
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "AssistantMessageMarkdownInlineCode",
          "props": [
            {
              "name": "variant",
              "type": "AssistantMessageMarkdownVariant | undefined",
              "required": false,
              "description": "'chain-of-thought' mutes the colour and turns copy off (Figma 494:4292). Default 'answer'.",
              "defaultValue": "answer"
            },
            {
              "name": "code",
              "type": "string",
              "required": true,
              "description": "The code content to display"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "copyable",
              "type": "boolean | undefined",
              "required": false,
              "description": "Enable click to copy functionality (default: true)"
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "AssistantMessageMarkdownLink",
          "props": [
            {
              "name": "href",
              "type": "string",
              "required": true,
              "description": "Already allow-listed by the renderer: http(s), mailto or relative."
            },
            {
              "name": "variant",
              "type": "AssistantMessageMarkdownVariant | undefined",
              "required": false,
              "description": "'chain-of-thought' → 12px, otherwise 14px. Default 'answer'.",
              "defaultValue": "answer"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "{ true: string; }",
              "required": false
            },
            {
              "name": "weight",
              "type": "{ regular: string; medium: string; }",
              "required": false
            },
            {
              "name": "download",
              "type": "any",
              "required": false
            },
            {
              "name": "hrefLang",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "target",
              "type": "HTMLAttributeAnchorTarget | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "AssistantMessageMarkdownTable",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "AnswerProse",
          "code": "import { AssistantMessage, AssistantMessageContent } from '@wallarm-org/design-system/AssistantMessage';\nimport { InlineCodeSnippet } from '@wallarm-org/design-system/CodeSnippet';\n\nexport const AnswerProse = () => (\n  <AssistantMessage data-testid='prose'>\n    <AssistantMessageContent>\n      <h3>Blocked attacks, last 24 hours</h3>\n      <p>\n        Wallarm blocked 1,204 SQL injection attempts, almost all against{' '}\n        <InlineCodeSnippet code='/api/login' size='sm' />.\n      </p>\n      <ul>\n        <li>\n          Most came from <InlineCodeSnippet code='203.0.113.0/24' size='sm' />.\n        </li>\n        <li>The peak was at 03:00 UTC.</li>\n        <li>No request reached the application.</li>\n      </ul>\n      <p>Want me to add a rule that denies the whole subnet?</p>\n    </AssistantMessageContent>\n  </AssistantMessage>\n);",
          "storyFile": "AssistantMessage/AssistantMessage.stories.tsx",
          "storyTitle": "AI/AssistantMessage",
          "description": "A rendered markdown answer: a heading, paragraphs and a list with inline code."
        },
        {
          "name": "WithReasoning",
          "code": "import { AssistantMessage, AssistantMessageContent } from '@wallarm-org/design-system/AssistantMessage';\nimport { ChainOfThought, ChainOfThoughtStep } from '@wallarm-org/design-system/ChainOfThought';\nimport { InlineCodeSnippet } from '@wallarm-org/design-system/CodeSnippet';\nimport { Brain, Database, Search } from '@wallarm-org/design-system/icons';\n\nexport const WithReasoning = () => (\n  <div className='flex flex-col gap-24'>\n    <AssistantMessage data-testid='collapsed'>\n      <ChainOfThought>\n        <ChainOfThoughtStep icon={<Brain />} label='Thought for 5s'>\n          <p>\n            The user wants blocked attacks for a day. Query the events, then group them by path.\n          </p>\n        </ChainOfThoughtStep>\n        <ChainOfThoughtStep icon={<Search />} label='Searched for blocked requests' />\n        <ChainOfThoughtStep icon={<Database />} label='Queried attack events' />\n      </ChainOfThought>\n      <AssistantMessageContent>\n        <h3>Blocked attacks, last 24 hours</h3>\n        <p>\n          Wallarm blocked 1,204 SQL injection attempts, almost all against{' '}\n          <InlineCodeSnippet code='/api/login' size='sm' />.\n        </p>\n        <ul>\n          <li>\n            Most came from <InlineCodeSnippet code='203.0.113.0/24' size='sm' />.\n          </li>\n          <li>The peak was at 03:00 UTC.</li>\n          <li>No request reached the application.</li>\n        </ul>\n        <p>Want me to add a rule that denies the whole subnet?</p>\n      </AssistantMessageContent>\n    </AssistantMessage>\n    <AssistantMessage data-testid='expanded'>\n      <ChainOfThought>\n        <ChainOfThoughtStep icon={<Brain />} label='Thought for 5s' defaultOpen>\n          <p>\n            The user wants blocked attacks for a day. Query the events, then group them by path.\n          </p>\n        </ChainOfThoughtStep>\n        <ChainOfThoughtStep icon={<Search />} label='Searched for blocked requests' />\n        <ChainOfThoughtStep icon={<Database />} label='Queried attack events' />\n      </ChainOfThought>\n      <AssistantMessageContent>\n        <h3>Blocked attacks, last 24 hours</h3>\n        <p>\n          Wallarm blocked 1,204 SQL injection attempts, almost all against{' '}\n          <InlineCodeSnippet code='/api/login' size='sm' />.\n        </p>\n        <ul>\n          <li>\n            Most came from <InlineCodeSnippet code='203.0.113.0/24' size='sm' />.\n          </li>\n          <li>The peak was at 03:00 UTC.</li>\n          <li>No request reached the application.</li>\n        </ul>\n        <p>Want me to add a rule that denies the whole subnet?</p>\n      </AssistantMessageContent>\n    </AssistantMessage>\n  </div>\n);",
          "storyFile": "AssistantMessage/AssistantMessage.stories.tsx",
          "storyTitle": "AI/AssistantMessage",
          "description": "The reasoning sits above the answer as a `ChainOfThought`, 12px away. The first message\nkeeps it collapsed; the second opens the \"Thought for 5s\" step."
        },
        {
          "name": "WithActionsVisible",
          "code": "import { AssistantMessage, AssistantMessageContent } from '@wallarm-org/design-system/AssistantMessage';\nimport { ChainOfThought, ChainOfThoughtStep } from '@wallarm-org/design-system/ChainOfThought';\nimport { InlineCodeSnippet } from '@wallarm-org/design-system/CodeSnippet';\nimport { Copyable, CopyableIcon } from '@wallarm-org/design-system/Copyable';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { Brain, Database, Ellipsis, Search, ThumbsDown, ThumbsUp } from '@wallarm-org/design-system/icons';\nimport { MessageAction, MessageActions, MessageTimestamp } from '@wallarm-org/design-system/MessageActions';\n\nexport const WithActionsVisible = () => (\n  <AssistantMessage data-testid='with-actions'>\n    <ChainOfThought>\n      <ChainOfThoughtStep icon={<Brain />} label='Thought for 5s'>\n        <p>The user wants blocked attacks for a day. Query the events, then group them by path.</p>\n      </ChainOfThoughtStep>\n      <ChainOfThoughtStep icon={<Search />} label='Searched for blocked requests' />\n      <ChainOfThoughtStep icon={<Database />} label='Queried attack events' />\n    </ChainOfThought>\n    <AssistantMessageContent>\n      <h3>Blocked attacks, last 24 hours</h3>\n      <p>\n        Wallarm blocked 1,204 SQL injection attempts, almost all against{' '}\n        <InlineCodeSnippet code='/api/login' size='sm' />.\n      </p>\n      <ul>\n        <li>\n          Most came from <InlineCodeSnippet code='203.0.113.0/24' size='sm' />.\n        </li>\n        <li>The peak was at 03:00 UTC.</li>\n        <li>No request reached the application.</li>\n      </ul>\n      <p>Want me to add a rule that denies the whole subnet?</p>\n    </AssistantMessageContent>\n    <MessageActions visible>\n      <Copyable text={ANSWER_TEXT}>\n        <MessageAction aria-label='Copy'>\n          <CopyableIcon />\n        </MessageAction>\n      </Copyable>\n      <MessageAction aria-label='Good response'>\n        <ThumbsUp />\n      </MessageAction>\n      <MessageAction aria-label='Bad response'>\n        <ThumbsDown />\n      </MessageAction>\n      <DropdownMenu>\n        <DropdownMenuTrigger asChild>\n          <MessageAction aria-label='More actions'>\n            <Ellipsis />\n          </MessageAction>\n        </DropdownMenuTrigger>\n        <DropdownMenuContent>\n          <DropdownMenuItem>Regenerate</DropdownMenuItem>\n          <DropdownMenuItem>Report a problem</DropdownMenuItem>\n        </DropdownMenuContent>\n      </DropdownMenu>\n      <MessageTimestamp dateTime='2026-10-21T09:42:00Z'>1m ago</MessageTimestamp>\n    </MessageActions>\n  </AssistantMessage>\n);",
          "storyFile": "AssistantMessage/AssistantMessage.stories.tsx",
          "storyTitle": "AI/AssistantMessage",
          "description": "The latest answer forces its actions on with `visible`: Copy, thumbs up and down, a more\nmenu and the timestamp, with the first icon lined up with the text."
        },
        {
          "name": "WithApproval",
          "code": "import { ApprovalCard, ApprovalCardActions, ApprovalCardContent } from '@wallarm-org/design-system/ApprovalCard';\nimport { AssistantMessage, AssistantMessageContent } from '@wallarm-org/design-system/AssistantMessage';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { ChainOfThought, ChainOfThoughtStep } from '@wallarm-org/design-system/ChainOfThought';\nimport { InlineCodeSnippet } from '@wallarm-org/design-system/CodeSnippet';\nimport { Copyable, CopyableIcon } from '@wallarm-org/design-system/Copyable';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { Brain, Database, Ellipsis, Search, ThumbsDown, ThumbsUp } from '@wallarm-org/design-system/icons';\nimport { MessageAction, MessageActions, MessageTimestamp } from '@wallarm-org/design-system/MessageActions';\n\nexport const WithApproval = () => (\n  <AssistantMessage data-testid='with-approval'>\n    <ChainOfThought>\n      <ChainOfThoughtStep icon={<Brain />} label='Thought for 5s'>\n        <p>The user wants blocked attacks for a day. Query the events, then group them by path.</p>\n      </ChainOfThoughtStep>\n      <ChainOfThoughtStep icon={<Search />} label='Searched for blocked requests' />\n      <ChainOfThoughtStep icon={<Database />} label='Queried attack events' />\n    </ChainOfThought>\n    <ApprovalCard>\n      <ApprovalCardContent>\n        Add 203.0.113.0/24 to the denylist on all applications\n      </ApprovalCardContent>\n      <ApprovalCardActions>\n        <Button>Allow</Button>\n        <Button variant='secondary' color='neutral'>\n          Reject\n        </Button>\n      </ApprovalCardActions>\n    </ApprovalCard>\n    <AssistantMessageContent>\n      <h3>Blocked attacks, last 24 hours</h3>\n      <p>\n        Wallarm blocked 1,204 SQL injection attempts, almost all against{' '}\n        <InlineCodeSnippet code='/api/login' size='sm' />.\n      </p>\n      <ul>\n        <li>\n          Most came from <InlineCodeSnippet code='203.0.113.0/24' size='sm' />.\n        </li>\n        <li>The peak was at 03:00 UTC.</li>\n        <li>No request reached the application.</li>\n      </ul>\n      <p>Want me to add a rule that denies the whole subnet?</p>\n    </AssistantMessageContent>\n    <MessageActions visible>\n      <Copyable text={ANSWER_TEXT}>\n        <MessageAction aria-label='Copy'>\n          <CopyableIcon />\n        </MessageAction>\n      </Copyable>\n      <MessageAction aria-label='Good response'>\n        <ThumbsUp />\n      </MessageAction>\n      <MessageAction aria-label='Bad response'>\n        <ThumbsDown />\n      </MessageAction>\n      <DropdownMenu>\n        <DropdownMenuTrigger asChild>\n          <MessageAction aria-label='More actions'>\n            <Ellipsis />\n          </MessageAction>\n        </DropdownMenuTrigger>\n        <DropdownMenuContent>\n          <DropdownMenuItem>Regenerate</DropdownMenuItem>\n          <DropdownMenuItem>Report a problem</DropdownMenuItem>\n        </DropdownMenuContent>\n      </DropdownMenu>\n      <MessageTimestamp dateTime='2026-10-21T09:42:00Z'>1m ago</MessageTimestamp>\n    </MessageActions>\n  </AssistantMessage>\n);",
          "storyFile": "AssistantMessage/AssistantMessage.stories.tsx",
          "storyTitle": "AI/AssistantMessage",
          "description": "The full composition: reasoning, an `ApprovalCard` stretched to the message width, the\nanswer and its actions. The card sits 12px from the parts around it, like the reasoning."
        },
        {
          "name": "WithActionsOnHover",
          "code": "import { AssistantMessage, AssistantMessageContent } from '@wallarm-org/design-system/AssistantMessage';\nimport { InlineCodeSnippet } from '@wallarm-org/design-system/CodeSnippet';\nimport { Copyable, CopyableIcon } from '@wallarm-org/design-system/Copyable';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { Ellipsis, ThumbsDown, ThumbsUp } from '@wallarm-org/design-system/icons';\nimport { MessageAction, MessageActions, MessageTimestamp } from '@wallarm-org/design-system/MessageActions';\n\nexport const WithActionsOnHover = () => (\n  <AssistantMessage data-testid='hover-actions'>\n    <AssistantMessageContent>\n      <h3>Blocked attacks, last 24 hours</h3>\n      <p>\n        Wallarm blocked 1,204 SQL injection attempts, almost all against{' '}\n        <InlineCodeSnippet code='/api/login' size='sm' />.\n      </p>\n      <ul>\n        <li>\n          Most came from <InlineCodeSnippet code='203.0.113.0/24' size='sm' />.\n        </li>\n        <li>The peak was at 03:00 UTC.</li>\n        <li>No request reached the application.</li>\n      </ul>\n      <p>Want me to add a rule that denies the whole subnet?</p>\n    </AssistantMessageContent>\n    <MessageActions>\n      <Copyable text={ANSWER_TEXT}>\n        <MessageAction aria-label='Copy'>\n          <CopyableIcon />\n        </MessageAction>\n      </Copyable>\n      <MessageAction aria-label='Good response'>\n        <ThumbsUp />\n      </MessageAction>\n      <MessageAction aria-label='Bad response'>\n        <ThumbsDown />\n      </MessageAction>\n      <DropdownMenu>\n        <DropdownMenuTrigger asChild>\n          <MessageAction aria-label='More actions'>\n            <Ellipsis />\n          </MessageAction>\n        </DropdownMenuTrigger>\n        <DropdownMenuContent>\n          <DropdownMenuItem>Regenerate</DropdownMenuItem>\n          <DropdownMenuItem>Report a problem</DropdownMenuItem>\n        </DropdownMenuContent>\n      </DropdownMenu>\n      <MessageTimestamp dateTime='2026-10-21T09:42:00Z'>1m ago</MessageTimestamp>\n    </MessageActions>\n  </AssistantMessage>\n);",
          "storyFile": "AssistantMessage/AssistantMessage.stories.tsx",
          "storyTitle": "AI/AssistantMessage",
          "description": "Older answers keep their actions row transparent until the message is hovered or holds\nfocus; the 30px row stays reserved so nothing jumps."
        },
        {
          "name": "Streaming",
          "code": "import { AssistantMessage, AssistantMessageContent } from '@wallarm-org/design-system/AssistantMessage';\nimport { ChainOfThought, ChainOfThoughtStep } from '@wallarm-org/design-system/ChainOfThought';\nimport { Database, Search } from '@wallarm-org/design-system/icons';\n\nexport const Streaming = () => (\n  <AssistantMessage data-testid='streaming' aria-busy>\n    <ChainOfThought>\n      <ChainOfThoughtStep icon={<Search />} label='Searched for blocked requests' />\n      <ChainOfThoughtStep icon={<Database />} label='Querying attack events...' status='running' />\n    </ChainOfThought>\n    <AssistantMessageContent>\n      <p>Wallarm blocked 1,204 SQL injection attempts, almost all against</p>\n    </AssistantMessageContent>\n  </AssistantMessage>\n);",
          "storyFile": "AssistantMessage/AssistantMessage.stories.tsx",
          "storyTitle": "AI/AssistantMessage",
          "description": "While the answer streams, set `aria-busy` on the message and show the running step with a\nshimmering label; the actions come once it finishes."
        },
        {
          "name": "Loading",
          "code": "import { AssistantMessage, AssistantMessageLoader } from '@wallarm-org/design-system/AssistantMessage';\n\nexport const Loading = () => (\n  <AssistantMessage data-testid='loading' aria-busy>\n    <AssistantMessageLoader />\n  </AssistantMessage>\n);",
          "storyFile": "AssistantMessage/AssistantMessage.stories.tsx",
          "storyTitle": "AI/AssistantMessage",
          "description": "Before the first output, the message holds only an `AssistantMessageLoader`: the Figma\n\"Working...\" row with a shimmering label, announced as `role='status'`. Pass children to\nchange the text."
        },
        {
          "name": "ErrorState",
          "code": "import { AssistantMessage, AssistantMessageContent, AssistantMessageError } from '@wallarm-org/design-system/AssistantMessage';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { RefreshCcw } from '@wallarm-org/design-system/icons';\n\nexport const ErrorState = () => (\n  <AssistantMessage data-testid='error'>\n    <AssistantMessageContent>\n      <p>Wallarm blocked 1,204 SQL injection attempts, almost all against</p>\n    </AssistantMessageContent>\n    <AssistantMessageError\n      action={\n        <Button\n          variant='ghost'\n          color='neutral'\n          size='small'\n          data-testid='error--error--retry'\n          data-analytics-id='WALLY_ANSWER_RETRY'\n        >\n          <RefreshCcw />\n          Retry\n        </Button>\n      }\n    >\n      The connection was lost before the answer finished.\n    </AssistantMessageError>\n  </AssistantMessage>\n);",
          "storyFile": "AssistantMessage/AssistantMessage.stories.tsx",
          "storyTitle": "AI/AssistantMessage",
          "description": "A failed answer: `AssistantMessageError` comes after whatever content streamed, announced\nas `role='alert'`. Put your own Retry `Button` in `action`, so its click and analytics are\nyours. The action renders inside the error's test-id cascade, but `Button` doesn't read it:\neither give it the full id yourself (here `error--error--retry`, i.e. the error's id `error--error`\nplus `--retry`), or read `useTestId('retry')` (exported from the package) inside your own\nRetry component to derive it. Not in Figma yet; pending design review."
        },
        {
          "name": "Analytics",
          "code": "import { AssistantMessage, AssistantMessageContent } from '@wallarm-org/design-system/AssistantMessage';\nimport { Copyable, CopyableIcon } from '@wallarm-org/design-system/Copyable';\nimport { MessageAction, MessageActions } from '@wallarm-org/design-system/MessageActions';\nimport { WALLY_ANSWER } from './mocks';\n\nexport const Analytics = () => (\n  <AssistantMessage data-testid='analytics' data-analytics-id='WALLY_ANSWER'>\n    <AssistantMessageContent data-analytics-id='WALLY_ANSWER_CONTENT'>\n      <p>{ANSWER_TEXT}</p>\n    </AssistantMessageContent>\n    <MessageActions visible>\n      <Copyable text={ANSWER_TEXT}>\n        <MessageAction aria-label='Copy' data-analytics-id='WALLY_ANSWER_COPY'>\n          <CopyableIcon />\n        </MessageAction>\n      </Copyable>\n    </MessageActions>\n  </AssistantMessage>\n);",
          "storyFile": "AssistantMessage/AssistantMessage.stories.tsx",
          "storyTitle": "AI/AssistantMessage",
          "description": "The message and its content are not interactive, but `data-analytics-*` still lands on\ntheir real nodes; put click analytics on each `MessageAction` instead."
        },
        {
          "name": "Markdown",
          "code": "import { AssistantMessage, AssistantMessageContent, AssistantMessageMarkdown } from '@wallarm-org/design-system/AssistantMessage';\nimport { CodeSnippetAdapterProvider, loadPrismAdapter } from '@wallarm-org/design-system/CodeSnippet';\nimport { WALLY_ANSWER } from './mocks';\n\nexport const Markdown = () => (\n  <CodeSnippetAdapterProvider adapter={loadPrismAdapter}>\n    <AssistantMessage data-testid='markdown'>\n      <AssistantMessageContent>\n        <AssistantMessageMarkdown text={WALLY_ANSWER} />\n      </AssistantMessageContent>\n    </AssistantMessage>\n  </CodeSnippetAdapterProvider>\n);",
          "storyFile": "AssistantMessage/AssistantMessage.stories.tsx",
          "storyTitle": "AI/AssistantMessage",
          "description": "`AssistantMessageMarkdown` inside `AssistantMessageContent`: every GFM element in the DS look —\nheading, bold/italic/strike, inline code (click to copy), an aligned table, nested lists, a task\nlist, a fenced block with a copy button, a quote, a rule and links. Highlighting follows the\napp's `CodeSnippetAdapterProvider` (WallyAssistant mounts the lazy Prism one itself)."
        },
        {
          "name": "MarkdownStreaming",
          "code": "import { useEffect, useState } from 'react';\nimport { AssistantMessage, AssistantMessageContent, AssistantMessageMarkdown } from '@wallarm-org/design-system/AssistantMessage';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { CodeSnippetAdapterProvider, loadPrismAdapter } from '@wallarm-org/design-system/CodeSnippet';\nimport { RefreshCcw } from '@wallarm-org/design-system/icons';\nimport { WALLY_ANSWER } from './mocks';\n\nexport const MarkdownStreaming = () => {\n  const [length, setLength] = useState(0);\n  const streaming = length < WALLY_ANSWER.length;\n\n  useEffect(() => {\n    if (length >= WALLY_ANSWER.length) return;\n    const id = setTimeout(() => setLength(Math.min(length + 6, WALLY_ANSWER.length)), 40);\n    return () => clearTimeout(id);\n  }, [length]);\n\n  const handleClick = () => {\n    setLength(0);\n  };\n\n  return (\n    <div className='flex flex-col items-start gap-16'>\n      <CodeSnippetAdapterProvider adapter={loadPrismAdapter}>\n        <AssistantMessage data-testid='markdown-streaming' aria-busy={streaming}>\n          <AssistantMessageContent>\n            <AssistantMessageMarkdown text={WALLY_ANSWER.slice(0, length)} streaming={streaming} />\n          </AssistantMessageContent>\n        </AssistantMessage>\n      </CodeSnippetAdapterProvider>\n      <Button\n        variant='outline'\n        color='neutral'\n        size='small'\n        disabled={streaming}\n        data-testid='markdown-streaming--replay'\n        onClick={handleClick}\n      >\n        <RefreshCcw />\n        Replay\n      </Button>\n    </div>\n  );\n};",
          "storyFile": "AssistantMessage/AssistantMessage.stories.tsx",
          "storyTitle": "AI/AssistantMessage",
          "description": "Pass the whole text so far (a snapshot, never a delta) with `streaming`: only the unfinished\ntail is repaired, a dangling `**`, a half-typed table header and an empty fence wait a frame,\nand an open fence stays plain without a copy button until it closes. Finished blocks never\nre-render. Here a timer grows the string; press Replay to stream it again."
        },
        {
          "name": "MarkdownInChainOfThought",
          "code": "import { AssistantMessage, AssistantMessageMarkdown } from '@wallarm-org/design-system/AssistantMessage';\nimport { ChainOfThought, ChainOfThoughtStep } from '@wallarm-org/design-system/ChainOfThought';\nimport { Brain } from '@wallarm-org/design-system/icons';\nimport { COT_TEXT } from './mocks';\n\nexport const MarkdownInChainOfThought = () => (\n  <AssistantMessage data-testid='cot-markdown'>\n    <ChainOfThought>\n      <ChainOfThoughtStep label='Thought for 5s' icon={<Brain />} defaultOpen>\n        <AssistantMessageMarkdown variant='chain-of-thought' text={COT_TEXT} />\n      </ChainOfThoughtStep>\n    </ChainOfThought>\n  </AssistantMessage>\n);",
          "storyFile": "AssistantMessage/AssistantMessage.stories.tsx",
          "storyTitle": "AI/AssistantMessage",
          "description": "`variant='chain-of-thought'` for reasoning inside a `ChainOfThoughtStep` (Figma 494:4292): the\nstep body sets the 12/16 muted text, inline code is muted and not copyable, links are 12px."
        },
        {
          "name": "MarkdownUnsafeContent",
          "code": "import { AssistantMessage, AssistantMessageContent, AssistantMessageMarkdown } from '@wallarm-org/design-system/AssistantMessage';\nimport { HOSTILE } from './mocks';\n\nexport const MarkdownUnsafeContent = () => (\n  <AssistantMessage data-testid='unsafe-markdown'>\n    <AssistantMessageContent>\n      <AssistantMessageMarkdown text={HOSTILE} />\n    </AssistantMessageContent>\n  </AssistantMessage>\n);",
          "storyFile": "AssistantMessage/AssistantMessage.stories.tsx",
          "storyTitle": "AI/AssistantMessage",
          "description": "Assistant text is untrusted (prompt injection). Raw HTML shows as typed (only `<br>` breaks a\nline), `javascript:`/`data:`/`vbscript:`/`file:` links render as plain text, and images show\nonly their alt text, so no tracking pixel loads."
        },
        {
          "name": "MarkdownCustomElements",
          "code": "import { AssistantMessage, AssistantMessageContent, AssistantMessageMarkdown } from '@wallarm-org/design-system/AssistantMessage';\n\nexport const MarkdownCustomElements = () => (\n  <AssistantMessage data-testid='custom-markdown'>\n    <AssistantMessageContent>\n      <AssistantMessageMarkdown\n        components={MARKDOWN_COMPONENTS}\n        text={\n          'Read the [rule guide](https://docs.wallarm.com/user-guides/rules/) first.\\n\\n![Wallarm logo](./favicon.svg)\\n\\n![tracker](https://evil.example/p.gif)'\n        }\n      />\n    </AssistantMessageContent>\n  </AssistantMessage>\n);",
          "storyFile": "AssistantMessage/AssistantMessage.stories.tsx",
          "storyTitle": "AI/AssistantMessage",
          "description": "`components` overrides any element at module scope; wrap the exported parts\n(`AssistantMessageMarkdownLink`, `…InlineCode`, `…CodeBlock`, `…Table`) to add analytics\nattributes to the real nodes. Here every link gets a `data-analytics-id`, and images render\nonly from the app's own origin — the app owns that decision."
        }
      ]
    },
    {
      "name": "Attribute",
      "description": "Pairs one field's label with its value on a detail page — reach for `Table` when the same fields repeat across many objects, and `Field` when the value is being collected rather than read. The value slot takes whichever display component fits the data and hosts `InlineEdit` when the field is editable in place, while `AttributeActions` hangs a per-value menu off it.",
      "importPath": "@wallarm-org/design-system/Attribute",
      "props": [
        {
          "name": "loading",
          "type": "boolean | undefined",
          "required": false,
          "description": "Show skeleton placeholders instead of children",
          "defaultValue": "false"
        },
        {
          "name": "isEmpty",
          "type": "boolean | undefined",
          "required": false,
          "description": "When true, `AttributeValue` renders the em-dash placeholder instead of its\nchildren, and any `AttributeEmptyDescription` inside the tree renders\n(it returns `null` otherwise). Ignored while `loading` is true (skeleton\nwins).",
          "defaultValue": "false"
        },
        {
          "name": "orientation",
          "type": "AttributeOrientation | undefined",
          "required": false,
          "description": "Layout direction of the label and value.\n- `vertical` (default): label above value\n- `horizontal`: label on the left, value on the right",
          "defaultValue": "vertical"
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [
        {
          "name": "AttributeActions",
          "props": [
            {
              "name": "open",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultOpen",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "onOpenChange",
              "type": "((open: boolean) => void) | undefined",
              "required": false
            },
            {
              "name": "modal",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "anchorPoint",
              "type": "{ x: number; y: number; } | undefined",
              "required": false,
              "description": "Virtual anchor point for positioning without a trigger element"
            },
            {
              "name": "positioning",
              "type": "PositioningOptions | undefined",
              "required": false,
              "description": "Override default positioning config"
            },
            {
              "name": "highlightedValue",
              "type": "string | null | undefined",
              "required": false,
              "description": "Programmatically control which item is highlighted"
            },
            {
              "name": "onHighlightChange",
              "type": "((details: HighlightChangeDetails) => void) | undefined",
              "required": false,
              "description": "Callback when the highlighted item changes (e.g. on mouse hover)"
            },
            {
              "name": "closeOnSelect",
              "type": "boolean | undefined",
              "required": false,
              "description": "Whether selecting an item closes the menu (default true)"
            },
            {
              "name": "onRequestDismiss",
              "type": "((event: LayerDismissEvent) => void) | undefined",
              "required": false,
              "description": "Called when another layer asks this menu to dismiss — e.g. a layer below it in the stack is\nremoved. Call `event.preventDefault()` to keep the menu open."
            },
            {
              "name": "ids",
              "type": "ElementIds | undefined",
              "required": false,
              "description": "Override the trigger element's id. Pass the same id to another\ncompound component's `ids.trigger` (e.g. `Tooltip`, `Popover`) to\ncompose their triggers on one element via nested `asChild` without an\nextra wrapper node — otherwise the outer trigger's id wins and the\nother component can't find its own anchor."
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "AttributeActionsContent",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "AttributeActionsItem",
          "props": [
            {
              "name": "inset",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "onSelect",
              "type": "(() => void) | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | undefined",
              "required": false,
              "description": "Explicit value for programmatic highlighting via highlightedValue"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "variant",
              "type": "{ default: string; brand: string; destructive: string; }",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "AttributeActionsTarget",
          "props": [
            {
              "name": "disableNestedInteractive",
              "type": "boolean | undefined",
              "required": false,
              "description": "When true, descendants are rendered `inert` — they cannot be clicked,\nfocused, or read by assistive tech as actionable. Any interaction with the\ntarget (mouse or keyboard) opens the AttributeActions dropdown.\n\nDefault `false` — descendants keep their own behavior; clicking them does\nnot open the dropdown. The dropdown opens only when the surrounding target\narea is clicked.",
              "defaultValue": "false"
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "AttributeEmptyDescription",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "AttributeLabel",
          "props": [
            {
              "name": "width",
              "type": "number | undefined",
              "required": false,
              "description": "Width of the label cell in horizontal orientation, in pixels.\nDefaults to MIN_LABEL_WIDTH. Clamped to [MIN_LABEL_WIDTH, MAX_LABEL_WIDTH].\nIgnored in vertical orientation.",
              "defaultValue": "MIN_LABEL_WIDTH"
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "AttributeLabelDescription",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "AttributeLabelInfo",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "AttributeValue",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Default",
          "code": "import { Attribute, AttributeLabel, AttributeValue } from '@wallarm-org/design-system/Attribute';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const Default = () => (\n  <div className='w-[400px]'>\n    <Attribute>\n      <AttributeLabel>Request ID</AttributeLabel>\n      <AttributeValue>\n        <Text size='sm'>abc-123-def-456</Text>\n      </AttributeValue>\n    </Attribute>\n  </div>\n);",
          "storyFile": "Attribute/Attribute.stories.tsx",
          "storyTitle": "Data Display/Attribute",
          "description": "The smallest pair — `AttributeLabel` over `AttributeValue` — with the label in\nsentence case and the value left to whichever component formats that data."
        },
        {
          "name": "WithDescription",
          "code": "import { Attribute, AttributeLabel, AttributeLabelDescription, AttributeValue } from '@wallarm-org/design-system/Attribute';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const WithDescription = () => (\n  <div className='w-[400px]'>\n    <Attribute>\n      <AttributeLabel>\n        Created at\n        <AttributeLabelDescription>\n          The time when the request was first received\n        </AttributeLabelDescription>\n      </AttributeLabel>\n      <AttributeValue>\n        <Text size='sm'>April 9, 2026, 14:32</Text>\n      </AttributeValue>\n    </Attribute>\n  </div>\n);",
          "storyFile": "Attribute/Attribute.stories.tsx",
          "storyTitle": "Data Display/Attribute",
          "description": "`AttributeLabelDescription` adds a line that stays under the label, for a field\nwhose name does not explain itself."
        },
        {
          "name": "WithInfo",
          "code": "import { Attribute, AttributeLabel, AttributeLabelInfo, AttributeValue } from '@wallarm-org/design-system/Attribute';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const WithInfo = () => (\n  <div className='w-[400px] flex flex-col gap-16'>\n    <Attribute>\n      <AttributeLabel>\n        Request ID\n        <AttributeLabelInfo>Unique identifier assigned to each incoming request</AttributeLabelInfo>\n      </AttributeLabel>\n      <AttributeValue>\n        <Text size='sm'>abc-123-def-456</Text>\n      </AttributeValue>\n    </Attribute>\n\n    <Attribute>\n      <AttributeLabel>\n        <AttributeLabelInfo>Unique identifier assigned to each incoming request</AttributeLabelInfo>\n        Request ID\n      </AttributeLabel>\n      <AttributeValue>\n        <Text size='sm'>abc-123-def-456</Text>\n      </AttributeValue>\n    </Attribute>\n  </div>\n);",
          "storyFile": "Attribute/Attribute.stories.tsx",
          "storyTitle": "Data Display/Attribute",
          "description": "`AttributeLabelInfo` puts the same explanation behind a hover tooltip instead,\nand reads correctly on either side of the label text."
        },
        {
          "name": "WithLink",
          "code": "import { Attribute, AttributeLabel, AttributeValue } from '@wallarm-org/design-system/Attribute';\nimport { Link } from '@wallarm-org/design-system/Link';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const WithLink = () => (\n  <div className='w-[400px]'>\n    <Attribute>\n      <AttributeLabel>\n        Source\n        <Link href='#' size='md'>\n          View docs\n        </Link>\n      </AttributeLabel>\n      <AttributeValue>\n        <Text size='sm'>API Gateway</Text>\n      </AttributeValue>\n    </Attribute>\n  </div>\n);",
          "storyFile": "Attribute/Attribute.stories.tsx",
          "storyTitle": "Data Display/Attribute",
          "description": "The label row takes inline content of its own, here a `Link` out to whatever\nexplains the field — the value slot stays reserved for the data."
        },
        {
          "name": "Empty",
          "code": "import { Attribute, AttributeEmptyDescription, AttributeLabel, AttributeLabelDescription, AttributeValue } from '@wallarm-org/design-system/Attribute';\nimport { Link } from '@wallarm-org/design-system/Link';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const Empty = () => (\n  <div className='w-[400px] flex flex-col gap-16'>\n    <Attribute>\n      <AttributeLabel>\n        Region\n        <AttributeLabelDescription>Manual composition</AttributeLabelDescription>\n      </AttributeLabel>\n      <AttributeValue />\n    </Attribute>\n\n    <Attribute isEmpty>\n      <AttributeLabel>Region</AttributeLabel>\n      <AttributeValue>\n        <Text size='sm'>This text is replaced by the em-dash placeholder</Text>\n      </AttributeValue>\n    </Attribute>\n\n    <Attribute isEmpty>\n      <AttributeLabel>\n        Owner\n        <AttributeEmptyDescription>Not yet assigned</AttributeEmptyDescription>\n      </AttributeLabel>\n      <AttributeValue />\n    </Attribute>\n\n    <Attribute isEmpty>\n      <AttributeLabel>\n        SSO provider\n        <AttributeEmptyDescription>\n          Not connected —{' '}\n          <Link href='#' size='md'>\n            set up integration\n          </Link>\n        </AttributeEmptyDescription>\n      </AttributeLabel>\n      <AttributeValue />\n    </Attribute>\n  </div>\n);",
          "storyFile": "Attribute/Attribute.stories.tsx",
          "storyTitle": "Data Display/Attribute",
          "description": "Four ways a missing value can read: composed by hand, `isEmpty` on its own —\nwhich swaps the value for an em dash and ignores whatever children it had — and\n`isEmpty` alongside an `AttributeEmptyDescription`, which appears only in that\nstate and can carry the link out to the fix."
        },
        {
          "name": "Loading",
          "code": "import { Attribute, AttributeLabel, AttributeValue } from '@wallarm-org/design-system/Attribute';\n\nexport const Loading = () => (\n  <div className='w-[400px] flex flex-col gap-16'>\n    <Attribute loading>\n      <AttributeLabel>Created at</AttributeLabel>\n      <AttributeValue />\n    </Attribute>\n    <Attribute loading>\n      <AttributeLabel>Status</AttributeLabel>\n      <AttributeValue />\n    </Attribute>\n  </div>\n);",
          "storyFile": "Attribute/Attribute.stories.tsx",
          "storyTitle": "Data Display/Attribute",
          "description": "`loading` skeletons both slots and ignores the children, so a panel can be laid\nout before its data lands; it wins over `isEmpty`."
        },
        {
          "name": "Composition",
          "code": "import { Attribute, AttributeLabel, AttributeValue } from '@wallarm-org/design-system/Attribute';\nimport { Badge } from '@wallarm-org/design-system/Badge';\nimport { Code } from '@wallarm-org/design-system/Code';\nimport { InlineCodeSnippet } from '@wallarm-org/design-system/CodeSnippet';\nimport { FormatDateTime } from '@wallarm-org/design-system/FormatDateTime';\nimport { Ip, IpAddress, IpCountry, IpList, IpProvider } from '@wallarm-org/design-system/Ip';\nimport { Link } from '@wallarm-org/design-system/Link';\nimport { OverflowList } from '@wallarm-org/design-system/OverflowList';\nimport { Tag } from '@wallarm-org/design-system/Tag';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const Composition = () => (\n  <div className='grid grid-cols-2 gap-x-8 gap-y-16 w-[874px]'>\n    <Attribute>\n      <AttributeLabel>Status</AttributeLabel>\n      <AttributeValue>\n        <Badge color='red' variant='dotted'>\n          Blocked\n        </Badge>\n      </AttributeValue>\n    </Attribute>\n\n    <Attribute>\n      <AttributeLabel>First seen</AttributeLabel>\n      <AttributeValue>\n        <FormatDateTime value='2026-04-03T10:15:00Z' format='relative' />\n      </AttributeValue>\n    </Attribute>\n\n    <Attribute>\n      <AttributeLabel>Attack type</AttributeLabel>\n      <AttributeValue>\n        <OverflowList\n          className='gap-4'\n          items={['XSS', 'BOLA', 'SQL Injection', 'Scanner', 'CSRF', 'XXE', 'RCE', 'LFI', 'IDOR']}\n          itemRenderer={item => <Tag key={item}>{item}</Tag>}\n        />\n      </AttributeValue>\n    </Attribute>\n\n    <Attribute>\n      <AttributeLabel>Sessions</AttributeLabel>\n      <AttributeValue>\n        <Text size='sm'>3 sessions</Text>\n      </AttributeValue>\n    </Attribute>\n\n    <Attribute>\n      <AttributeLabel>Users</AttributeLabel>\n      <AttributeValue>\n        <OverflowList\n          className='gap-4'\n          items={[\n            'artem@acme.com',\n            'uxd@acme.com',\n            'ops@acme.com',\n            'security@acme.com',\n            'admin@acme.com',\n          ]}\n          itemRenderer={item => <Tag key={item}>{item}</Tag>}\n        />\n      </AttributeValue>\n    </Attribute>\n\n    <Attribute>\n      <AttributeLabel>IPs</AttributeLabel>\n      <AttributeValue>\n        <IpList>\n          <Ip>\n            <IpCountry code='US' />\n            <IpAddress>142.198.167.52</IpAddress>\n            <IpProvider>Azure</IpProvider>\n          </Ip>\n          <Ip>\n            <IpCountry code='US' />\n            <IpAddress>34.74.73.20</IpAddress>\n            <IpProvider>AWS</IpProvider>\n          </Ip>\n          <Ip>\n            <IpCountry code='DE' />\n            <IpAddress>34.74.73.20</IpAddress>\n            <IpProvider>GCP</IpProvider>\n          </Ip>\n          <Ip>\n            <IpCountry code='NL' />\n            <IpAddress>10.0.0.1</IpAddress>\n          </Ip>\n          <Ip>\n            <IpCountry code='JP' />\n            <IpAddress>192.168.1.1</IpAddress>\n          </Ip>\n        </IpList>\n      </AttributeValue>\n    </Attribute>\n\n    <Attribute>\n      <AttributeLabel>Source IP</AttributeLabel>\n      <AttributeValue>\n        <Ip>\n          <IpCountry code='US' />\n          <IpAddress>142.198.167.52</IpAddress>\n          <IpProvider>Azure</IpProvider>\n        </Ip>\n      </AttributeValue>\n    </Attribute>\n\n    <Attribute>\n      <AttributeLabel>Created at</AttributeLabel>\n      <AttributeValue>\n        <FormatDateTime value='2026-04-02T14:03:00Z' format='datetime' />\n      </AttributeValue>\n    </Attribute>\n\n    <Attribute>\n      <AttributeLabel>Documentation</AttributeLabel>\n      <AttributeValue>\n        <Link href='#' size='md'>\n          View full report\n        </Link>\n      </AttributeValue>\n    </Attribute>\n\n    <Attribute>\n      <AttributeLabel>Payload (inline)</AttributeLabel>\n      <AttributeValue>\n        <InlineCodeSnippet code='{ \"action\": \"login\", \"user_id\": 42 }' size='sm' />\n      </AttributeValue>\n    </Attribute>\n\n    <Attribute>\n      <AttributeLabel>Payload (code)</AttributeLabel>\n      <AttributeValue>\n        <Code size='s'>{'{ \"action\": \"login\", \"user_id\": 42 }'}</Code>\n      </AttributeValue>\n    </Attribute>\n  </div>\n);",
          "storyFile": "Attribute/Attribute.stories.tsx",
          "storyTitle": "Data Display/Attribute",
          "description": "The display components sanctioned inside a value — `Badge`, `FormatDateTime`,\n`OverflowList` of `Tag`s, `Ip` and `IpList`, `Link`, `InlineCodeSnippet`, `Code` —\neach formatting the data itself rather than receiving a pre-built string."
        },
        {
          "name": "WithActions",
          "code": "import { Attribute, AttributeActions, AttributeActionsTarget, AttributeLabel, AttributeValue } from '@wallarm-org/design-system/Attribute';\nimport { Badge } from '@wallarm-org/design-system/Badge';\nimport { Code } from '@wallarm-org/design-system/Code';\nimport { InlineCodeSnippet } from '@wallarm-org/design-system/CodeSnippet';\nimport { FormatDateTime } from '@wallarm-org/design-system/FormatDateTime';\nimport { Ip, IpAddress, IpCountry, IpList, IpProvider } from '@wallarm-org/design-system/Ip';\nimport { Link } from '@wallarm-org/design-system/Link';\nimport { OverflowList } from '@wallarm-org/design-system/OverflowList';\nimport { Tag } from '@wallarm-org/design-system/Tag';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const WithActions = () => (\n  <div className='grid grid-cols-2 gap-x-8 gap-y-16 w-[874px]'>\n    <Attribute>\n      <AttributeLabel>Status</AttributeLabel>\n      <AttributeValue>\n        <AttributeActions data-testid='attribute-with-actions'>\n          <AttributeActionsTarget>\n            <Badge color='red' variant='dotted'>\n              Blocked\n            </Badge>\n          </AttributeActionsTarget>\n          {renderActionsItems()}\n        </AttributeActions>\n      </AttributeValue>\n    </Attribute>\n\n    <Attribute>\n      <AttributeLabel>First seen</AttributeLabel>\n      <AttributeValue>\n        <AttributeActions>\n          <AttributeActionsTarget>\n            <FormatDateTime value='2026-04-03T10:15:00Z' format='relative' />\n          </AttributeActionsTarget>\n          {renderActionsItems()}\n        </AttributeActions>\n      </AttributeValue>\n    </Attribute>\n\n    <Attribute>\n      <AttributeLabel>Attack type</AttributeLabel>\n      <AttributeValue>\n        <AttributeActions>\n          <AttributeActionsTarget>\n            <OverflowList\n              className='gap-4'\n              items={[\n                'XSS',\n                'BOLA',\n                'SQL Injection',\n                'Scanner',\n                'CSRF',\n                'XXE',\n                'RCE',\n                'LFI',\n                'IDOR',\n              ]}\n              itemRenderer={item => <Tag key={item}>{item}</Tag>}\n            />\n          </AttributeActionsTarget>\n          {renderActionsItems()}\n        </AttributeActions>\n      </AttributeValue>\n    </Attribute>\n\n    <Attribute>\n      <AttributeLabel>Sessions</AttributeLabel>\n      <AttributeValue>\n        <AttributeActions>\n          <AttributeActionsTarget>\n            <Text size='sm'>3 sessions</Text>\n          </AttributeActionsTarget>\n          {renderActionsItems()}\n        </AttributeActions>\n      </AttributeValue>\n    </Attribute>\n\n    <Attribute>\n      <AttributeLabel>Users</AttributeLabel>\n      <AttributeValue>\n        <AttributeActions>\n          <AttributeActionsTarget>\n            <OverflowList\n              className='gap-4'\n              items={[\n                'artem@acme.com',\n                'uxd@acme.com',\n                'ops@acme.com',\n                'security@acme.com',\n                'admin@acme.com',\n              ]}\n              itemRenderer={item => <Tag key={item}>{item}</Tag>}\n            />\n          </AttributeActionsTarget>\n          {renderActionsItems()}\n        </AttributeActions>\n      </AttributeValue>\n    </Attribute>\n\n    <Attribute>\n      <AttributeLabel>IPs</AttributeLabel>\n      <AttributeValue>\n        <AttributeActions>\n          <AttributeActionsTarget>\n            <IpList>\n              <Ip>\n                <IpCountry code='US' />\n                <IpAddress>142.198.167.52</IpAddress>\n                <IpProvider>Azure</IpProvider>\n              </Ip>\n              <Ip>\n                <IpCountry code='US' />\n                <IpAddress>34.74.73.20</IpAddress>\n                <IpProvider>AWS</IpProvider>\n              </Ip>\n              <Ip>\n                <IpCountry code='DE' />\n                <IpAddress>34.74.73.20</IpAddress>\n                <IpProvider>GCP</IpProvider>\n              </Ip>\n              <Ip>\n                <IpCountry code='NL' />\n                <IpAddress>10.0.0.1</IpAddress>\n              </Ip>\n              <Ip>\n                <IpCountry code='JP' />\n                <IpAddress>192.168.1.1</IpAddress>\n              </Ip>\n            </IpList>\n          </AttributeActionsTarget>\n          {renderActionsItems()}\n        </AttributeActions>\n      </AttributeValue>\n    </Attribute>\n\n    <Attribute>\n      <AttributeLabel>Source IP</AttributeLabel>\n      <AttributeValue>\n        <AttributeActions>\n          <AttributeActionsTarget>\n            <Ip>\n              <IpCountry code='US' />\n              <IpAddress>142.198.167.52</IpAddress>\n              <IpProvider>Azure</IpProvider>\n            </Ip>\n          </AttributeActionsTarget>\n          {renderActionsItems()}\n        </AttributeActions>\n      </AttributeValue>\n    </Attribute>\n\n    <Attribute>\n      <AttributeLabel>Created at</AttributeLabel>\n      <AttributeValue>\n        <AttributeActions>\n          <AttributeActionsTarget>\n            <FormatDateTime value='2026-04-02T14:03:00Z' format='datetime' />\n          </AttributeActionsTarget>\n          {renderActionsItems()}\n        </AttributeActions>\n      </AttributeValue>\n    </Attribute>\n\n    <Attribute>\n      <AttributeLabel>Documentation</AttributeLabel>\n      <AttributeValue>\n        <AttributeActions>\n          <AttributeActionsTarget>\n            <Link href='#' size='md'>\n              View full report\n            </Link>\n          </AttributeActionsTarget>\n          {renderActionsItems()}\n        </AttributeActions>\n      </AttributeValue>\n    </Attribute>\n\n    <Attribute>\n      <AttributeLabel>Payload (inline)</AttributeLabel>\n      <AttributeValue>\n        <AttributeActions>\n          <AttributeActionsTarget>\n            <InlineCodeSnippet code='{ \"action\": \"login\", \"user_id\": 42 }' size='sm' />\n          </AttributeActionsTarget>\n          {renderActionsItems()}\n        </AttributeActions>\n      </AttributeValue>\n    </Attribute>\n\n    <Attribute>\n      <AttributeLabel>Payload (code)</AttributeLabel>\n      <AttributeValue>\n        <AttributeActions>\n          <AttributeActionsTarget>\n            <Code size='s'>{'{ \"action\": \"login\", \"user_id\": 42 }'}</Code>\n          </AttributeActionsTarget>\n          {renderActionsItems()}\n        </AttributeActions>\n      </AttributeValue>\n    </Attribute>\n  </div>\n);",
          "storyFile": "Attribute/Attribute.stories.tsx",
          "storyTitle": "Data Display/Attribute",
          "description": "`AttributeActions` turns the value into a `DropdownMenu` trigger: the row picks up\na hover surface and the menu carries the actions that belong to that one value."
        },
        {
          "name": "Horizontal",
          "code": "import { Attribute, AttributeLabel, AttributeValue } from '@wallarm-org/design-system/Attribute';\nimport { Badge } from '@wallarm-org/design-system/Badge';\n\nexport const Horizontal = () => (\n  <div className='w-[400px]'>\n    <Attribute orientation='horizontal'>\n      <AttributeLabel>Status</AttributeLabel>\n      <AttributeValue>\n        <Badge color='red' variant='dotted'>\n          Blocked\n        </Badge>\n      </AttributeValue>\n    </Attribute>\n  </div>\n);",
          "storyFile": "Attribute/Attribute.stories.tsx",
          "storyTitle": "Data Display/Attribute",
          "description": "`orientation='horizontal'` sets the label beside the value in a cell clamped\nbetween 100 and 256px, so values line up down a panel."
        },
        {
          "name": "HorizontalTruncation",
          "code": "import { Attribute, AttributeLabel, AttributeValue } from '@wallarm-org/design-system/Attribute';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const HorizontalTruncation = () => (\n  <div className='w-[500px] flex flex-col gap-8'>\n    <Attribute orientation='horizontal'>\n      <AttributeLabel width={256}>Short</AttributeLabel>\n      <AttributeValue>\n        <Text size='sm'>Fits in 256px label cell</Text>\n      </AttributeValue>\n    </Attribute>\n    <Attribute orientation='horizontal'>\n      <AttributeLabel width={256}>\n        This label text is much longer than 256 pixels and must be truncated\n      </AttributeLabel>\n      <AttributeValue>\n        <Text size='sm'>Value</Text>\n      </AttributeValue>\n    </Attribute>\n    <Attribute orientation='horizontal'>\n      <AttributeLabel>Users</AttributeLabel>\n      <AttributeValue>\n        <Text size='sm' truncate>\n          artem@acme.com, uxd@acme.com, ops@acme.com, security@acme.com, admin@acme.com\n        </Text>\n      </AttributeValue>\n    </Attribute>\n  </div>\n);",
          "storyFile": "Attribute/Attribute.stories.tsx",
          "storyTitle": "Data Display/Attribute",
          "description": "Horizontal cells clip with an ellipsis rather than wrapping — the label at its set\nwidth, 100px unless you widen it, and the value once its own content overruns."
        },
        {
          "name": "HorizontalComposition",
          "code": "import { Attribute, AttributeLabel, AttributeValue } from '@wallarm-org/design-system/Attribute';\nimport { Badge } from '@wallarm-org/design-system/Badge';\nimport { FormatDateTime } from '@wallarm-org/design-system/FormatDateTime';\nimport { Ip, IpAddress, IpCountry, IpList, IpProvider } from '@wallarm-org/design-system/Ip';\nimport { OverflowList } from '@wallarm-org/design-system/OverflowList';\nimport { Tag } from '@wallarm-org/design-system/Tag';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const HorizontalComposition = () => (\n  <div className='grid grid-cols-2 gap-x-8 gap-y-6 w-[874px]'>\n    <Attribute orientation='horizontal'>\n      <AttributeLabel>Status</AttributeLabel>\n      <AttributeValue>\n        <Badge color='red' variant='dotted'>\n          Blocked\n        </Badge>\n      </AttributeValue>\n    </Attribute>\n\n    <Attribute orientation='horizontal'>\n      <AttributeLabel>First seen</AttributeLabel>\n      <AttributeValue>\n        <FormatDateTime value='2026-04-03T10:15:00Z' format='relative' />\n      </AttributeValue>\n    </Attribute>\n\n    <Attribute orientation='horizontal'>\n      <AttributeLabel>Attack type</AttributeLabel>\n      <AttributeValue>\n        <OverflowList\n          className='gap-4'\n          items={['XSS', 'BOLA', 'SQL Injection', 'Scanner', 'CSRF', 'XXE', 'RCE', 'LFI', 'IDOR']}\n          itemRenderer={item => <Tag key={item}>{item}</Tag>}\n        />\n      </AttributeValue>\n    </Attribute>\n\n    <Attribute orientation='horizontal'>\n      <AttributeLabel>Last seen</AttributeLabel>\n      <AttributeValue>\n        <FormatDateTime value='2025-04-02T14:03:00Z' format='date' />\n      </AttributeValue>\n    </Attribute>\n\n    <Attribute orientation='horizontal'>\n      <AttributeLabel>Sessions</AttributeLabel>\n      <AttributeValue>\n        <Text size='sm'>3 sessions</Text>\n      </AttributeValue>\n    </Attribute>\n\n    <Attribute orientation='horizontal'>\n      <AttributeLabel>Users</AttributeLabel>\n      <AttributeValue>\n        <OverflowList\n          className='gap-4'\n          items={[\n            'artem@acme.com',\n            'uxd@acme.com',\n            'ops@acme.com',\n            'security@acme.com',\n            'admin@acme.com',\n          ]}\n          itemRenderer={item => <Tag key={item}>{item}</Tag>}\n        />\n      </AttributeValue>\n    </Attribute>\n\n    <div className='col-span-2'>\n      <Attribute orientation='horizontal'>\n        <AttributeLabel>IPs</AttributeLabel>\n        <AttributeValue>\n          <IpList type='horizontal'>\n            <Ip>\n              <IpCountry code='US' />\n              <IpAddress>142.198.167.52</IpAddress>\n              <IpProvider>Azure</IpProvider>\n            </Ip>\n            <Ip>\n              <IpCountry code='US' />\n              <IpAddress>34.74.73.20</IpAddress>\n              <IpProvider>AWS</IpProvider>\n            </Ip>\n            <Ip>\n              <IpCountry code='DE' />\n              <IpAddress>34.74.73.20</IpAddress>\n              <IpProvider>GCP</IpProvider>\n            </Ip>\n          </IpList>\n        </AttributeValue>\n      </Attribute>\n    </div>\n  </div>\n);",
          "storyFile": "Attribute/Attribute.stories.tsx",
          "storyTitle": "Data Display/Attribute",
          "description": "The same value components in the horizontal layout, where a wide one such as\n`IpList type='horizontal'` needs its row to span both columns."
        },
        {
          "name": "HorizontalLoading",
          "code": "import { Attribute, AttributeLabel, AttributeValue } from '@wallarm-org/design-system/Attribute';\n\nexport const HorizontalLoading = () => (\n  <div className='w-[400px] flex flex-col gap-8'>\n    <Attribute orientation='horizontal' loading>\n      <AttributeLabel>Created at</AttributeLabel>\n      <AttributeValue />\n    </Attribute>\n    <Attribute orientation='horizontal' loading>\n      <AttributeLabel>Status</AttributeLabel>\n      <AttributeValue />\n    </Attribute>\n  </div>\n);",
          "storyFile": "Attribute/Attribute.stories.tsx",
          "storyTitle": "Data Display/Attribute",
          "description": "The horizontal skeleton is a 16px line against the vertical 24px, matching the\nsingle-line row it stands in for."
        },
        {
          "name": "HorizontalEmpty",
          "code": "import { Attribute, AttributeEmptyDescription, AttributeLabel, AttributeLabelDescription, AttributeValue } from '@wallarm-org/design-system/Attribute';\nimport { Link } from '@wallarm-org/design-system/Link';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const HorizontalEmpty = () => (\n  <div className='w-[400px] flex flex-col gap-8'>\n    <Attribute orientation='horizontal'>\n      <AttributeLabel width={160}>\n        Region\n        <AttributeLabelDescription>Manual composition</AttributeLabelDescription>\n      </AttributeLabel>\n      <AttributeValue />\n    </Attribute>\n\n    <Attribute orientation='horizontal' isEmpty>\n      <AttributeLabel width={160}>Region</AttributeLabel>\n      <AttributeValue>\n        <Text size='sm'>This text is replaced by the em-dash placeholder</Text>\n      </AttributeValue>\n    </Attribute>\n\n    <Attribute orientation='horizontal' isEmpty>\n      <AttributeLabel width={160}>\n        Owner\n        <AttributeEmptyDescription>Not yet assigned</AttributeEmptyDescription>\n      </AttributeLabel>\n      <AttributeValue />\n    </Attribute>\n\n    <Attribute orientation='horizontal' isEmpty>\n      <AttributeLabel width={160}>\n        SSO provider\n        <AttributeEmptyDescription>\n          Not connected —{' '}\n          <Link href='#' size='md'>\n            set up integration\n          </Link>\n        </AttributeEmptyDescription>\n      </AttributeLabel>\n      <AttributeValue />\n    </Attribute>\n  </div>\n);",
          "storyFile": "Attribute/Attribute.stories.tsx",
          "storyTitle": "Data Display/Attribute",
          "description": "The same four cases side by side, with `width={160}` on the label so the\ndescriptions have somewhere to sit."
        },
        {
          "name": "HorizontalWithActions",
          "code": "export const HorizontalWithActions = () => (\n  <div className='w-[400px] flex flex-col gap-8'>{renderActionsAttributes(false)}</div>\n);",
          "storyFile": "Attribute/Attribute.stories.tsx",
          "storyTitle": "Data Display/Attribute",
          "description": "By default the value keeps its own interactivity: a link, or a snippet's copy\nbutton, still does its own job, and the menu opens from the space around it."
        },
        {
          "name": "HorizontalWithActionsMenuOnly",
          "code": "export const HorizontalWithActionsMenuOnly = () => (\n  <div className='w-[400px] flex flex-col gap-8'>{renderActionsAttributes(true)}</div>\n);",
          "storyFile": "Attribute/Attribute.stories.tsx",
          "storyTitle": "Data Display/Attribute",
          "description": "`disableNestedInteractive` renders the value inert, so a click anywhere on the row\nopens the menu — for values with nothing worth clicking of their own."
        },
        {
          "name": "WithInlineEdit",
          "code": "export const WithInlineEdit = () => <AttributeInlineEditExample />;",
          "storyFile": "Attribute/Attribute.stories.tsx",
          "storyTitle": "Data Display/Attribute",
          "description": "`Attribute` > `AttributeValue` > `InlineEdit` is the sanctioned nesting for an\neditable field — the value slot supplies the overflow room the editor needs, so\nnever add your own."
        },
        {
          "name": "HorizontalWithInlineEdit",
          "code": "export const HorizontalWithInlineEdit = () => (\n  <AttributeInlineEditExample orientation='horizontal' />\n);",
          "storyFile": "Attribute/Attribute.stories.tsx",
          "storyTitle": "Data Display/Attribute",
          "description": "The same editor in a horizontal row, where it takes the width of the value cell\nrather than the panel."
        },
        {
          "name": "Mixed",
          "code": "export const Mixed = () => <AttributeMixedExample />;",
          "storyFile": "Attribute/Attribute.stories.tsx",
          "storyTitle": "Data Display/Attribute",
          "description": "A plain value, an actions target and an inline editor stacked in one column: the\ntext has to start at the same place in all three, which is what the value slot's\n7px pull is for — it moves the hover box left, not the text."
        },
        {
          "name": "HorizontalMixed",
          "code": "export const HorizontalMixed = () => <AttributeMixedExample orientation='horizontal' />;",
          "storyFile": "Attribute/Attribute.stories.tsx",
          "storyTitle": "Data Display/Attribute",
          "description": "The same three hosts horizontally, where the label cell fixes the start of every\nvalue and the pull has to fit inside the 12px gap between the two cells."
        }
      ]
    },
    {
      "name": "Avatar",
      "description": "A person's photo on a rounded plate, falling back to initials or an icon while it loads, when it fails, or when there is none. It is decorative beside a visible name; standing alone, give it `aria-label` so it reads as an image. Add `AvatarContent` with `AvatarName` (and an optional `AvatarDescription`) for the user item: plate and name in one row. To let people change it, make the avatar the `FileUploadTrigger` (`asChild`) and give it `as='button'` — picking only previews, and your form uploads.",
      "importPath": "@wallarm-org/design-system/Avatar",
      "props": [
        {
          "name": "onStatusChange",
          "type": "((details: StatusChangeDetails) => void) | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "size",
          "type": "{ sm: string; md: string; lg: string; }",
          "required": false,
          "defaultValue": "lg"
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "as",
          "type": "\"span\" | undefined",
          "required": false,
          "description": "Root tag. 'button' makes the avatar itself interactive (e.g. inside FileUploadTrigger asChild)."
        },
        {
          "name": "asChild",
          "type": "false | undefined",
          "required": false,
          "description": "Render the single child element as the root instead of `as`; takes precedence over it.",
          "defaultValue": "false"
        },
        {
          "name": "type",
          "type": "\"button\" | \"submit\" | \"reset\" | undefined",
          "required": false
        },
        {
          "name": "disabled",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "name",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "value",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "size",
          "options": [
            "sm",
            "md",
            "lg"
          ],
          "defaultValue": "lg"
        },
        {
          "name": "initials",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        }
      ],
      "subComponents": [
        {
          "name": "AvatarContent",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "AvatarDescription",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "AvatarFallback",
          "props": [
            {
              "name": "name",
              "type": "string | undefined",
              "required": false,
              "description": "Initials are taken from this: first letter of the first and of the last word (first word only at `sm`)."
            },
            {
              "name": "icon",
              "type": "ComponentType<SvgIconProps> | undefined",
              "required": false,
              "description": "Shown when there are no children and `name` gives no initials."
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "AvatarImage",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "alt",
              "type": "string | undefined",
              "required": false,
              "defaultValue": ""
            },
            {
              "name": "height",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "loading",
              "type": "\"eager\" | \"lazy\" | undefined",
              "required": false
            },
            {
              "name": "src",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "width",
              "type": "string | number | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "AvatarName",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "AvatarOverlay",
          "props": [
            {
              "name": "visible",
              "type": "boolean | undefined",
              "required": false,
              "description": "Keep it shown regardless of hover — e.g. a `Loader` while the new photo uploads.",
              "defaultValue": "false"
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Avatar, AvatarFallback, AvatarImage } from '@wallarm-org/design-system/Avatar';\n\nexport const Basic = () => (\n  <Avatar data-testid='avatar'>\n    <AvatarImage src={PHOTO} />\n    <AvatarFallback name='Ada Lovelace' />\n  </Avatar>\n);",
          "storyFile": "Avatar/Avatar.stories.tsx",
          "storyTitle": "Data Display/Avatar",
          "description": "A photo with an initials fallback — the fallback also covers the moment before the photo arrives."
        },
        {
          "name": "Sizes",
          "code": "import { Avatar, AvatarFallback, AvatarImage } from '@wallarm-org/design-system/Avatar';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Sizes = () => (\n  <VStack gap={16} align='start' data-testid='avatar'>\n    {SIZES.map(size => (\n      <HStack key={size} gap={12} align='center' data-testid={`avatar-${size}`}>\n        <Avatar size={size} data-testid={`avatar-${size}-photo`}>\n          <AvatarImage src={PHOTO} />\n          <AvatarFallback name='Ada Lovelace' />\n        </Avatar>\n        <Avatar size={size} data-testid={`avatar-${size}-initials`}>\n          <AvatarFallback name='Ada Lovelace' />\n        </Avatar>\n        <Avatar size={size} data-testid={`avatar-${size}-icon`}>\n          <AvatarFallback />\n        </Avatar>\n        <HStack gap={12} align='center' data-frame-style='branded'>\n          <Avatar size={size} data-testid={`avatar-${size}-branded-photo`}>\n            <AvatarImage src={PHOTO} />\n            <AvatarFallback name='Ada Lovelace' />\n          </Avatar>\n          <Avatar size={size} data-testid={`avatar-${size}-branded-initials`}>\n            <AvatarFallback name='Ada Lovelace' />\n          </Avatar>\n          <Avatar size={size} data-testid={`avatar-${size}-branded-icon`}>\n            <AvatarFallback />\n          </Avatar>\n        </HStack>\n      </HStack>\n    ))}\n  </VStack>\n);",
          "storyFile": "Avatar/Avatar.stories.tsx",
          "storyTitle": "Data Display/Avatar",
          "description": "`sm` (20px) and `md` (24px, the nav-rail plate) are the compact sizes for user items; `lg` (32px,\nthe default) is for rows and forms. Each row shows a photo, initials and the icon, then the same\nthree inside a Branded frame."
        },
        {
          "name": "WithName",
          "code": "import { Avatar, AvatarContent, AvatarFallback, AvatarImage, AvatarName } from '@wallarm-org/design-system/Avatar';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const WithName = () => (\n  <VStack gap={16} align='start' data-testid='avatar'>\n    {(['sm', 'md'] as const).map(size => (\n      <VStack key={size} gap={8} align='start' data-testid={`avatar-${size}`}>\n        <Avatar size={size} data-testid={`avatar-${size}-photo`}>\n          <AvatarImage src={PHOTO} />\n          <AvatarFallback name='Artem Miskevich' />\n          <AvatarContent>\n            <AvatarName>Artem Miskevich</AvatarName>\n          </AvatarContent>\n        </Avatar>\n        <Avatar size={size} data-testid={`avatar-${size}-initials`}>\n          <AvatarFallback name='Artem Miskevich' />\n          <AvatarContent>\n            <AvatarName>Artem Miskevich</AvatarName>\n          </AvatarContent>\n        </Avatar>\n        <div data-frame-style='branded'>\n          <Avatar size={size} data-testid={`avatar-${size}-branded`}>\n            <AvatarFallback name='Artem Miskevich' />\n            <AvatarContent>\n              <AvatarName>Artem Miskevich</AvatarName>\n            </AvatarContent>\n          </Avatar>\n        </div>\n        <div className='w-120'>\n          <Avatar size={size} data-testid={`avatar-${size}-truncated`}>\n            <AvatarFallback name='Maximilian Alexander-Montgomery' />\n            <AvatarContent>\n              <AvatarName>Maximilian Alexander-Montgomery</AvatarName>\n            </AvatarContent>\n          </Avatar>\n        </div>\n      </VStack>\n    ))}\n  </VStack>\n);",
          "storyFile": "Avatar/Avatar.stories.tsx",
          "storyTitle": "Data Display/Avatar",
          "description": "The user item (Figma 12557:5856): the plate and the name in one row, 6px apart. The name is\n`text-sm` at every size and truncates with an ellipsis when the row is narrow."
        },
        {
          "name": "WithDescription",
          "code": "import { Avatar, AvatarContent, AvatarDescription, AvatarFallback, AvatarImage, AvatarName } from '@wallarm-org/design-system/Avatar';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const WithDescription = () => (\n  <VStack gap={16} align='start' data-testid='avatar'>\n    <Avatar data-testid='avatar-photo'>\n      <AvatarImage src={PHOTO} />\n      <AvatarFallback name='Artem Miskevich' />\n      <AvatarContent>\n        <AvatarName>Artem Miskevich</AvatarName>\n        <AvatarDescription>admin@wallarm.com</AvatarDescription>\n      </AvatarContent>\n    </Avatar>\n    <Avatar size='md' data-testid='avatar-md'>\n      <AvatarFallback name='Artem Miskevich' />\n      <AvatarContent>\n        <AvatarName>Artem Miskevich</AvatarName>\n        <AvatarDescription>admin@wallarm.com</AvatarDescription>\n      </AvatarContent>\n    </Avatar>\n    <div className='w-160'>\n      <Avatar data-testid='avatar-truncated'>\n        <AvatarFallback />\n        <AvatarContent>\n          <AvatarName>Maximilian Alexander-Montgomery</AvatarName>\n          <AvatarDescription>maximilian.alexander-montgomery@wallarm.com</AvatarDescription>\n        </AvatarContent>\n      </Avatar>\n    </div>\n  </VStack>\n);",
          "storyFile": "Avatar/Avatar.stories.tsx",
          "storyTitle": "Data Display/Avatar",
          "description": "`AvatarDescription` adds a secondary line under the name — the email in the account menu. Both lines truncate."
        },
        {
          "name": "Fallback",
          "code": "import { Avatar, AvatarFallback, AvatarImage } from '@wallarm-org/design-system/Avatar';\nimport { HStack } from '@wallarm-org/design-system/Stack';\n\nexport const Fallback = () => (\n  <HStack gap={12} align='center' data-testid='avatar'>\n    <Avatar>\n      <AvatarFallback name='Grace Hopper' />\n    </Avatar>\n    <Avatar>\n      <AvatarFallback />\n    </Avatar>\n    <Avatar data-testid='avatar-broken-initials'>\n      <AvatarImage src='/does-not-exist.png' />\n      <AvatarFallback name='Alan Turing' />\n    </Avatar>\n    <Avatar data-testid='avatar-broken-icon'>\n      <AvatarImage src='/does-not-exist.png' />\n      <AvatarFallback />\n    </Avatar>\n  </HStack>\n);",
          "storyFile": "Avatar/Avatar.stories.tsx",
          "storyTitle": "Data Display/Avatar",
          "description": "Initials are the first letters of the first and last word of `name`; without a name the person icon shows, whether the photo is missing or failed to load."
        },
        {
          "name": "CustomIcon",
          "code": "import { Avatar, AvatarFallback } from '@wallarm-org/design-system/Avatar';\nimport { Activity } from '@wallarm-org/design-system/icons';\n\nexport const CustomIcon = () => (\n  <Avatar data-testid='avatar'>\n    <AvatarFallback icon={Activity} />\n  </Avatar>\n);",
          "storyFile": "Avatar/Avatar.stories.tsx",
          "storyTitle": "Data Display/Avatar",
          "description": "`icon` replaces the default person glyph whenever `name` gives no initials."
        },
        {
          "name": "Branded",
          "code": "import { Avatar, AvatarFallback, AvatarImage } from '@wallarm-org/design-system/Avatar';\nimport { HStack } from '@wallarm-org/design-system/Stack';\n\nexport const Branded = () => (\n  <HStack gap={12} align='center' data-frame-style='branded' data-testid='avatar'>\n    <Avatar>\n      <AvatarFallback />\n    </Avatar>\n    <Avatar>\n      <AvatarFallback name='Ada Lovelace' />\n    </Avatar>\n    <Avatar data-testid='avatar-branded-photo'>\n      <AvatarImage src={PHOTO} />\n      <AvatarFallback />\n    </Avatar>\n  </HStack>\n);",
          "storyFile": "Avatar/Avatar.stories.tsx",
          "storyTitle": "Data Display/Avatar",
          "description": "Inside a Branded frame the empty plate takes the brand tint and stroke, initials and the icon take the brand colour, and a photo is unchanged."
        },
        {
          "name": "ClickToUpload",
          "code": "import { Avatar, AvatarFallback, AvatarImage, AvatarOverlay } from '@wallarm-org/design-system/Avatar';\nimport { FileUpload, FileUploadError, FileUploadTrigger } from '@wallarm-org/design-system/FileUpload';\n\nexport const ClickToUpload = () => {\n  const { src, files, setFiles } = useAvatarUpload();\n  return (\n    <FileUpload\n      data-testid='avatar-upload'\n      accept={ACCEPT}\n      maxFileSize={MAX_SIZE}\n      value={files}\n      onValueChange={setFiles}\n    >\n      <FileUploadTrigger asChild data-analytics-id='AVATAR_CHANGE'>\n        <Avatar as='button' aria-label='Change avatar'>\n          <AvatarImage src={src} />\n          <AvatarFallback />\n          <AvatarOverlay />\n        </Avatar>\n      </FileUploadTrigger>\n      <FileUploadError />\n    </FileUpload>\n  );\n};",
          "storyFile": "Avatar/Avatar.stories.tsx",
          "storyTitle": "Data Display/Avatar",
          "description": "Click the avatar, or focus it and press Enter, to pick a photo — hover and focus show the edit\nicon, and the pick only previews until your form saves."
        },
        {
          "name": "WithActions",
          "code": "import { Avatar, AvatarFallback, AvatarImage } from '@wallarm-org/design-system/Avatar';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { FieldDescription, FieldLabel } from '@wallarm-org/design-system/Field';\nimport { FileUpload, FileUploadError, FileUploadTrigger } from '@wallarm-org/design-system/FileUpload';\nimport { RefreshCcw, Trash2 } from '@wallarm-org/design-system/icons';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const WithActions = () => {\n  const { src, files, setFiles, remove } = useAvatarUpload(PHOTO);\n  return (\n    <FileUpload\n      data-testid='avatar-upload'\n      accept={ACCEPT}\n      maxFileSize={MAX_SIZE}\n      value={files}\n      onValueChange={setFiles}\n    >\n      <HStack gap={12} align='center' className='w-[480px] justify-between'>\n        <VStack gap={0} align='start'>\n          <FieldLabel>Avatar</FieldLabel>\n          <FieldDescription>PNG, JPEG, or WebP · up to 512 KB</FieldDescription>\n        </VStack>\n        <HStack gap={12} align='center'>\n          {src && (\n            <Button\n              variant='ghost'\n              color='neutral'\n              size='small'\n              aria-label='Remove avatar'\n              data-testid='avatar-remove'\n              onClick={remove}\n            >\n              <Trash2 />\n            </Button>\n          )}\n          <FileUploadTrigger\n            variant='ghost'\n            color='neutral'\n            size='small'\n            aria-label='Replace avatar'\n          >\n            <RefreshCcw />\n          </FileUploadTrigger>\n          <Avatar data-testid='avatar'>\n            <AvatarImage src={src} />\n            <AvatarFallback />\n          </Avatar>\n        </HStack>\n      </HStack>\n      <FileUploadError />\n    </FileUpload>\n  );\n};",
          "storyFile": "Avatar/Avatar.stories.tsx",
          "storyTitle": "Data Display/Avatar",
          "description": "The settings-row pattern: explicit Remove and Replace buttons beside a plain avatar, with the accepted formats and size spelled out."
        },
        {
          "name": "Uploading",
          "code": "import { Avatar, AvatarFallback, AvatarImage, AvatarOverlay } from '@wallarm-org/design-system/Avatar';\nimport { FileUpload, FileUploadTrigger } from '@wallarm-org/design-system/FileUpload';\nimport { Loader } from '@wallarm-org/design-system/Loader';\n\nexport const Uploading = () => (\n  <FileUpload data-testid='avatar-upload' accept={ACCEPT}>\n    <FileUploadTrigger asChild disabled>\n      <Avatar as='button' aria-label='Change avatar' aria-busy>\n        <AvatarImage src={PHOTO} />\n        <AvatarFallback />\n        <AvatarOverlay visible>\n          <Loader size='md' />\n        </AvatarOverlay>\n      </Avatar>\n    </FileUploadTrigger>\n  </FileUpload>\n);",
          "storyFile": "Avatar/Avatar.stories.tsx",
          "storyTitle": "Data Display/Avatar",
          "description": "While the new photo uploads, disable the trigger and force the overlay with `visible` so it holds a `Loader`."
        }
      ]
    },
    {
      "name": "Badge",
      "description": "The status chip the rest of the family is built from — reach for the dedicated component when one exists (`HttpMethod`, `ResponseCode`, `Ip`, `Country`) rather than rebuilding it here, and for `Tag` when the chip is interactive. Colour carries the meaning, so choose it from what the value is rather than from what looks right on the page.",
      "importPath": "@wallarm-org/design-system/Badge",
      "props": [
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "color",
          "type": "string | undefined",
          "required": false,
          "defaultValue": "slate"
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "type",
          "type": "{ solid: string; secondary: string; outline: string; text: string; 'text-color': string; }",
          "required": false,
          "defaultValue": "solid"
        },
        {
          "name": "size",
          "type": "{ small: string; medium: string; large: string; }",
          "required": false,
          "defaultValue": "medium"
        },
        {
          "name": "muted",
          "type": "{ true: string; false: string; }",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "variant",
          "type": "{ default: string; dotted: string; }",
          "required": false,
          "defaultValue": "default"
        },
        {
          "name": "isIconOnly",
          "type": "{ true: string; }",
          "required": false
        },
        {
          "name": "textVariant",
          "type": "{ default: string; code: string; }",
          "required": false,
          "defaultValue": "default"
        },
        {
          "name": "isClickable",
          "type": "{ true: string; }",
          "required": false
        },
        {
          "name": "asChild",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "variant",
          "options": [
            "default",
            "dotted"
          ],
          "defaultValue": "default"
        },
        {
          "name": "size",
          "options": [
            "small",
            "medium",
            "large"
          ]
        },
        {
          "name": "isIconOnly",
          "options": [
            "true"
          ]
        },
        {
          "name": "type",
          "options": [
            "solid",
            "secondary",
            "outline",
            "text",
            "text-color"
          ]
        },
        {
          "name": "color",
          "options": []
        },
        {
          "name": "muted",
          "options": [
            "true",
            "false"
          ]
        },
        {
          "name": "textVariant",
          "options": [
            "default",
            "code"
          ]
        },
        {
          "name": "isClickable",
          "options": [
            "true"
          ]
        }
      ],
      "subComponents": [],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Badge } from '@wallarm-org/design-system/Badge';\n\nexport const Basic = () => <Badge>Badge</Badge>;",
          "storyFile": "Badge/Badge.stories.tsx",
          "storyTitle": "Status Indication/Badge",
          "description": "The default chip. Keep the text to a word or two — a badge is read at a glance, in a table\ncell, alongside dozens of others."
        },
        {
          "name": "Dotted",
          "code": "import { Badge } from '@wallarm-org/design-system/Badge';\n\nexport const Dotted = () => (\n  <Badge variant='dotted'>\n    Badge\n  </Badge>\n);",
          "storyFile": "Badge/Badge.stories.tsx",
          "storyTitle": "Status Indication/Badge",
          "description": "A leading dot in the current colour, for a status that reads faster as a mark than as a fill."
        },
        {
          "name": "Sizes",
          "code": "import { Badge } from '@wallarm-org/design-system/Badge';\nimport { HStack } from '@wallarm-org/design-system/Stack';\n\nexport const Sizes = () => (\n  <HStack align='center' gap={8}>\n    <Badge size='small'>\n      Small\n    </Badge>\n    <Badge size='medium'>\n      Medium\n    </Badge>\n    <Badge size='large'>\n      Large\n    </Badge>\n  </HStack>\n);",
          "storyFile": "Badge/Badge.stories.tsx",
          "storyTitle": "Status Indication/Badge",
          "description": "Two heights. `medium` exists for dense rows; anything smaller stops being legible at a\nglance, which is the only thing a badge is for."
        },
        {
          "name": "Types",
          "code": "import { Badge } from '@wallarm-org/design-system/Badge';\nimport { HStack } from '@wallarm-org/design-system/Stack';\n\nexport const Types = () => (\n  <HStack gap={8}>\n    <Badge type='solid'>\n      Solid\n    </Badge>\n    <Badge type='secondary'>\n      Secondary\n    </Badge>\n    <Badge type='outline'>\n      Outline\n    </Badge>\n    <Badge type='text'>\n      Text\n    </Badge>\n    <Badge type='text-color'>\n      Text Color\n    </Badge>\n  </HStack>\n);",
          "storyFile": "Badge/Badge.stories.tsx",
          "storyTitle": "Status Indication/Badge",
          "description": "The emphasis ladder from `solid` down to `text`. Drop the emphasis when badges are everywhere\n— a table of solid chips is a table nobody can scan."
        },
        {
          "name": "TextVariants",
          "code": "import { Badge } from '@wallarm-org/design-system/Badge';\nimport { HStack } from '@wallarm-org/design-system/Stack';\n\nexport const TextVariants = () => (\n  <HStack gap={8}>\n    <Badge textVariant='default'>\n      Default Text\n    </Badge>\n    <Badge textVariant='code'>\n      Code Text\n    </Badge>\n  </HStack>\n);",
          "storyFile": "Badge/Badge.stories.tsx",
          "storyTitle": "Status Indication/Badge",
          "description": "`text` and `text-color`, the two flattest types. They suit a value that must be read but\nshould not compete with the row it sits in."
        },
        {
          "name": "WithIconsLeft",
          "code": "import { Badge } from '@wallarm-org/design-system/Badge';\nimport { Check, CircleCheck, Info, X } from '@wallarm-org/design-system/icons';\nimport { HStack } from '@wallarm-org/design-system/Stack';\n\nexport const WithIconsLeft = () => (\n  <HStack gap={8}>\n    <Badge>\n      <Check size='sm' />\n      Success\n    </Badge>\n    <Badge>\n      <X size='sm' />\n      Error\n    </Badge>\n    <Badge>\n      <Info size='sm' />\n      Info\n    </Badge>\n    <Badge>\n      <CircleCheck size='sm' />\n      Verified\n    </Badge>\n    <Badge>\n      <Check size='sm' />\n      Complete\n    </Badge>\n  </HStack>\n);",
          "storyFile": "Badge/Badge.stories.tsx",
          "storyTitle": "Status Indication/Badge",
          "description": "An icon before the label, which is how a status reads without relying on colour alone."
        },
        {
          "name": "WithIconsRight",
          "code": "import { Badge } from '@wallarm-org/design-system/Badge';\nimport { Check, CircleCheck, Info, X } from '@wallarm-org/design-system/icons';\nimport { HStack } from '@wallarm-org/design-system/Stack';\n\nexport const WithIconsRight = () => (\n  <HStack gap={8}>\n    <Badge>\n      Success\n      <Check size='sm' />\n    </Badge>\n    <Badge>\n      Error\n      <X size='sm' />\n    </Badge>\n    <Badge>\n      Info\n      <Info size='sm' />\n    </Badge>\n    <Badge>\n      Verified\n      <CircleCheck size='sm' />\n    </Badge>\n    <Badge>\n      Complete\n      <Check size='sm' />\n    </Badge>\n  </HStack>\n);",
          "storyFile": "Badge/Badge.stories.tsx",
          "storyTitle": "Status Indication/Badge",
          "description": "An icon after the label, for a mark about the value rather than the value's own state."
        },
        {
          "name": "IconsOnly",
          "code": "import { Badge } from '@wallarm-org/design-system/Badge';\nimport { Check, CircleCheck, Info, X } from '@wallarm-org/design-system/icons';\nimport { HStack } from '@wallarm-org/design-system/Stack';\n\nexport const IconsOnly = () => (\n  <HStack gap={8}>\n    <Badge>\n      <Check size='sm' />\n    </Badge>\n    <Badge>\n      <X size='sm' />\n    </Badge>\n    <Badge>\n      <Info size='sm' />\n    </Badge>\n    <Badge>\n      <CircleCheck size='sm' />\n    </Badge>\n    <Badge>\n      <Check size='sm' />\n    </Badge>\n  </HStack>\n);",
          "storyFile": "Badge/Badge.stories.tsx",
          "storyTitle": "Status Indication/Badge",
          "description": "No label at all. Only safe where the icon's meaning is already established elsewhere on the\npage, since nothing here names it."
        },
        {
          "name": "MutedVariants",
          "code": "import { Badge, type BadgeType } from '@wallarm-org/design-system/Badge';\nimport { BadgeTypeEnum } from './constants';\nimport { badgeColorsMuted } from './generateBadgeVariants';\n\nexport const MutedVariants = () => (\n  <table className='w-full'>\n    <thead>\n      <tr>\n        {Object.keys(BadgeTypeEnum).map(type => (\n          <th key={type} className='sb-annotation p-8 text-left'>\n            {type}\n          </th>\n        ))}\n      </tr>\n    </thead>\n    <tbody>\n      {badgeColorsMuted.map(color => (\n        <tr key={color}>\n          {Object.values(BadgeTypeEnum).map((type: BadgeType) => (\n            <td key={type} className='p-8'>\n              {isMutedSupported(type, color) ? (\n                <Badge type={type} color={color} muted>\n                  {capitalize(color)}\n                </Badge>\n              ) : null}\n            </td>\n          ))}\n        </tr>\n      ))}\n    </tbody>\n  </table>\n);",
          "storyFile": "Badge/Badge.stories.tsx",
          "storyTitle": "Status Indication/Badge",
          "description": "`muted` drops the saturation for a status that is true but not worth attention — the case for\neverything that is merely fine."
        },
        {
          "name": "MutedOutline",
          "code": "import { Badge } from '@wallarm-org/design-system/Badge';\n\nexport const MutedOutline = () => (\n  <div\n    className='rounded-8 bg-bg-light-danger p-16 text-text-danger'\n    data-testid='muted-outline-host'\n  >\n    <Badge data-testid='muted-outline' type='outline' color='slate' muted>\n      Muted outline\n    </Badge>\n  </div>\n);",
          "storyFile": "Badge/Badge.stories.tsx",
          "storyTitle": "Status Indication/Badge",
          "description": "A quieter outline keeps its neutral label and border inside a coloured message."
        },
        {
          "name": "ColorVariants",
          "code": "import { Badge, type BadgeType } from '@wallarm-org/design-system/Badge';\nimport { BadgeColorEnum, BadgeTypeEnum } from './constants';\n\nexport const ColorVariants = () => (\n  <table className='w-full'>\n    <thead>\n      <tr>\n        {Object.keys(BadgeTypeEnum).map(type => (\n          <th key={type} className='sb-annotation p-8 text-left'>\n            {type}\n          </th>\n        ))}\n      </tr>\n    </thead>\n    <tbody>\n      {Object.entries(BadgeColorEnum).map(([label, color]) => (\n        <tr key={color}>\n          {Object.values(BadgeTypeEnum).map((type: BadgeType) => (\n            <td key={type} className='p-8'>\n              <Badge data-testid='badge' type={type} color={color}>\n                {label}\n              </Badge>\n            </td>\n          ))}\n        </tr>\n      ))}\n    </tbody>\n  </table>\n);",
          "storyFile": "Badge/Badge.stories.tsx",
          "storyTitle": "Status Indication/Badge",
          "description": "The full palette. Every colour already means something in the system, so borrowing one for\ndecoration teaches the reader the wrong thing."
        },
        {
          "name": "ContentVariants",
          "code": "import { Fragment } from 'react';\nimport { Badge, type BadgeType } from '@wallarm-org/design-system/Badge';\nimport { Info, PenTool, X } from '@wallarm-org/design-system/icons';\nimport { BadgeColorEnum, BadgeTypeEnum } from './constants';\nimport { badgeColorsMuted } from './generateBadgeVariants';\n\nexport const ContentVariants = () => (\n  <table className='w-full'>\n    <thead>\n      <tr>\n        {Object.keys(BadgeTypeEnum).map(type => (\n          <th key={type} className='sb-annotation p-8 text-left'>\n            {type}\n          </th>\n        ))}\n      </tr>\n    </thead>\n    <tbody>\n      {Object.entries(BadgeColorEnum).map(([label, color]) => (\n        <Fragment key={color}>\n          <tr>\n            {Object.values(BadgeTypeEnum).map((type: BadgeType) => (\n              <td key={type} className='p-8'>\n                <Badge data-testid='badge' type={type} color={color}>\n                  {label}\n                </Badge>\n              </td>\n            ))}\n          </tr>\n\n          <tr>\n            {Object.values(BadgeTypeEnum).map((type: BadgeType) => (\n              <td key={type} className='p-8'>\n                <Badge data-testid='badge' type={type} color={color}>\n                  {label}\n\n                  <X />\n                </Badge>\n              </td>\n            ))}\n          </tr>\n\n          <tr>\n            {Object.values(BadgeTypeEnum).map((type: BadgeType) => (\n              <td key={type} className='p-8'>\n                <Badge data-testid='badge' type={type} color={color}>\n                  <PenTool />\n                  {label}\n                </Badge>\n              </td>\n            ))}\n          </tr>\n\n          <tr>\n            {Object.values(BadgeTypeEnum).map((type: BadgeType) => (\n              <td key={type} className='p-8'>\n                <Badge data-testid='badge' type={type} color={color}>\n                  <PenTool />\n                  {label}\n                  <X />\n                </Badge>\n              </td>\n            ))}\n          </tr>\n\n          <tr>\n            {Object.values(BadgeTypeEnum).map((type: BadgeType) => (\n              <td key={type} className='p-8'>\n                <Badge data-testid='badge' type={type} color={color} variant='dotted'>\n                  {label}\n                </Badge>\n              </td>\n            ))}\n          </tr>\n\n          <tr>\n            {Object.values(BadgeTypeEnum).map((type: BadgeType) => (\n              <td key={type} className='p-8'>\n                <Badge data-testid='badge' type={type} color={color} variant='dotted'>\n                  {label}\n                  <X />\n                </Badge>\n              </td>\n            ))}\n          </tr>\n\n          <tr>\n            {Object.values(BadgeTypeEnum).map((type: BadgeType) => (\n              <td key={type} className='p-8'>\n                <Badge data-testid='badge' type={type} color={color}>\n                  {label}\n                  <Info />\n                </Badge>\n              </td>\n            ))}\n          </tr>\n\n          <tr>\n            {Object.values(BadgeTypeEnum).map((type: BadgeType) => (\n              <td key={type} className='p-8'>\n                <Badge data-testid='badge' type={type} color={color}>\n                  <PenTool />\n                </Badge>\n              </td>\n            ))}\n          </tr>\n\n          {badgeColorsMuted.includes(color) && (\n            <tr key={color}>\n              {Object.values(BadgeTypeEnum).map((type: BadgeType) => (\n                <td key={type} className='p-8'>\n                  {isMutedSupported(type, color) ? (\n                    <Badge data-testid='badge' type={type} color={color} muted>\n                      {capitalize(color)}\n                    </Badge>\n                  ) : null}\n                </td>\n              ))}\n            </tr>\n          )}\n        </Fragment>\n      ))}\n    </tbody>\n  </table>\n);",
          "storyFile": "Badge/Badge.stories.tsx",
          "storyTitle": "Status Indication/Badge",
          "description": "What happens as the content grows. A badge does not truncate, so long text widens the row\nrather than being cut."
        }
      ]
    },
    {
      "name": "Banner",
      "description": "A full-width message pinned above the header, for something account- or system-wide. The test is whether it would still matter on another page: yes and it is a `Banner`, no and it is an `Alert`. There is no success variant — “it worked” is a `Toast` — and no `icon` prop either: the icon appears only when a `BannerIcon` is composed in.",
      "importPath": "@wallarm-org/design-system/Banner",
      "props": [
        {
          "name": "variant",
          "type": "BannerVariant | undefined",
          "required": false,
          "description": "Visual variant of the banner",
          "defaultValue": "primary"
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "variant",
          "options": [
            "primary",
            "secondary",
            "destructive",
            "info",
            "warning"
          ],
          "defaultValue": "primary"
        }
      ],
      "subComponents": [
        {
          "name": "BannerClose",
          "props": [
            {
              "name": "onClick",
              "type": "(() => void) | undefined",
              "required": false,
              "description": "Callback when the close button is clicked"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "BannerContent",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "BannerControls",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "BannerDescription",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "BannerIcon",
          "props": [
            {
              "name": "icon",
              "type": "ReactNode",
              "required": false,
              "description": "Override the default icon for the variant."
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "BannerLink",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "{ true: string; }",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "weight",
              "type": "{ regular: string; medium: string; }",
              "required": false,
              "defaultValue": "regular"
            },
            {
              "name": "href",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "download",
              "type": "any",
              "required": false
            },
            {
              "name": "hrefLang",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "target",
              "type": "HTMLAttributeAnchorTarget | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "BannerTitle",
          "props": [
            {
              "name": "action",
              "type": "ReactNode",
              "required": false,
              "description": "Optional inline action rendered next to the title (e.g. a BannerLink).\nSits on the same row and wraps below on narrow viewports."
            },
            {
              "name": "lineClamp",
              "type": "number | undefined",
              "required": false,
              "description": "Maximum number of lines before the message is truncated (default: 1).\nThe design budget is 2 lines; 1 line is preferred.",
              "defaultValue": "1"
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Default",
          "code": "import { Banner, BannerClose, BannerContent, BannerControls, BannerDescription, BannerIcon, BannerLink, BannerTitle } from '@wallarm-org/design-system/Banner';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Megaphone } from '@wallarm-org/design-system/icons';\n\nexport const Default = ({\n  variant,\n  customIcon,\n  description,\n  inlineAction,\n  actions,\n  closable,\n  title,\n  text,\n}) => (\n  <Banner variant={variant}>\n    <BannerIcon\n      icon={customIcon ? <Megaphone size='lg' className='text-icon-brand' /> : undefined}\n    />\n    <BannerContent>\n      <BannerTitle action={inlineAction ? <BannerLink href='#'>Action</BannerLink> : undefined}>\n        {title}\n      </BannerTitle>\n      {description && <BannerDescription>{text}</BannerDescription>}\n    </BannerContent>\n    {(actions || closable) && (\n      <BannerControls>\n        {actions && (\n          <Button variant='secondary' color='neutral' size='small'>\n            Button\n          </Button>\n        )}\n        {closable && <BannerClose />}\n      </BannerControls>\n    )}\n  </Banner>\n);",
          "storyFile": "Banner/Banner.stories.tsx",
          "storyTitle": "Messaging/Banner",
          "description": "The playground — toggle the controls to compose a banner and see which parts are optional."
        },
        {
          "name": "AllColors",
          "code": "import { Banner, BannerContent, BannerIcon, BannerTitle } from '@wallarm-org/design-system/Banner';\n\nexport const AllColors = () => (\n  <div className='flex flex-col gap-16'>\n    <Banner variant='primary'>\n      <BannerContent>\n        <BannerTitle>Message goes here</BannerTitle>\n      </BannerContent>\n    </Banner>\n\n    <Banner variant='secondary'>\n      <BannerContent>\n        <BannerTitle>Message goes here</BannerTitle>\n      </BannerContent>\n    </Banner>\n\n    <Banner variant='destructive'>\n      <BannerIcon />\n      <BannerContent>\n        <BannerTitle>Message goes here</BannerTitle>\n      </BannerContent>\n    </Banner>\n\n    <Banner variant='info'>\n      <BannerIcon />\n      <BannerContent>\n        <BannerTitle>Message goes here</BannerTitle>\n      </BannerContent>\n    </Banner>\n\n    <Banner variant='warning'>\n      <BannerIcon />\n      <BannerContent>\n        <BannerTitle>Message goes here</BannerTitle>\n      </BannerContent>\n    </Banner>\n  </div>\n);",
          "storyFile": "Banner/Banner.stories.tsx",
          "storyTitle": "Messaging/Banner",
          "description": "`primary` (dark) and `secondary` (light) are the neutral bars and carry no icon of their own; destructive, info and warning each bring one."
        },
        {
          "name": "WithDescription",
          "code": "import { Banner, BannerContent, BannerDescription, BannerIcon, BannerTitle } from '@wallarm-org/design-system/Banner';\n\nexport const WithDescription = () => (\n  <Banner variant='info'>\n    <BannerIcon />\n    <BannerContent>\n      <BannerTitle>Credential Stuffing Detection</BannerTitle>\n      <BannerDescription>\n        Credential Stuffing Detection requires Wallarm node version 4.10.3 or higher.\n      </BannerDescription>\n    </BannerContent>\n  </Banner>\n);",
          "storyFile": "Banner/Banner.stories.tsx",
          "storyTitle": "Messaging/Banner",
          "description": "A description earns its place by adding the consequence — here the node version the feature needs — never by restating the title."
        },
        {
          "name": "WithInlineLink",
          "code": "import { Banner, BannerContent, BannerIcon, BannerLink, BannerTitle } from '@wallarm-org/design-system/Banner';\n\nexport const WithInlineLink = () => (\n  <Banner variant='warning'>\n    <BannerIcon />\n    <BannerContent>\n      <BannerTitle action={<BannerLink href='#'>Learn more</BannerLink>}>\n        You have exceeded the monthly quota for your company\n      </BannerTitle>\n    </BannerContent>\n  </Banner>\n);",
          "storyFile": "Banner/Banner.stories.tsx",
          "storyTitle": "Messaging/Banner",
          "description": "A `BannerLink` inside the title, for when the action belongs in the sentence. Use the inline link or the trailing buttons, never both."
        },
        {
          "name": "LongText",
          "code": "import { Banner, BannerClose, BannerContent, BannerControls, BannerTitle } from '@wallarm-org/design-system/Banner';\n\nexport const LongText = () => (\n  <Banner variant='primary'>\n    <BannerContent>\n      <BannerTitle lineClamp={2}>\n        Banner will render at most two lines before truncating the text. Banners address system-wide\n        conditions, not individual user actions. The voice should be institutional and factual, even\n        when the situation is urgent. Every word must earn its place within the 2-line budget, but\n        one line is more preferred.\n      </BannerTitle>\n    </BannerContent>\n    <BannerControls>\n      <BannerClose />\n    </BannerControls>\n  </Banner>\n);",
          "storyFile": "Banner/Banner.stories.tsx",
          "storyTitle": "Messaging/Banner",
          "description": "Two lines is the ceiling, after which the text truncates into a tooltip. One line is what to aim for."
        },
        {
          "name": "CustomIcon",
          "code": "import { Banner, BannerClose, BannerContent, BannerControls, BannerIcon, BannerLink, BannerTitle } from '@wallarm-org/design-system/Banner';\nimport { Megaphone } from '@wallarm-org/design-system/icons';\n\nexport const CustomIcon = () => (\n  <Banner variant='secondary'>\n    <BannerIcon icon={<Megaphone size='lg' className='text-icon-brand' />} />\n    <BannerContent>\n      <BannerTitle action={<BannerLink href='#'>View plans</BannerLink>}>\n        New features are now available on the Pro plan\n      </BannerTitle>\n    </BannerContent>\n    <BannerControls>\n      <BannerClose />\n    </BannerControls>\n  </Banner>\n);",
          "storyFile": "Banner/Banner.stories.tsx",
          "storyTitle": "Messaging/Banner",
          "description": "`BannerIcon`’s `icon` prop overrides the variant default, or gives `primary` and `secondary` the icon they otherwise lack — which is how an announcement gets its megaphone."
        },
        {
          "name": "WithActions",
          "code": "import { Banner, BannerContent, BannerControls, BannerIcon, BannerTitle } from '@wallarm-org/design-system/Banner';\nimport { Button } from '@wallarm-org/design-system/Button';\n\nexport const WithActions = () => (\n  <Banner variant='destructive'>\n    <BannerIcon />\n    <BannerContent>\n      <BannerTitle>Your subscription has expired</BannerTitle>\n    </BannerContent>\n    <BannerControls>\n      <Button variant='outline' color='neutral' size='small'>\n        Dismiss\n      </Button>\n      <Button variant='outline' color='neutral' size='small'>\n        Renew\n      </Button>\n    </BannerControls>\n  </Banner>\n);",
          "storyFile": "Banner/Banner.stories.tsx",
          "storyTitle": "Messaging/Banner",
          "description": "Trailing buttons in `BannerControls`, small and never solid, labelled with the verb that follows: “Renew”, not “Learn more”."
        },
        {
          "name": "Closable",
          "code": "import { useState } from 'react';\nimport { Banner, BannerClose, BannerContent, BannerControls, BannerTitle } from '@wallarm-org/design-system/Banner';\nimport { Button } from '@wallarm-org/design-system/Button';\n\nexport const Closable = () => {\n  const [open, setOpen] = useState(true);\n\n  if (!open) {\n    return (\n      <div className='p-16'>\n        <Button onClick={() => setOpen(true)}>Show banner</Button>\n      </div>\n    );\n  }\n\n  return (\n    <Banner variant='primary'>\n      <BannerContent>\n        <BannerTitle>A new version of the dashboard is available</BannerTitle>\n      </BannerContent>\n      <BannerControls>\n        <BannerClose onClick={() => setOpen(false)} />\n      </BannerControls>\n    </Banner>\n  );\n};",
          "storyFile": "Banner/Banner.stories.tsx",
          "storyTitle": "Messaging/Banner",
          "description": "`BannerClose` where the reader may dismiss it. Leave it off while the condition still holds, since a banner is meant to outlast a page view."
        }
      ]
    },
    {
      "name": "Breadcrumbs",
      "description": "The location trail for a page that sits deep in a hierarchy — each ancestor links up, and the last item is the page you are on. Skip it in a flat app of one or two levels, and never use it to move between peers at the same level: that is `Tabs`. It shows vertical hierarchy only, and complements the sidebar rather than replacing it.",
      "importPath": "@wallarm-org/design-system/Breadcrumbs",
      "props": [
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [
        {
          "name": "BreadcrumbsEllipsis",
          "props": [
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "BreadcrumbsItem",
          "props": [
            {
              "name": "href",
              "type": "string | undefined",
              "required": false,
              "description": "If provided, renders as a link instead of button"
            },
            {
              "name": "onClick",
              "type": "MouseEventHandler<HTMLButtonElement | HTMLAnchorElement> | undefined",
              "required": false,
              "description": "Click handler for buttons"
            },
            {
              "name": "aria-label",
              "type": "string | undefined",
              "required": false,
              "description": "ARIA label for accessibility"
            },
            {
              "name": "isCurrent",
              "type": "boolean | undefined",
              "required": false,
              "description": "@internal - Whether this is the current/active page (set automatically by parent)",
              "defaultValue": "false"
            }
          ]
        },
        {
          "name": "BreadcrumbsScopeSwitcher",
          "props": [
            {
              "name": "value",
              "type": "string",
              "required": true
            },
            {
              "name": "items",
              "type": "ScopeSwitcherItem[]",
              "required": true
            },
            {
              "name": "onSelect",
              "type": "(item: ScopeSwitcherItem) => void",
              "required": true
            },
            {
              "name": "isCurrent",
              "type": "boolean | undefined",
              "required": false,
              "description": "@internal - set automatically by parent",
              "defaultValue": "false"
            }
          ]
        },
        {
          "name": "BreadcrumbsSeparator",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Breadcrumbs, BreadcrumbsItem } from '@wallarm-org/design-system/Breadcrumbs';\nimport { Home } from '@wallarm-org/design-system/icons';\n\nexport const Basic = () => {\n  return (\n    <div className='flex items-center justify-center w-full p-8 min-h-[400px]'>\n      <Breadcrumbs data-testid='breadcrumbs'>\n        <BreadcrumbsItem href='#home'>Home</BreadcrumbsItem>\n        <BreadcrumbsItem href='#products'>Products</BreadcrumbsItem>\n        <BreadcrumbsItem href='#current'>Current Page</BreadcrumbsItem>\n      </Breadcrumbs>\n    </div>\n  );\n};",
          "storyFile": "Breadcrumbs/Breadcrumbs.stories.tsx",
          "storyTitle": "Navigation/Breadcrumbs",
          "description": "The plain trail. The root inserts the chevrons and marks the last item as the current page, so you list only your own items."
        },
        {
          "name": "SingleItem",
          "code": "import { Breadcrumbs, BreadcrumbsItem } from '@wallarm-org/design-system/Breadcrumbs';\n\nexport const SingleItem = () => {\n  return (\n    <div className='flex items-center justify-center w-full p-8 min-h-[400px]'>\n      <Breadcrumbs>\n        <BreadcrumbsItem href='#current'>Current Page</BreadcrumbsItem>\n      </Breadcrumbs>\n    </div>\n  );\n};",
          "storyFile": "Breadcrumbs/Breadcrumbs.stories.tsx",
          "storyTitle": "Navigation/Breadcrumbs",
          "description": "One item is the current page and nothing more — which is the case where a breadcrumb has stopped earning its space."
        },
        {
          "name": "WithIcons",
          "code": "import { Breadcrumbs, BreadcrumbsItem } from '@wallarm-org/design-system/Breadcrumbs';\nimport { CircleDashed, Home } from '@wallarm-org/design-system/icons';\n\nexport const WithIcons = () => {\n  return (\n    <div className='flex items-center justify-center w-full p-8 min-h-[400px]'>\n      <Breadcrumbs>\n        <BreadcrumbsItem href='#home'>\n          <Home size='md' />\n          Home\n        </BreadcrumbsItem>\n        <BreadcrumbsItem href='#category'>\n          <CircleDashed size='md' />\n          Category\n        </BreadcrumbsItem>\n        <BreadcrumbsItem href='#subcategory'>\n          Subcategory\n          <CircleDashed size='md' />\n        </BreadcrumbsItem>\n        <BreadcrumbsItem onClick={onCurrentPageClick}>\n          <CircleDashed size='md' />\n          Current Page\n          <CircleDashed size='md' />\n        </BreadcrumbsItem>\n      </Breadcrumbs>\n    </div>\n  );\n};",
          "storyFile": "Breadcrumbs/Breadcrumbs.stories.tsx",
          "storyTitle": "Navigation/Breadcrumbs",
          "description": "An icon inside an item, for a level whose type is worth showing as well as naming."
        },
        {
          "name": "WithInteractiveItems",
          "code": "import { Breadcrumbs, BreadcrumbsItem } from '@wallarm-org/design-system/Breadcrumbs';\nimport { ChevronDown, CircleDashed, Home } from '@wallarm-org/design-system/icons';\n\nexport const WithInteractiveItems = () => {\n  return (\n    <div className='flex items-center justify-center w-full p-8 min-h-[400px]'>\n      <Breadcrumbs>\n        <BreadcrumbsItem href='#home'>Home</BreadcrumbsItem>\n        <BreadcrumbsItem onClick={onCategoryClick}>\n          <CircleDashed size='md' />\n          Category\n          <ChevronDown size='md' />\n        </BreadcrumbsItem>\n        <BreadcrumbsItem href='#current'>Current Page</BreadcrumbsItem>\n      </Breadcrumbs>\n    </div>\n  );\n};",
          "storyFile": "Breadcrumbs/Breadcrumbs.stories.tsx",
          "storyTitle": "Navigation/Breadcrumbs",
          "description": "Items that call a handler instead of following an `href`, for a trail wired to a router rather than to URLs."
        },
        {
          "name": "IconsOnly",
          "code": "import { Breadcrumbs, BreadcrumbsItem } from '@wallarm-org/design-system/Breadcrumbs';\nimport { CircleDashed, Home } from '@wallarm-org/design-system/icons';\n\nexport const IconsOnly = () => {\n  return (\n    <div className='flex items-center justify-center w-full p-8 min-h-[400px]'>\n      <Breadcrumbs>\n        <BreadcrumbsItem href='#home' aria-label='Home'>\n          <Home size='md' />\n        </BreadcrumbsItem>\n        <BreadcrumbsItem href='#dashboard' aria-label='Dashboard'>\n          <CircleDashed size='md' />\n        </BreadcrumbsItem>\n        <BreadcrumbsItem href='#projects' aria-label='Projects'>\n          <CircleDashed size='md' />\n        </BreadcrumbsItem>\n        <BreadcrumbsItem href='#settings' aria-label='Settings'>\n          <CircleDashed size='md' />\n        </BreadcrumbsItem>\n        <BreadcrumbsItem href='#security' aria-label='Security'>\n          <CircleDashed size='md' />\n        </BreadcrumbsItem>\n        <BreadcrumbsItem aria-label='Current page' onClick={onCurrentPageClick}>\n          <CircleDashed size='md' />\n        </BreadcrumbsItem>\n      </Breadcrumbs>\n    </div>\n  );\n};",
          "storyFile": "Breadcrumbs/Breadcrumbs.stories.tsx",
          "storyTitle": "Navigation/Breadcrumbs",
          "description": "Icons with no text. Each item needs its own `aria-label`, since the icon is then the only thing naming the level."
        },
        {
          "name": "WithTruncation",
          "code": "import { useState } from 'react';\nimport { Breadcrumbs, BreadcrumbsEllipsis, BreadcrumbsItem } from '@wallarm-org/design-system/Breadcrumbs';\nimport { Home } from '@wallarm-org/design-system/icons';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@wallarm-org/design-system/Tooltip';\n\nexport const WithTruncation = () => {\n  const [showAll, setShowAll] = useState(false);\n\n  return (\n    <div className='flex items-center justify-center w-full p-8 min-h-[400px]'>\n      <Breadcrumbs>\n        <BreadcrumbsItem href='#home'>Home</BreadcrumbsItem>\n        <BreadcrumbsItem href='#level1'>Level 1</BreadcrumbsItem>\n        {!showAll ? (\n          <Tooltip>\n            <TooltipTrigger asChild>\n              <BreadcrumbsEllipsis onClick={() => setShowAll(true)} />\n            </TooltipTrigger>\n            <TooltipContent>WIP</TooltipContent>\n          </Tooltip>\n        ) : (\n          [\n            <BreadcrumbsItem key='level2' href='#level2'>\n              Level 2\n            </BreadcrumbsItem>,\n            <BreadcrumbsItem key='level3' href='#level3'>\n              Level 3\n            </BreadcrumbsItem>,\n          ]\n        )}\n        <BreadcrumbsItem href='#penultimate'>Penultimate</BreadcrumbsItem>\n        <BreadcrumbsItem href='#current'>Current Page</BreadcrumbsItem>\n      </Breadcrumbs>\n    </div>\n  );\n};",
          "storyFile": "Breadcrumbs/Breadcrumbs.stories.tsx",
          "storyTitle": "Navigation/Breadcrumbs",
          "description": "A long trail folded behind a `BreadcrumbsEllipsis`, which expands the middle on click. The first and current items always stay."
        },
        {
          "name": "LongBreadcrumbs",
          "code": "import { Breadcrumbs, BreadcrumbsItem } from '@wallarm-org/design-system/Breadcrumbs';\nimport { Home } from '@wallarm-org/design-system/icons';\n\nexport const LongBreadcrumbs = () => {\n  return (\n    <div className='flex items-center justify-center w-full p-8 min-h-[400px]'>\n      <Breadcrumbs>\n        <BreadcrumbsItem href='#home'>Home</BreadcrumbsItem>\n        <BreadcrumbsItem href='#products'>Products & Services</BreadcrumbsItem>\n        <BreadcrumbsItem href='#category'>Technology Category</BreadcrumbsItem>\n        <BreadcrumbsItem href='#subcategory'>Software Development</BreadcrumbsItem>\n        <BreadcrumbsItem href='#area'>Web Development Tools</BreadcrumbsItem>\n        <BreadcrumbsItem onClick={onCurrentPageClick}>\n          Frontend Frameworks and Libraries\n        </BreadcrumbsItem>\n      </Breadcrumbs>\n    </div>\n  );\n};",
          "storyFile": "Breadcrumbs/Breadcrumbs.stories.tsx",
          "storyTitle": "Navigation/Breadcrumbs",
          "description": "What a trail of long labels actually does today: it runs on. Per-item truncation is drawn in Figma but not shipped, so keep labels short."
        }
      ]
    },
    {
      "name": "BulkBar",
      "importPath": "@wallarm-org/design-system/BulkBar",
      "props": [],
      "variants": [],
      "subComponents": [
        {
          "name": "BulkBarSummary",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "BulkBarSummaryClear",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false,
              "defaultValue": "false"
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "BulkBarSummaryCount",
          "props": [
            {
              "name": "count",
              "type": "number | undefined",
              "required": false,
              "description": "Renders the default \"{count} selected\" label."
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "color",
              "type": "{ primary: string; 'primary-alt': string; secondary: string; 'secondary-alt': string; 'tertiary-alt': string; danger: string; inherit: string; }",
              "required": false,
              "defaultValue": "primary-alt"
            },
            {
              "name": "size",
              "type": "{ xs: string; sm: string; md: string; lg: string; xl: string; }",
              "required": false,
              "defaultValue": "sm"
            },
            {
              "name": "weight",
              "type": "{ light: string; regular: string; medium: string; bold: string; }",
              "required": false,
              "defaultValue": "medium"
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "BulkBarSummarySelectAll",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false,
              "defaultValue": "false"
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": []
    },
    {
      "name": "Button",
      "description": "Triggers an action — reach for `Link` when the control navigates somewhere instead, `ToggleButton` when it stays switched on, and `SplitButton` or `DropdownMenu` when several related actions compete for one slot. Keep one `variant='primary'` per view, and reserve `color='destructive'` for actions that are hard to undo.",
      "importPath": "@wallarm-org/design-system/Button",
      "props": [
        {
          "name": "size",
          "type": "{ small: string; medium: string; large: string; 'inline-edit': string; }",
          "required": false,
          "defaultValue": "large"
        },
        {
          "name": "loading",
          "type": "{ true: string; }",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "fullWidth",
          "type": "{ true: string; false: string; }",
          "required": false
        },
        {
          "name": "asChild",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "as",
          "type": "C | undefined",
          "required": false
        },
        {
          "name": "color",
          "type": "{ brand: string; neutral: string; 'neutral-alt': string; destructive: string; }",
          "required": false,
          "defaultValue": "brand"
        },
        {
          "name": "variant",
          "type": "{ primary: string; outline: string; ghost: string; secondary: string; }",
          "required": false,
          "defaultValue": "primary"
        }
      ],
      "variants": [
        {
          "name": "variant",
          "options": [
            "primary",
            "outline",
            "ghost",
            "secondary"
          ]
        },
        {
          "name": "color",
          "options": [
            "brand",
            "neutral",
            "neutral-alt",
            "destructive"
          ]
        }
      ],
      "subComponents": [],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\n\nexport const Basic = () => {\n  return (\n    <Button data-testid='button'>\n      Button\n    </Button>\n  );\n};",
          "storyFile": "Button/Button.stories.tsx",
          "storyTitle": "Actions/Button",
          "description": "A button with nothing set: you get the brand primary at the large size. Label it with a\nverb and its object — `Delete rule` rather than `Delete` — so the action still reads on its own."
        },
        {
          "name": "Variants",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Variants = () => (\n  <VStack>\n    <HStack>\n      <Button variant='primary' color='brand'>\n        Primary\n      </Button>\n      <Button variant='ghost' color='brand'>\n        Ghost\n      </Button>\n      <Button variant='secondary' color='brand'>\n        Secondary\n      </Button>\n    </HStack>\n    <HStack>\n      <Button variant='outline' color='neutral'>\n        Outline\n      </Button>\n      <Button variant='ghost' color='neutral'>\n        Ghost\n      </Button>\n      <Button variant='secondary' color='neutral'>\n        Secondary\n      </Button>\n    </HStack>\n    <HStack className='rounded-8 bg-component-toast-bg p-8'>\n      <Button variant='ghost' color='neutral-alt'>\n        Ghost\n      </Button>\n      <Button variant='secondary' color='neutral-alt'>\n        Secondary\n      </Button>\n    </HStack>\n    <HStack>\n      <Button variant='primary' color='destructive'>\n        Primary\n      </Button>\n      <Button variant='outline' color='destructive'>\n        Outline\n      </Button>\n      <Button variant='ghost' color='destructive'>\n        Ghost\n      </Button>\n      <Button variant='secondary' color='destructive'>\n        Secondary\n      </Button>\n    </HStack>\n  </VStack>\n);",
          "storyFile": "Button/Button.stories.tsx",
          "storyTitle": "Actions/Button",
          "description": "`variant` sets emphasis and `color` sets meaning, and only the pairings drawn here are\ndesigned: `primary` exists for `brand` and `destructive` only. `neutral-alt` has ghost and\nsecondary variants, shown on an inverted surface so they remain readable in both themes."
        },
        {
          "name": "Sizes",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { HStack } from '@wallarm-org/design-system/Stack';\n\nexport const Sizes = () => (\n  <HStack align='end' justify='center'>\n    <Button size='small'>\n      Small\n    </Button>\n    <Button size='medium'>\n      Medium\n    </Button>\n    <Button size='large'>\n      Large\n    </Button>\n  </HStack>\n);",
          "storyFile": "Button/Button.stories.tsx",
          "storyTitle": "Actions/Button",
          "description": "Three heights at identical emphasis; `large` is the default, and the smaller two are for\ndense contexts like table rows and toolbars where a full-height button would dominate."
        },
        {
          "name": "Disabled",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Disabled = () => (\n  <VStack>\n    <HStack>\n      <Button variant='primary' color='brand' disabled>\n        Primary\n      </Button>\n      <Button variant='ghost' color='brand' disabled>\n        Ghost\n      </Button>\n      <Button variant='secondary' color='brand' disabled>\n        Secondary\n      </Button>\n    </HStack>\n    <HStack>\n      <Button variant='outline' color='neutral' disabled>\n        Outline\n      </Button>\n      <Button variant='ghost' color='neutral' disabled>\n        Ghost\n      </Button>\n      <Button variant='secondary' color='neutral' disabled>\n        Secondary\n      </Button>\n    </HStack>\n    <HStack className='rounded-8 bg-component-toast-bg p-8'>\n      <Button variant='ghost' color='neutral-alt' disabled>\n        Ghost\n      </Button>\n      <Button variant='secondary' color='neutral-alt' disabled>\n        Secondary\n      </Button>\n    </HStack>\n    <HStack>\n      <Button variant='primary' color='destructive' disabled>\n        Primary\n      </Button>\n      <Button variant='outline' color='destructive' disabled>\n        Outline\n      </Button>\n      <Button variant='ghost' color='destructive' disabled>\n        Ghost\n      </Button>\n      <Button variant='secondary' color='destructive' disabled>\n        Secondary\n      </Button>\n    </HStack>\n  </VStack>\n);",
          "storyFile": "Button/Button.stories.tsx",
          "storyTitle": "Actions/Button",
          "description": "Every sanctioned pairing with the action unavailable. `disabled` also takes the button out\nof the tab order, so say somewhere on screen what would re-enable it rather than leaving the\nreader to guess."
        },
        {
          "name": "Loading",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Loading = () => (\n  <VStack>\n    <HStack>\n      <Button variant='primary' color='brand' loading>\n        Primary\n      </Button>\n      <Button variant='ghost' color='brand' loading>\n        Ghost\n      </Button>\n      <Button variant='secondary' color='brand' loading>\n        Secondary\n      </Button>\n    </HStack>\n    <HStack>\n      <Button variant='outline' color='neutral' loading>\n        Outline\n      </Button>\n      <Button variant='ghost' color='neutral' loading>\n        Ghost\n      </Button>\n      <Button variant='secondary' color='neutral' loading>\n        Secondary\n      </Button>\n    </HStack>\n    <HStack className='rounded-8 bg-component-toast-bg p-8'>\n      <Button variant='ghost' color='neutral-alt' loading>\n        Ghost\n      </Button>\n      <Button variant='secondary' color='neutral-alt' loading>\n        Secondary\n      </Button>\n    </HStack>\n    <HStack>\n      <Button variant='primary' color='destructive' loading>\n        Primary\n      </Button>\n      <Button variant='outline' color='destructive' loading>\n        Outline\n      </Button>\n      <Button variant='ghost' color='destructive' loading>\n        Ghost\n      </Button>\n      <Button variant='secondary' color='destructive' loading>\n        Secondary\n      </Button>\n    </HStack>\n  </VStack>\n);",
          "storyFile": "Button/Button.stories.tsx",
          "storyTitle": "Actions/Button",
          "description": "`loading` covers the content with a spinner but keeps the label's footprint, so the button\ndoesn't resize mid-request. It disables the button on its own — passing `disabled` as well is\nredundant."
        },
        {
          "name": "Icons",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { ChevronLeft, ChevronRight } from '@wallarm-org/design-system/icons';\nimport { HStack } from '@wallarm-org/design-system/Stack';\n\nexport const Icons = () => (\n  <HStack>\n    <Button>\n      <ChevronLeft />\n      Left icon\n    </Button>\n\n    <Button>\n      Right icon\n      <ChevronRight />\n    </Button>\n\n    <Button>\n      <ChevronLeft />2 icons\n      <ChevronRight />\n    </Button>\n  </HStack>\n);",
          "storyFile": "Button/Button.stories.tsx",
          "storyTitle": "Actions/Button",
          "description": "An icon before the label, after it, or both. The button sizes and spaces icons itself, so\npass the icon bare; and if one button in a row carries an icon, they all should."
        },
        {
          "name": "Badge",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { NumericBadge } from '@wallarm-org/design-system/NumericBadge';\n\nexport const Badge = () => (\n  <Button>\n    With badge\n    <NumericBadge type='outline'>1</NumericBadge>\n  </Button>\n);",
          "storyFile": "Button/Button.stories.tsx",
          "storyTitle": "Actions/Button",
          "description": "A `NumericBadge` after the label, for a count the action applies to. The button tightens\nits right padding whenever the last child isn't text, so a trailing badge or icon doesn't sit\nstranded."
        },
        {
          "name": "IconOnly",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { ChevronRight } from '@wallarm-org/design-system/icons';\nimport { HStack } from '@wallarm-org/design-system/Stack';\n\nexport const IconOnly = () => (\n  <HStack>\n    <Button>\n      <ChevronRight />\n    </Button>\n\n    <Button loading>\n      <ChevronRight />\n    </Button>\n\n    <Button disabled>\n      <ChevronRight />\n    </Button>\n  </HStack>\n);",
          "storyFile": "Button/Button.stories.tsx",
          "storyTitle": "Actions/Button",
          "description": "There is no `iconOnly` prop: a button whose only child is an icon squares itself off. Give\nit an `aria-label` naming the action and a `Tooltip`, since nothing on screen says what it does."
        },
        {
          "name": "LinkAsButton",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\n\nexport const LinkAsButton = () => (\n  <Button asChild>\n    <a href='https://google.com' target='_blank' rel='noopener noreferrer'>\n      Button as link\n    </a>\n  </Button>\n);",
          "storyFile": "Button/Button.stories.tsx",
          "storyTitle": "Actions/Button",
          "description": "`asChild` puts the button's styling on your own `<a>`, so the element stays a real link and\nmiddle-click and “open in new tab” keep working. Use it only when a navigation has to carry a\nbutton's weight; ordinary navigation is a `Link`."
        },
        {
          "name": "FullWidth",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\n\nexport const FullWidth = () => (\n  <div className='w-400'>\n    <Button fullWidth>\n      Full width example\n    </Button>\n  </div>\n);",
          "storyFile": "Button/Button.stories.tsx",
          "storyTitle": "Actions/Button",
          "description": "`fullWidth` fills the container, for narrow surfaces like a `Drawer` or a dialog footer\nrather than a wide desktop form. Two full-width buttons side by side split the row evenly\ninstead of overflowing it."
        }
      ]
    },
    {
      "name": "ButtonBase",
      "importPath": "@wallarm-org/design-system/ButtonBase",
      "props": [
        {
          "name": "size",
          "type": "{ small: string; medium: string; large: string; 'inline-edit': string; }",
          "required": false,
          "defaultValue": "large"
        },
        {
          "name": "loading",
          "type": "{ true: string; }",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "fullWidth",
          "type": "{ true: string; false: string; }",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "asChild",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "as",
          "type": "C | undefined",
          "required": false,
          "defaultValue": "button"
        }
      ],
      "variants": [
        {
          "name": "size",
          "options": [
            "small",
            "medium",
            "large",
            "inline-edit"
          ]
        },
        {
          "name": "iconOnly",
          "options": [
            "true",
            "false"
          ]
        },
        {
          "name": "loading",
          "options": [
            "true"
          ]
        },
        {
          "name": "hasNonTextEnd",
          "options": [
            "true",
            "false"
          ]
        },
        {
          "name": "fullWidth",
          "options": [
            "true",
            "false"
          ]
        }
      ],
      "subComponents": [],
      "examples": []
    },
    {
      "name": "Calendar",
      "description": "The month grid for choosing a date the reader needs to see in context — a weekday, a distance from today — where `DateInput` is for a date they already know. It is its own popover, so compose a trigger beside it rather than wrapping it in one, and take React Aria date objects rather than a JavaScript `Date`.",
      "importPath": "@wallarm-org/design-system/Calendar",
      "props": [
        {
          "name": "type",
          "type": "CalendarType | undefined",
          "required": false,
          "description": "Calendar type: 'single' for one month, 'range' for two months (date range selection)",
          "defaultValue": "single"
        },
        {
          "name": "showTime",
          "type": "boolean | undefined",
          "required": false,
          "description": "Show time selection (affects input placeholder text)",
          "defaultValue": "false"
        },
        {
          "name": "showKeyboardHints",
          "type": "boolean | undefined",
          "required": false,
          "description": "Show keyboard shortcut hints in presets and footer",
          "defaultValue": "true"
        },
        {
          "name": "value",
          "type": "DateValue[] | undefined",
          "required": false,
          "description": "Controlled value - array of selected dates"
        },
        {
          "name": "defaultValue",
          "type": "DateValue[] | undefined",
          "required": false,
          "description": "Default value for uncontrolled mode"
        },
        {
          "name": "onChange",
          "type": "complex",
          "required": false,
          "description": "Callback fired when selected value changes"
        },
        {
          "name": "minDate",
          "type": "DateValue | undefined",
          "required": false,
          "description": "Minimum selectable date"
        },
        {
          "name": "maxDate",
          "type": "DateValue | undefined",
          "required": false,
          "description": "Maximum selectable date"
        },
        {
          "name": "isDateUnavailable",
          "type": "complex",
          "required": false,
          "description": "Function to determine if a specific date should be unavailable/disabled.\nDateValue has year, month (1-12), and day properties.\nTo get day of week, use: new Date(date.year, date.month - 1, date.day).getDay()\nwhere Sunday = 0, Saturday = 6."
        },
        {
          "name": "disallowDisabledDatesInRange",
          "type": "boolean | undefined",
          "required": false,
          "description": "When true, prevents selecting a range that contains any unavailable dates.\nRequires controlled mode (value + onChange props) to work properly.",
          "defaultValue": "false"
        },
        {
          "name": "open",
          "type": "boolean | undefined",
          "required": false,
          "description": "Controlled open state of the calendar popover"
        },
        {
          "name": "defaultOpen",
          "type": "boolean | undefined",
          "required": false,
          "description": "Default open state for uncontrolled mode"
        },
        {
          "name": "onOpenChange",
          "type": "((open: boolean) => void) | undefined",
          "required": false,
          "description": "Callback fired when popover open state changes"
        },
        {
          "name": "closeOnSelect",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether to close calendar on date selection. Default: true",
          "defaultValue": "true"
        },
        {
          "name": "readonly",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether calendar is readonly (display only, no date selection allowed). Default: false",
          "defaultValue": "false"
        },
        {
          "name": "focusedValue",
          "type": "DateValue | undefined",
          "required": false,
          "description": "Controlled focused date — navigates the calendar view to this date"
        }
      ],
      "variants": [],
      "subComponents": [
        {
          "name": "CalendarApplyButton",
          "props": [
            {
              "name": "onClick",
              "type": "(() => void) | undefined",
              "required": false,
              "description": "Callback fired before closing calendar"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "color",
              "type": "string | undefined",
              "required": false,
              "defaultValue": "brand"
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "size",
              "type": "{ small: string; medium: string; large: string; 'inline-edit': string; }",
              "required": false,
              "defaultValue": "small"
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "variant",
              "type": "{ primary: string; outline: string; ghost: string; secondary: string; }",
              "required": false,
              "defaultValue": "primary"
            },
            {
              "name": "loading",
              "type": "{ true: string; }",
              "required": false
            },
            {
              "name": "as",
              "type": "C | undefined",
              "required": false
            },
            {
              "name": "fullWidth",
              "type": "{ true: string; false: string; }",
              "required": false
            }
          ]
        },
        {
          "name": "CalendarBody",
          "props": []
        },
        {
          "name": "CalendarContent",
          "props": []
        },
        {
          "name": "CalendarFooter",
          "props": []
        },
        {
          "name": "CalendarFooterControls",
          "props": []
        },
        {
          "name": "CalendarGrids",
          "props": []
        },
        {
          "name": "CalendarInputHeader",
          "props": []
        },
        {
          "name": "CalendarKeyboardHints",
          "props": []
        },
        {
          "name": "CalendarPresetItem",
          "props": [
            {
              "name": "label",
              "type": "string",
              "required": true,
              "description": "Display label for the preset"
            },
            {
              "name": "value",
              "type": "PresetValue",
              "required": true,
              "description": "Preset value - dates array or named preset string"
            },
            {
              "name": "shortcut",
              "type": "string | undefined",
              "required": false,
              "description": "Keyboard shortcut key"
            },
            {
              "name": "showShortcut",
              "type": "boolean | undefined",
              "required": false,
              "description": "Whether to display the shortcut badge",
              "defaultValue": "true"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "CalendarPresets",
          "props": [
            {
              "name": "presets",
              "type": "PresetConfig[] | undefined",
              "required": false,
              "description": "Array of preset configurations. Defaults to DEFAULT_SINGLE_PRESETS or DEFAULT_RANGE_PRESETS based on calendar type"
            },
            {
              "name": "showShortcuts",
              "type": "boolean | undefined",
              "required": false,
              "description": "Whether to show keyboard shortcuts next to presets",
              "defaultValue": "true"
            }
          ]
        },
        {
          "name": "CalendarResetButton",
          "props": [
            {
              "name": "onClick",
              "type": "(() => void) | undefined",
              "required": false,
              "description": "Callback fired after reset (in addition to clearing value)"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "color",
              "type": "string | undefined",
              "required": false,
              "defaultValue": "neutral"
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "size",
              "type": "{ small: string; medium: string; large: string; 'inline-edit': string; }",
              "required": false,
              "defaultValue": "small"
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "variant",
              "type": "{ primary: string; outline: string; ghost: string; secondary: string; }",
              "required": false,
              "defaultValue": "ghost"
            },
            {
              "name": "loading",
              "type": "{ true: string; }",
              "required": false
            },
            {
              "name": "as",
              "type": "C | undefined",
              "required": false
            },
            {
              "name": "fullWidth",
              "type": "{ true: string; false: string; }",
              "required": false
            }
          ]
        },
        {
          "name": "CalendarTrigger",
          "props": [
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "description": "Additional props passed to the trigger wrapper",
              "defaultValue": "true"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Single",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Calendar, CalendarBody, CalendarContent, CalendarGrids, CalendarTrigger } from '@wallarm-org/design-system/Calendar';\nimport { Calendar as CalendarIcon } from '@wallarm-org/design-system/icons';\n\nexport const Single = () => (\n  <Calendar type='single' closeOnSelect={false}>\n    <CalendarTrigger>\n      <Button variant='outline' color='neutral'>\n        <CalendarIcon size='sm' />\n        Select date\n      </Button>\n    </CalendarTrigger>\n    <CalendarContent>\n      <CalendarBody>\n        <CalendarGrids />\n      </CalendarBody>\n    </CalendarContent>\n  </Calendar>\n);",
          "storyFile": "Calendar/Calendar.stories.tsx",
          "storyTitle": "Inputs Date/Calendar",
          "description": "One date. The grid earns its space when the reader is choosing by weekday or by distance from\ntoday rather than typing a date they know."
        },
        {
          "name": "Range",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Calendar, CalendarBody, CalendarContent, CalendarGrids, CalendarTrigger } from '@wallarm-org/design-system/Calendar';\nimport { Calendar as CalendarIcon } from '@wallarm-org/design-system/icons';\n\nexport const Range = () => (\n  <Calendar\n    type='range'\n    closeOnSelect={false}\n    defaultValue={[createDate(2025, 1, 15), createDate(2025, 2, 10)]}\n  >\n    <CalendarTrigger>\n      <Button variant='outline' color='neutral'>\n        <CalendarIcon size='sm' />\n        Select date range\n      </Button>\n    </CalendarTrigger>\n    <CalendarContent>\n      <CalendarBody>\n        <CalendarGrids />\n      </CalendarBody>\n    </CalendarContent>\n  </Calendar>\n);",
          "storyFile": "Calendar/Calendar.stories.tsx",
          "storyTitle": "Inputs Date/Calendar",
          "description": "A start and an end in one grid, with the span drawn between them. Two months show at once so\na range crossing a boundary can be chosen without paging."
        },
        {
          "name": "RangeWithPresets",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Calendar, DEFAULT_RANGE_PRESETS, CalendarBody, CalendarContent, CalendarGrids, CalendarPresets, CalendarTrigger } from '@wallarm-org/design-system/Calendar';\nimport { Calendar as CalendarIcon } from '@wallarm-org/design-system/icons';\n\nexport const RangeWithPresets = () => (\n  <Calendar type='range' closeOnSelect={false}>\n    <CalendarTrigger>\n      <Button variant='outline' color='neutral'>\n        <CalendarIcon size='sm' />\n        Select date range\n      </Button>\n    </CalendarTrigger>\n    <CalendarContent>\n      <CalendarPresets presets={DEFAULT_RANGE_PRESETS} />\n      <CalendarBody>\n        <CalendarGrids />\n      </CalendarBody>\n    </CalendarContent>\n  </Calendar>\n);",
          "storyFile": "Calendar/Calendar.stories.tsx",
          "storyTitle": "Inputs Date/Calendar",
          "description": "`CalendarPresets` alongside the grid. The shipped defaults cover the ranges people actually\nask for — last week, this month, last 90 days — so reach for them before writing your own."
        },
        {
          "name": "RangeWithInput",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Calendar, CalendarBody, CalendarContent, CalendarGrids, CalendarInputHeader, CalendarTrigger } from '@wallarm-org/design-system/Calendar';\nimport { Calendar as CalendarIcon } from '@wallarm-org/design-system/icons';\n\nexport const RangeWithInput = () => (\n  <Calendar type='range' closeOnSelect={false}>\n    <CalendarTrigger>\n      <Button variant='outline' color='neutral'>\n        <CalendarIcon size='sm' />\n        Select date range\n      </Button>\n    </CalendarTrigger>\n    <CalendarContent>\n      <CalendarBody>\n        <CalendarInputHeader />\n        <CalendarGrids />\n      </CalendarBody>\n    </CalendarContent>\n  </Calendar>\n);",
          "storyFile": "Calendar/Calendar.stories.tsx",
          "storyTitle": "Inputs Date/Calendar",
          "description": "`CalendarInputHeader` puts a typed field above the grid, so the same popover serves both a\nreader who knows the dates and one who needs to look."
        },
        {
          "name": "RangeWithFooter",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Calendar, CalendarApplyButton, CalendarBody, CalendarContent, CalendarFooter, CalendarFooterControls, CalendarGrids, CalendarKeyboardHints, CalendarResetButton, CalendarTrigger } from '@wallarm-org/design-system/Calendar';\nimport { Calendar as CalendarIcon } from '@wallarm-org/design-system/icons';\n\nexport const RangeWithFooter = () => {\n  const [value, setValue] = useState<DateValue[]>([]);\n\n  return (\n    <Calendar type='range' value={value} onChange={setValue}>\n      <CalendarTrigger>\n        <Button variant='outline' color='neutral'>\n          <CalendarIcon size='sm' />\n          Select date range\n        </Button>\n      </CalendarTrigger>\n      <CalendarContent>\n        <CalendarBody>\n          <CalendarGrids />\n          <CalendarFooter>\n            <CalendarKeyboardHints />\n            <CalendarFooterControls>\n              <CalendarResetButton onClick={() => setValue([])} />\n              <CalendarApplyButton />\n            </CalendarFooterControls>\n          </CalendarFooter>\n        </CalendarBody>\n      </CalendarContent>\n    </Calendar>\n  );\n};",
          "storyFile": "Calendar/Calendar.stories.tsx",
          "storyTitle": "Inputs Date/Calendar",
          "description": "`CalendarFooter` holds Reset and Apply, which turns the grid into a deliberate commit —\nnothing changes underneath the reader until they apply it."
        },
        {
          "name": "RangeFullFeatured",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Calendar, DEFAULT_RANGE_PRESETS, CalendarApplyButton, CalendarBody, CalendarContent, CalendarFooter, CalendarFooterControls, CalendarGrids, CalendarInputHeader, CalendarKeyboardHints, CalendarPresets, CalendarResetButton, CalendarTrigger } from '@wallarm-org/design-system/Calendar';\nimport { Calendar as CalendarIcon } from '@wallarm-org/design-system/icons';\n\nexport const RangeFullFeatured = () => {\n  const [value, setValue] = useState<DateValue[]>([]);\n\n  return (\n    <Calendar type='range' value={value} onChange={setValue}>\n      <CalendarTrigger>\n        <Button variant='outline' color='neutral'>\n          <CalendarIcon size='sm' />\n          Select date range\n        </Button>\n      </CalendarTrigger>\n      <CalendarContent>\n        <CalendarPresets presets={DEFAULT_RANGE_PRESETS} />\n        <CalendarBody>\n          <CalendarInputHeader />\n          <CalendarGrids />\n          <CalendarFooter>\n            <CalendarKeyboardHints />\n            <CalendarFooterControls>\n              <CalendarResetButton onClick={() => setValue([])} />\n              <CalendarApplyButton />\n            </CalendarFooterControls>\n          </CalendarFooter>\n        </CalendarBody>\n      </CalendarContent>\n    </Calendar>\n  );\n};",
          "storyFile": "Calendar/Calendar.stories.tsx",
          "storyTitle": "Inputs Date/Calendar",
          "description": "Presets, input header and footer together, which is the shape a filter bar wants. Everything\nelse on this page is a subset of it."
        },
        {
          "name": "SingleWithInput",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Calendar, CalendarBody, CalendarContent, CalendarGrids, CalendarInputHeader, CalendarTrigger } from '@wallarm-org/design-system/Calendar';\nimport { Calendar as CalendarIcon } from '@wallarm-org/design-system/icons';\n\nexport const SingleWithInput = () => (\n  <Calendar type='single' closeOnSelect={false}>\n    <CalendarTrigger>\n      <Button variant='outline' color='neutral'>\n        <CalendarIcon size='sm' />\n        Select date\n      </Button>\n    </CalendarTrigger>\n    <CalendarContent>\n      <CalendarBody>\n        <CalendarInputHeader />\n        <CalendarGrids />\n      </CalendarBody>\n    </CalendarContent>\n  </Calendar>\n);",
          "storyFile": "Calendar/Calendar.stories.tsx",
          "storyTitle": "Inputs Date/Calendar",
          "description": "The typed header on a single calendar, for the same reason as the range: the reader chooses\nhow to answer."
        },
        {
          "name": "SingleWithDateTime",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Calendar, CalendarBody, CalendarContent, CalendarGrids, CalendarInputHeader, CalendarTrigger } from '@wallarm-org/design-system/Calendar';\nimport { Calendar as CalendarIcon } from '@wallarm-org/design-system/icons';\n\nexport const SingleWithDateTime = () => (\n  <Calendar type='single' showTime closeOnSelect={false}>\n    <CalendarTrigger>\n      <Button variant='outline' color='neutral'>\n        <CalendarIcon size='sm' />\n        Select date and time\n      </Button>\n    </CalendarTrigger>\n    <CalendarContent>\n      <CalendarBody>\n        <CalendarInputHeader />\n        <CalendarGrids />\n      </CalendarBody>\n    </CalendarContent>\n  </Calendar>\n);",
          "storyFile": "Calendar/Calendar.stories.tsx",
          "storyTitle": "Inputs Date/Calendar",
          "description": "`showTime` adds a time to the date, for a moment rather than a day. Ask for it only where the\ntime genuinely changes the result."
        },
        {
          "name": "SingleWithPresets",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Calendar, CalendarBody, CalendarContent, CalendarGrids, CalendarPresets, CalendarTrigger } from '@wallarm-org/design-system/Calendar';\nimport { Calendar as CalendarIcon } from '@wallarm-org/design-system/icons';\n\nexport const SingleWithPresets = () => (\n  <Calendar type='single' closeOnSelect={false}>\n    <CalendarTrigger>\n      <Button variant='outline' color='neutral'>\n        <CalendarIcon size='sm' />\n        Select date\n      </Button>\n    </CalendarTrigger>\n    <CalendarContent>\n      <CalendarPresets />\n      <CalendarBody>\n        <CalendarGrids />\n      </CalendarBody>\n    </CalendarContent>\n  </Calendar>\n);",
          "storyFile": "Calendar/Calendar.stories.tsx",
          "storyTitle": "Inputs Date/Calendar",
          "description": "Single-date presets — today, yesterday, first of the month — which answer the questions a\nsingle date usually stands for."
        },
        {
          "name": "RangeWithDisabledDates",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Calendar, CalendarBody, CalendarContent, CalendarGrids, CalendarTrigger } from '@wallarm-org/design-system/Calendar';\nimport { Calendar as CalendarIcon } from '@wallarm-org/design-system/icons';\n\nexport const RangeWithDisabledDates = () => (\n  <Calendar\n    type='range'\n    closeOnSelect={false}\n    isDateUnavailable={date => {\n      const dayOfWeek = new Date(date.year, date.month - 1, date.day).getDay();\n      return dayOfWeek === 0 || dayOfWeek === 6;\n    }}\n  >\n    <CalendarTrigger>\n      <Button variant='outline' color='neutral'>\n        <CalendarIcon size='sm' />\n        Select date range (weekends disabled)\n      </Button>\n    </CalendarTrigger>\n    <CalendarContent>\n      <CalendarBody>\n        <CalendarGrids />\n      </CalendarBody>\n    </CalendarContent>\n  </Calendar>\n);",
          "storyFile": "Calendar/Calendar.stories.tsx",
          "storyTitle": "Inputs Date/Calendar",
          "description": "`isDateUnavailable` greys out dates that cannot be chosen. Show them rather than hiding them,\nso the reader can see the shape of what is allowed."
        },
        {
          "name": "RangeDisallowDisabled",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Calendar, CalendarBody, CalendarContent, CalendarGrids, CalendarTrigger } from '@wallarm-org/design-system/Calendar';\nimport { Calendar as CalendarIcon } from '@wallarm-org/design-system/icons';\n\nexport const RangeDisallowDisabled = () => {\n  const [value, setValue] = useState<DateValue[]>([]);\n\n  const isWeekend = (date: DateValue) => {\n    const dayOfWeek = new Date(date.year, date.month - 1, date.day).getDay();\n    return dayOfWeek === 0 || dayOfWeek === 6;\n  };\n\n  return (\n    <Calendar\n      type='range'\n      closeOnSelect={false}\n      value={value}\n      onChange={setValue}\n      isDateUnavailable={isWeekend}\n      disallowDisabledDatesInRange\n    >\n      <CalendarTrigger>\n        <Button variant='outline' color='neutral'>\n          <CalendarIcon size='sm' />\n          Range cannot span weekends\n        </Button>\n      </CalendarTrigger>\n      <CalendarContent>\n        <CalendarBody>\n          <CalendarGrids />\n        </CalendarBody>\n      </CalendarContent>\n    </Calendar>\n  );\n};",
          "storyFile": "Calendar/Calendar.stories.tsx",
          "storyTitle": "Inputs Date/Calendar",
          "description": "A range refusing to span an unavailable date, which needs controlled mode. Use it where\ncrossing the gap would produce a period the system cannot honour."
        },
        {
          "name": "RangeControlled",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Calendar, DEFAULT_RANGE_PRESETS, CalendarApplyButton, CalendarBody, CalendarContent, CalendarFooter, CalendarFooterControls, CalendarGrids, CalendarInputHeader, CalendarKeyboardHints, CalendarPresets, CalendarResetButton, CalendarTrigger } from '@wallarm-org/design-system/Calendar';\nimport { Calendar as CalendarIcon } from '@wallarm-org/design-system/icons';\n\nexport const RangeControlled = () => {\n  const [value, setValue] = useState<DateValue[]>([]);\n  const [open, setOpen] = useState(false);\n\n  const getButtonLabel = () => {\n    if (!value || value.length === 0 || !value[0]) return 'Select date range';\n    if (value.length === 1 || !value[1]) return value[0].toString();\n    return `${value[0].toString()} - ${value[1].toString()}`;\n  };\n\n  return (\n    <Calendar type='range' value={value} onChange={setValue} open={open} onOpenChange={setOpen}>\n      <CalendarTrigger>\n        <Button variant='outline' color='neutral'>\n          <CalendarIcon size='sm' />\n          {getButtonLabel()}\n        </Button>\n      </CalendarTrigger>\n      <CalendarContent>\n        <CalendarPresets presets={DEFAULT_RANGE_PRESETS} />\n        <CalendarBody>\n          <CalendarInputHeader />\n          <CalendarGrids />\n          <CalendarFooter>\n            <CalendarKeyboardHints />\n            <CalendarFooterControls>\n              <CalendarResetButton onClick={() => setValue([])} />\n              <CalendarApplyButton onClick={() => setOpen(false)} />\n            </CalendarFooterControls>\n          </CalendarFooter>\n        </CalendarBody>\n      </CalendarContent>\n    </Calendar>\n  );\n};",
          "storyFile": "Calendar/Calendar.stories.tsx",
          "storyTitle": "Inputs Date/Calendar",
          "description": "Owning the value, which is what presets, Apply and disallowed spans all require — the\nuncontrolled form is only for the simplest case."
        },
        {
          "name": "SingleCustomPresets",
          "code": "import { getLocalTimeZone, today } from '@internationalized/date';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Calendar, CalendarBody, CalendarContent, CalendarGrids, CalendarPresetItem, CalendarPresets, CalendarTrigger } from '@wallarm-org/design-system/Calendar';\nimport { Calendar as CalendarIcon } from '@wallarm-org/design-system/icons';\n\nexport const SingleCustomPresets = () => {\n  const now = today(getLocalTimeZone()) as unknown as DateValue;\n\n  return (\n    <Calendar type='single' closeOnSelect={false}>\n      <CalendarTrigger>\n        <Button variant='outline' color='neutral'>\n          <CalendarIcon size='sm' />\n          Select date\n        </Button>\n      </CalendarTrigger>\n      <CalendarContent>\n        <CalendarPresets>\n          <CalendarPresetItem label='Today' value={[now]} shortcut='T' />\n          <CalendarPresetItem\n            label='Tomorrow'\n            value={[\n              createDate(\n                new Date().getFullYear(),\n                new Date().getMonth() + 1,\n                new Date().getDate() + 1,\n              ),\n            ]}\n            shortcut='O'\n          />\n          <CalendarPresetItem\n            label='Next Week'\n            value={[\n              createDate(\n                new Date().getFullYear(),\n                new Date().getMonth() + 1,\n                new Date().getDate() + 7,\n              ),\n            ]}\n            shortcut='W'\n          />\n          <CalendarPresetItem\n            label='Next Month'\n            value={[\n              createDate(new Date().getFullYear(), new Date().getMonth() + 2, new Date().getDate()),\n            ]}\n            shortcut='M'\n          />\n        </CalendarPresets>\n        <CalendarBody>\n          <CalendarGrids />\n        </CalendarBody>\n      </CalendarContent>\n    </Calendar>\n  );\n};",
          "storyFile": "Calendar/Calendar.stories.tsx",
          "storyTitle": "Inputs Date/Calendar",
          "description": "Your own preset list, for domain periods the defaults do not cover. Keep the labels as plain\nas the shipped ones."
        },
        {
          "name": "RangeReadonly",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Calendar, CalendarBody, CalendarContent, CalendarGrids, CalendarTrigger } from '@wallarm-org/design-system/Calendar';\nimport { Calendar as CalendarIcon } from '@wallarm-org/design-system/icons';\n\nexport const RangeReadonly = () => (\n  <Calendar\n    type='range'\n    readonly\n    defaultOpen\n    defaultValue={[createDate(2025, 1, 10), createDate(2025, 1, 20)]}\n  >\n    <CalendarTrigger>\n      <Button variant='outline' color='neutral'>\n        <CalendarIcon size='sm' />\n        View date range\n      </Button>\n    </CalendarTrigger>\n    <CalendarContent>\n      <CalendarBody>\n        <CalendarGrids />\n      </CalendarBody>\n    </CalendarContent>\n  </Calendar>\n);",
          "storyFile": "Calendar/Calendar.stories.tsx",
          "storyTitle": "Inputs Date/Calendar",
          "description": "A range shown but not editable, for a period the reader needs to read back rather than\nchange."
        },
        {
          "name": "RangeReadonlyWithPresets",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Calendar, DEFAULT_RANGE_PRESETS, CalendarBody, CalendarContent, CalendarGrids, CalendarPresets, CalendarTrigger } from '@wallarm-org/design-system/Calendar';\nimport { Calendar as CalendarIcon } from '@wallarm-org/design-system/icons';\n\nexport const RangeReadonlyWithPresets = () => (\n  <Calendar\n    type='range'\n    readonly\n    defaultOpen\n    defaultValue={[createDate(2025, 1, 5), createDate(2025, 1, 15)]}\n  >\n    <CalendarTrigger>\n      <Button variant='outline' color='neutral'>\n        <CalendarIcon size='sm' />\n        View date range\n      </Button>\n    </CalendarTrigger>\n    <CalendarContent>\n      <CalendarPresets presets={DEFAULT_RANGE_PRESETS} />\n      <CalendarBody>\n        <CalendarGrids />\n      </CalendarBody>\n    </CalendarContent>\n  </Calendar>\n);",
          "storyFile": "Calendar/Calendar.stories.tsx",
          "storyTitle": "Inputs Date/Calendar",
          "description": "The same, with presets rendered but inert — worth seeing, because a live-looking preset that\ndoes nothing is worse than none."
        },
        {
          "name": "SingleReadonly",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Calendar, CalendarBody, CalendarContent, CalendarGrids, CalendarTrigger } from '@wallarm-org/design-system/Calendar';\nimport { Calendar as CalendarIcon } from '@wallarm-org/design-system/icons';\n\nexport const SingleReadonly = () => (\n  <Calendar type='single' readonly defaultOpen defaultValue={[createDate(2025, 1, 15)]}>\n    <CalendarTrigger>\n      <Button variant='outline' color='neutral'>\n        <CalendarIcon size='sm' />\n        View date\n      </Button>\n    </CalendarTrigger>\n    <CalendarContent>\n      <CalendarBody>\n        <CalendarGrids />\n      </CalendarBody>\n    </CalendarContent>\n  </Calendar>\n);",
          "storyFile": "Calendar/Calendar.stories.tsx",
          "storyTitle": "Inputs Date/Calendar",
          "description": "A single date shown but not editable."
        }
      ]
    },
    {
      "name": "Card",
      "description": "Holds one self-contained thing — a metric, an integration, a saved view — in a block you can compare against its neighbours in a grid; reach for `Table` when the same fields repeat down a list, and for a `Heading` when you only mean to section a page. Passing any handler turns the whole card into the target: it becomes focusable and picks up hover and pressed overlays, while clicks on a link or button inside it stay with that control.",
      "importPath": "@wallarm-org/design-system/Card",
      "props": [
        {
          "name": "asChild",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "disabled",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "onClick",
          "type": "MouseEventHandler<HTMLDivElement> | undefined",
          "required": false
        },
        {
          "name": "color",
          "type": "{ primary: string; secondary: string; }",
          "required": false,
          "defaultValue": "primary"
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "color",
          "options": [
            "primary",
            "secondary"
          ],
          "defaultValue": "primary"
        },
        {
          "name": "interactive",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        },
        {
          "name": "disabled",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        }
      ],
      "subComponents": [
        {
          "name": "CardContent",
          "props": [
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "defaultValue": "false"
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "CardFooter",
          "props": [
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "defaultValue": "false"
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "CardHeader",
          "props": [
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "defaultValue": "false"
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "CardTitle",
          "props": [
            {
              "name": "icon",
              "type": "ReactNode",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Basic",
          "code": "import { type MouseEvent, useState } from 'react';\nimport { Badge } from '@wallarm-org/design-system/Badge';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Card, CardContent, CardFooter, CardHeader, CardTitle } from '@wallarm-org/design-system/Card';\n\nexport const Basic = () => {\n  // `data-last-click` records which target handled the click. It renders nothing,\n  // and it is what the click-isolation e2e asserts on — the story used to prove\n  // the same thing by writing to the console.\n  const [lastClick, setLastClick] = useState<'card' | 'button' | 'none'>('none');\n\n  return (\n    <Card\n      data-testid='card'\n      onClick={e => {\n        onCardClick(e);\n        setLastClick('card');\n      }}\n      data-last-click={lastClick}\n    >\n      <CardHeader>\n        <CardTitle>Card title</CardTitle>\n        <Badge size='medium' type='solid' color='slate'>\n          Badge\n        </Badge>\n      </CardHeader>\n\n      <CardContent>Card description</CardContent>\n\n      <CardFooter>\n        <Button\n          variant='secondary'\n          color='neutral'\n          onClick={(e: MouseEvent<HTMLButtonElement>) => {\n            onButtonClick(e);\n            setLastClick('button');\n          }}\n        >\n          Button\n        </Button>\n      </CardFooter>\n    </Card>\n  );\n};",
          "storyFile": "Card/Card.stories.tsx",
          "storyTitle": "Data Display/Card",
          "description": "The full stack — `CardHeader` with a `CardTitle`, `CardContent`, and a `CardFooter`\nfor actions — carrying a handler, so the footer button and the card are two\nseparate targets."
        },
        {
          "name": "Variants",
          "code": "import { Badge } from '@wallarm-org/design-system/Badge';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Card, CardContent, CardFooter, CardHeader, CardTitle } from '@wallarm-org/design-system/Card';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Variants = () => (\n  <VStack gap={24} align='center'>\n    <HStack gap={16} align='center'>\n      <Card color='primary'>\n        <CardHeader>\n          <CardTitle>Primary card</CardTitle>\n          <Badge size='medium' type='solid' color='slate'>\n            Badge\n          </Badge>\n        </CardHeader>\n        <CardContent>This is a primary card variant</CardContent>\n        <CardFooter>\n          <Button variant='secondary' size='small' color='neutral'>\n            Button\n          </Button>\n        </CardFooter>\n      </Card>\n\n      <Card color='secondary'>\n        <CardHeader>\n          <CardTitle>Secondary card</CardTitle>\n          <Badge size='medium' type='solid' color='slate'>\n            Badge\n          </Badge>\n        </CardHeader>\n        <CardContent>This is a secondary card variant</CardContent>\n        <CardFooter>\n          <Button variant='secondary' size='small' color='neutral'>\n            Button\n          </Button>\n        </CardFooter>\n      </Card>\n    </HStack>\n\n    <HStack gap={16} align='center'>\n      <Card color='primary' onClick={onCardClick}>\n        <CardHeader>\n          <CardTitle>Primary card</CardTitle>\n          <Badge size='medium' type='solid' color='slate'>\n            Badge\n          </Badge>\n        </CardHeader>\n        <CardContent>This is a primary card variant with onClick event</CardContent>\n        <CardFooter>\n          <Button variant='secondary' size='small' color='neutral'>\n            Button\n          </Button>\n        </CardFooter>\n      </Card>\n\n      <Card color='secondary' onClick={onCardClick}>\n        <CardHeader>\n          <CardTitle>Secondary card</CardTitle>\n          <Badge size='medium' type='solid' color='slate'>\n            Badge\n          </Badge>\n        </CardHeader>\n        <CardContent>This is a secondary card variant with onClick event</CardContent>\n        <CardFooter>\n          <Button variant='secondary' size='small' color='neutral'>\n            Button\n          </Button>\n        </CardFooter>\n      </Card>\n    </HStack>\n\n    <HStack gap={16} align='center'>\n      <Card data-testid='disabled-card' color='primary' disabled onClick={onCardClick}>\n        <CardHeader>\n          <CardTitle>Primary card</CardTitle>\n          <Badge size='medium' type='solid' color='slate'>\n            Badge\n          </Badge>\n        </CardHeader>\n        <CardContent>This is a disabled primary card variant</CardContent>\n        <CardFooter>\n          <Button variant='secondary' size='small' color='neutral'>\n            Button\n          </Button>\n        </CardFooter>\n      </Card>\n\n      <Card data-testid='disabled-card' color='secondary' disabled onClick={onCardClick}>\n        <CardHeader>\n          <CardTitle>Secondary card</CardTitle>\n          <Badge size='medium' type='solid' color='slate'>\n            Badge\n          </Badge>\n        </CardHeader>\n        <CardContent>This is a disabled secondary card variant</CardContent>\n        <CardFooter>\n          <Button variant='secondary' size='small' color='neutral'>\n            Button\n          </Button>\n        </CardFooter>\n      </Card>\n    </HStack>\n  </VStack>\n);",
          "storyFile": "Card/Card.stories.tsx",
          "storyTitle": "Data Display/Card",
          "description": "`primary` sits on the page surface and `secondary` on a tinted fill, each shown\nplain, with a handler, and disabled — where the card fades and stops answering\nthe pointer."
        },
        {
          "name": "VariousContent",
          "code": "import { Badge } from '@wallarm-org/design-system/Badge';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Card, CardContent, CardFooter, CardHeader, CardTitle } from '@wallarm-org/design-system/Card';\nimport { CodeSnippetActions, CodeSnippetCode, CodeSnippetContent, CodeSnippetCopyButton, CodeSnippetRoot } from '@wallarm-org/design-system/CodeSnippet';\nimport { Field, FieldDescription, FieldLabel } from '@wallarm-org/design-system/Field';\nimport { CircleDashed } from '@wallarm-org/design-system/icons';\nimport { Input } from '@wallarm-org/design-system/Input';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const VariousContent = () => (\n  <HStack gap={16}>\n    <VStack gap={16} align='stretch'>\n      <Card data-testid='card'>\n        <CardHeader>\n          <CardTitle>Card title</CardTitle>\n          <Badge size='medium' type='solid' color='slate'>\n            Badge\n          </Badge>\n        </CardHeader>\n        <CardContent>\n          Card description Very long! Even if it goes to the second line, it won't break anything.\n          It works perfectly! Can you see? Amazing yeah?\n        </CardContent>\n        <CardFooter>\n          <Button variant='secondary' size='small' color='neutral'>\n            Button\n          </Button>\n        </CardFooter>\n      </Card>\n\n      <Card>\n        <CardHeader>\n          <CardTitle>Card title</CardTitle>\n        </CardHeader>\n        <CardContent>\n          <CodeSnippetRoot code='npx wasd-new@latest add code-snippet' language='bash'>\n            <CodeSnippetActions>\n              <CodeSnippetCopyButton />\n            </CodeSnippetActions>\n            <CodeSnippetContent>\n              <CodeSnippetCode />\n            </CodeSnippetContent>\n          </CodeSnippetRoot>\n        </CardContent>\n        <CardFooter>\n          <Button variant='secondary' size='small' color='neutral'>\n            Button\n          </Button>\n        </CardFooter>\n      </Card>\n    </VStack>\n\n    <Card>\n      <CardHeader>\n        <CardTitle>Card title</CardTitle>\n        <Badge size='medium' type='solid' color='slate'>\n          Badge\n        </Badge>\n      </CardHeader>\n      <CardContent>\n        <Field>\n          <FieldLabel>Label</FieldLabel>\n          <Input placeholder='Placeholder' />\n          <FieldDescription>Input description</FieldDescription>\n        </Field>\n      </CardContent>\n      <CardFooter>\n        <Button variant='secondary' size='small' color='neutral'>\n          Button\n        </Button>\n      </CardFooter>\n    </Card>\n\n    <VStack gap={16}>\n      <Card>\n        <CardHeader>\n          <CardTitle icon={<CircleDashed />}>Card title</CardTitle>\n        </CardHeader>\n        <CardContent>Card description.</CardContent>\n      </Card>\n\n      <Card>\n        <CardHeader>\n          <CardTitle icon={<CircleDashed />}>Card title</CardTitle>\n        </CardHeader>\n      </Card>\n    </VStack>\n  </HStack>\n);",
          "storyFile": "Card/Card.stories.tsx",
          "storyTitle": "Data Display/Card",
          "description": "What the block tolerates: body copy that wraps, a `CodeSnippet`, a whole `Field`,\na `CardTitle` with an `icon`, and a header standing on its own with nothing under it."
        }
      ]
    },
    {
      "name": "ChainOfThought",
      "description": "A read-only log of what Wally did while answering — searches, tool calls, its own reasoning — so the user can see how it got there without the steps crowding the answer. Each `ChainOfThoughtStep` is one line: a type icon, a label and an optional right-aligned metric, joined to the next step by a thin connector. A step with children becomes a collapsible trigger, and children can be another `ChainOfThought`, so runs nest as deep as the agent did. The app owns the mapping from step type to icon (see **Type Icons**); the DS only draws the row.",
      "importPath": "@wallarm-org/design-system/ChainOfThought",
      "props": [
        {
          "name": "type",
          "type": "\"a\" | \"i\" | \"1\" | \"A\" | \"I\" | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "simple",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        },
        {
          "name": "entered",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        },
        {
          "name": "interactive",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        },
        {
          "name": "status",
          "options": [
            "running",
            "done",
            "error"
          ],
          "defaultValue": "done"
        }
      ],
      "subComponents": [
        {
          "name": "ChainOfThoughtStep",
          "props": [
            {
              "name": "label",
              "type": "ReactNode",
              "required": true,
              "description": "Row text: 'Searched for ABC', 'Working...', 'Thought for 5s', 'Worked for 3m 45s'."
            },
            {
              "name": "icon",
              "type": "ReactNode",
              "required": false,
              "description": "16px type icon. Default `<CircleDashed />`. `null` = Figma \"Simple\" row (no icon cell, no connector).",
              "defaultValue": "DEFAULT_ICON"
            },
            {
              "name": "metric",
              "type": "ReactNode",
              "required": false,
              "description": "Right-aligned mono slot = Figma \"Simple-result\"."
            },
            {
              "name": "status",
              "type": "\"done\" | \"running\" | \"error\" | undefined",
              "required": false,
              "description": "`'running'` shimmers the label (Figma \"Working\"). `'error'` tints the label and icon danger\n(not in Figma yet; pending design review) and prefixes a visually hidden \"Error:\" for screen\nreaders; still word the label so it reads as a failure ('get_attacks failed'). Default `'done'`.\nReflected in the `li`'s `data-status`. A step that mounts as `'running'` gets `data-entered`\nand animates in (and fades its shimmer out on `'done'`); one mounted `'done'` renders static.",
              "defaultValue": "done"
            },
            {
              "name": "open",
              "type": "boolean | undefined",
              "required": false,
              "description": "Controlled open state of the nested content."
            },
            {
              "name": "defaultOpen",
              "type": "boolean | undefined",
              "required": false,
              "description": "Initial open state when uncontrolled. Default `false`.",
              "defaultValue": "false"
            },
            {
              "name": "onOpenChange",
              "type": "((open: boolean) => void) | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Basic",
          "code": "import { ChainOfThought, ChainOfThoughtStep } from '@wallarm-org/design-system/ChainOfThought';\nimport { Brain, Database, FileText, Search } from '@wallarm-org/design-system/icons';\n\nexport const Basic = () => (\n  <ChainOfThought data-testid='cot'>\n    <ChainOfThoughtStep icon={<Brain />} label='Thought for 5s' />\n    <ChainOfThoughtStep icon={<Search />} label='Searched for blocked requests' />\n    <ChainOfThoughtStep icon={<Database />} label='Queried attack events' />\n    <ChainOfThoughtStep icon={<FileText />} label='Read the policy for api.example.com' />\n  </ChainOfThought>\n);",
          "storyFile": "ChainOfThought/ChainOfThought.stories.tsx",
          "storyTitle": "AI/ChainOfThought",
          "description": "Icon steps joined by connectors; the last step drops its line."
        },
        {
          "name": "Nested",
          "code": "import { ChainOfThought, ChainOfThoughtStep } from '@wallarm-org/design-system/ChainOfThought';\nimport { Bot, Brain, FilePlus, ListChecks, Search, Wrench } from '@wallarm-org/design-system/icons';\n\nexport const Nested = () => (\n  <ChainOfThought data-testid='cot'>\n    <ChainOfThoughtStep icon={<Brain />} label='Thought for 5s' />\n    <ChainOfThoughtStep\n      icon={<Bot />}\n      label='Ran the triage subagent'\n      defaultOpen\n      data-testid='cot-subagent'\n    >\n      <ChainOfThought>\n        <ChainOfThoughtStep icon={<Search />} label='Searched for ABC' />\n        <ChainOfThoughtStep icon={<Wrench />} label='Called get_attacks' data-testid='cot-tool'>\n          <p>Returned 42 attacks over the last 24 hours.</p>\n        </ChainOfThoughtStep>\n        <ChainOfThoughtStep icon={<ListChecks />} label='Made a plan' />\n      </ChainOfThought>\n    </ChainOfThoughtStep>\n    <ChainOfThoughtStep\n      icon={<FilePlus />}\n      label='Created a rule draft'\n      data-testid='cot-collapsed'\n    >\n      <p>Draft rule blocks SQL injection on /api/v1/login.</p>\n    </ChainOfThoughtStep>\n  </ChainOfThought>\n);",
          "storyFile": "ChainOfThought/ChainOfThought.stories.tsx",
          "storyTitle": "AI/ChainOfThought",
          "description": "Steps with children toggle open; a nested chain can hold its own collapsible steps."
        },
        {
          "name": "SimpleRows",
          "code": "import { ChainOfThought, ChainOfThoughtStep } from '@wallarm-org/design-system/ChainOfThought';\n\nexport const SimpleRows = () => (\n  <ChainOfThought data-testid='cot'>\n    <ChainOfThoughtStep icon={null} label='Checked 3 applications' />\n    <ChainOfThoughtStep icon={null} label='Compared rule sets' />\n    <ChainOfThoughtStep icon={null} label='Found 2 overlapping rules' />\n  </ChainOfThought>\n);",
          "storyFile": "ChainOfThought/ChainOfThought.stories.tsx",
          "storyTitle": "AI/ChainOfThought",
          "description": "`icon={null}` gives the Figma \"Simple\" row: no icon cell, no connector, 16px apart."
        },
        {
          "name": "SimpleResult",
          "code": "import { ChainOfThought, ChainOfThoughtStep } from '@wallarm-org/design-system/ChainOfThought';\n\nexport const SimpleResult = () => (\n  <ChainOfThought data-testid='cot'>\n    <ChainOfThoughtStep icon={null} label='Scanned endpoints' metric='1,204' />\n    <ChainOfThoughtStep icon={null} label='Matched attacks' metric='42' />\n    <ChainOfThoughtStep icon={null} label='Elapsed' metric='3m 45s' />\n  </ChainOfThought>\n);",
          "storyFile": "ChainOfThought/ChainOfThought.stories.tsx",
          "storyTitle": "AI/ChainOfThought",
          "description": "`metric` adds a right-aligned mono value — the Figma \"Simple-result\" row."
        },
        {
          "name": "Working",
          "code": "import { ChainOfThought, ChainOfThoughtStep } from '@wallarm-org/design-system/ChainOfThought';\nimport { Globe, Search } from '@wallarm-org/design-system/icons';\n\nexport const Working = () => (\n  <ChainOfThought data-testid='cot'>\n    <ChainOfThoughtStep icon={<Search />} label='Searched for ABC' />\n    <ChainOfThoughtStep icon={<Globe />} label='Searching the web...' status='running' />\n  </ChainOfThought>\n);",
          "storyFile": "ChainOfThought/ChainOfThought.stories.tsx",
          "storyTitle": "AI/ChainOfThought",
          "description": "`status='running'` shimmers the label while the step is in progress."
        },
        {
          "name": "Streaming",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { ChainOfThought, ChainOfThoughtStep } from '@wallarm-org/design-system/ChainOfThought';\n\nexport const Streaming = () => {\n  const [count, setCount] = useState(1);\n  const finished = count > STREAMING_STEPS.length;\n\n  const handleClick = () => {\n    setCount(count + 1);\n  };\n\n  return (\n    <div className='flex flex-col gap-12'>\n      <ChainOfThought data-testid='cot'>\n        {HISTORY_STEPS.map(step => (\n          <ChainOfThoughtStep key={step.label} icon={step.icon} label={step.label} />\n        ))}\n        {STREAMING_STEPS.slice(0, count).map((step, i) => {\n          const running = i === count - 1;\n          return (\n            <ChainOfThoughtStep\n              key={step.done}\n              icon={step.icon}\n              label={running ? step.label : step.done}\n              status={running ? 'running' : 'done'}\n            />\n          );\n        })}\n      </ChainOfThought>\n      <div>\n        <Button\n          variant='secondary'\n          color='neutral'\n          size='small'\n          disabled={finished}\n          onClick={handleClick}\n          data-testid='next-step'\n        >\n          {count === STREAMING_STEPS.length ? 'Finish' : 'Next step'}\n        </Button>\n      </div>\n    </div>\n  );\n};",
          "storyFile": "ChainOfThought/ChainOfThought.stories.tsx",
          "storyTitle": "AI/ChainOfThought",
          "description": "A step that mounts as `running` fades in and settles 4px; the previous step's connector grows\ntoward it; on `done` the shimmer fades into the plain label. Steps that mount `done` (history)\nappear instantly. All of it is off under `prefers-reduced-motion`."
        },
        {
          "name": "ErrorStep",
          "code": "import { ChainOfThought, ChainOfThoughtStep } from '@wallarm-org/design-system/ChainOfThought';\nimport { Plug, Search } from '@wallarm-org/design-system/icons';\n\nexport const ErrorStep = () => (\n  <ChainOfThought data-testid='cot'>\n    <ChainOfThoughtStep icon={<Search />} label='Searched for ABC' />\n    <ChainOfThoughtStep\n      icon={<Plug />}\n      label='get_attacks failed'\n      status='error'\n      defaultOpen\n      data-testid='cot-error'\n    >\n      <p>Request failed: 503 Service Unavailable.</p>\n    </ChainOfThoughtStep>\n    <ChainOfThoughtStep icon={<Plug />} label='get_rules failed' status='error' />\n  </ChainOfThought>\n);",
          "storyFile": "ChainOfThought/ChainOfThought.stories.tsx",
          "storyTitle": "AI/ChainOfThought",
          "description": "`status='error'` tints the label and the type icon danger, for a step that failed. Word the\nlabel as a failure too (color alone is not enough); put the detail in the step's children.\nNot in Figma yet; pending design review."
        },
        {
          "name": "WorkedSummary",
          "code": "import { ChainOfThought, ChainOfThoughtStep } from '@wallarm-org/design-system/ChainOfThought';\nimport { Activity, BadgeCheck, Brain, Radar, Terminal } from '@wallarm-org/design-system/icons';\n\nexport const WorkedSummary = () => (\n  <ChainOfThought data-testid='cot'>\n    <ChainOfThoughtStep\n      icon={<Activity />}\n      label='Worked for 3m 45s'\n      defaultOpen\n      data-testid='cot-summary'\n    >\n      <ChainOfThought>\n        <ChainOfThoughtStep icon={<Brain />} label='Thought for 5s' />\n        <ChainOfThoughtStep icon={<Terminal />} label='Ran wallarm-cli status' />\n        <ChainOfThoughtStep icon={<Radar />} label='Scanned 12 hosts' />\n        <ChainOfThoughtStep icon={<BadgeCheck />} label='Created a mitigation rule' />\n      </ChainOfThought>\n    </ChainOfThoughtStep>\n  </ChainOfThought>\n);",
          "storyFile": "ChainOfThought/ChainOfThought.stories.tsx",
          "storyTitle": "AI/ChainOfThought",
          "description": "The whole run folded under one \"Worked for …\" step with the Activity icon."
        },
        {
          "name": "RichTextContent",
          "code": "import { ChainOfThought, ChainOfThoughtStep } from '@wallarm-org/design-system/ChainOfThought';\nimport { InlineCodeSnippet } from '@wallarm-org/design-system/CodeSnippet';\nimport { Brain } from '@wallarm-org/design-system/icons';\n\nexport const RichTextContent = () => (\n  <ChainOfThought data-testid='cot'>\n    <ChainOfThoughtStep icon={<Brain />} label='Thought for 12s' defaultOpen>\n      <p>\n        The user wants to know why requests to{' '}\n        <InlineCodeSnippet\n          code='/api/login'\n          copyable={false}\n          size='sm'\n          className='text-text-secondary'\n        />{' '}\n        were blocked.\n      </p>\n      <ul>\n        <li>Check recent attacks on that path.</li>\n        <li>Compare them with the active rules.</li>\n      </ul>\n      <p>Then suggest the narrowest rule change.</p>\n    </ChainOfThoughtStep>\n  </ChainOfThought>\n);",
          "storyFile": "ChainOfThought/ChainOfThought.stories.tsx",
          "storyTitle": "AI/ChainOfThought",
          "description": "Nested content can be prose: paragraphs, bullets and inline code."
        },
        {
          "name": "TypeIcons",
          "code": "import { ChainOfThought, ChainOfThoughtStep } from '@wallarm-org/design-system/ChainOfThought';\nimport { Activity, BadgeCheck, Bot, Brain, CircleDashed, Database, Download, FilePlus, FileText, Filter, GitBranch, Globe, Link, ListChecks, Pencil, Plug, Radar, Search, ShieldAlert, Terminal, Wrench } from '@wallarm-org/design-system/icons';\n\nexport const TypeIcons = () => (\n  <ChainOfThought data-testid='cot'>\n    <ChainOfThoughtStep icon={<Brain />} label='thinking' />\n    <ChainOfThoughtStep icon={<ListChecks />} label='plan' />\n    <ChainOfThoughtStep icon={<GitBranch />} label='decision' />\n    <ChainOfThoughtStep icon={<Bot />} label='subagent' />\n    <ChainOfThoughtStep icon={<Wrench />} label='tool' />\n    <ChainOfThoughtStep icon={<Terminal />} label='command' />\n    <ChainOfThoughtStep icon={<Globe />} label='web search' />\n    <ChainOfThoughtStep icon={<Search />} label='query' />\n    <ChainOfThoughtStep icon={<Database />} label='datastore' />\n    <ChainOfThoughtStep icon={<Plug />} label='api' />\n    <ChainOfThoughtStep icon={<FileText />} label='read' />\n    <ChainOfThoughtStep icon={<Download />} label='fetch' />\n    <ChainOfThoughtStep icon={<Filter />} label='filter' />\n    <ChainOfThoughtStep icon={<FilePlus />} label='create' />\n    <ChainOfThoughtStep icon={<Pencil />} label='edit' />\n    <ChainOfThoughtStep icon={<Link />} label='cite' />\n    <ChainOfThoughtStep icon={<ShieldAlert />} label='threat' />\n    <ChainOfThoughtStep icon={<Radar />} label='scan' />\n    <ChainOfThoughtStep icon={<CircleDashed />} label='pending / default' />\n    <ChainOfThoughtStep icon={<Activity />} label='summary' />\n    <ChainOfThoughtStep icon={<BadgeCheck />} label='\"Created\" example' />\n  </ChainOfThought>\n);",
          "storyFile": "ChainOfThought/ChainOfThought.stories.tsx",
          "storyTitle": "AI/ChainOfThought",
          "description": "The recommended step-type → icon mapping. The app owns it; this is documentation only."
        },
        {
          "name": "Controlled",
          "code": "import { useState } from 'react';\nimport { ChainOfThought, ChainOfThoughtStep } from '@wallarm-org/design-system/ChainOfThought';\nimport { Brain } from '@wallarm-org/design-system/icons';\n\nexport const Controlled = () => {\n  const [open, setOpen] = useState(false);\n  return (\n    <div className='flex flex-col gap-12'>\n      <ChainOfThought data-testid='cot'>\n        <ChainOfThoughtStep\n          icon={<Brain />}\n          label='Thought for 5s'\n          open={open}\n          onOpenChange={setOpen}\n        >\n          <p>Reasoning goes here.</p>\n        </ChainOfThoughtStep>\n      </ChainOfThought>\n      <code className='text-xs text-text-secondary'>open: {String(open)}</code>\n    </div>\n  );\n};",
          "storyFile": "ChainOfThought/ChainOfThought.stories.tsx",
          "storyTitle": "AI/ChainOfThought",
          "description": "`open` + `onOpenChange` drive the step from outside."
        },
        {
          "name": "Analytics",
          "code": "import { ChainOfThought, ChainOfThoughtStep } from '@wallarm-org/design-system/ChainOfThought';\nimport { Brain } from '@wallarm-org/design-system/icons';\n\nexport const Analytics = () => (\n  <ChainOfThought data-testid='cot'>\n    <ChainOfThoughtStep\n      icon={<Brain />}\n      label='Thought for 5s'\n      data-analytics-id='COT_STEP_TOGGLE'\n      data-analytics-props='{\"type\":\"thinking\"}'\n    >\n      <p>Reasoning goes here.</p>\n    </ChainOfThoughtStep>\n  </ChainOfThought>\n);",
          "storyFile": "ChainOfThought/ChainOfThought.stories.tsx",
          "storyTitle": "AI/ChainOfThought",
          "description": "`data-analytics-*` on a collapsible step lands on the row `<button>`, not the `<li>`."
        }
      ]
    },
    {
      "name": "Chat",
      "description": "The Wally assistant panel: a header, a scrolling message log, and a footer gutter for suggestions, a docked approval card and the input. `Chat` is layout only — it holds no messages or agent state; the app renders `UserMessage`, `AssistantMessage` and `ChatInput` into `ChatBody` and `ChatFooter` from its own data. Header actions are composed from plain ghost `Button`s and vertical `Separator`s, so each one keeps its own `aria-label` and analytics attributes. `background` picks the decorative mesh: `strong` for an empty chat, `subtle` (default) once a conversation is running, `none` to drop it. Host the panel in a right-hand `Drawer` about 480px wide; `ChatBody` exposes its scroll element through `ref` for stick-to-bottom.",
      "importPath": "@wallarm-org/design-system/Chat",
      "props": [
        {
          "name": "background",
          "type": "ChatBackground | undefined",
          "required": false,
          "description": "Decorative mesh behind the panel (Figma chat-bg 67:1254). `'strong'` is Main (12%, for an\nempty chat), `'subtle'` is Chat (5%, for a running conversation), `'none'` renders nothing.",
          "defaultValue": "subtle"
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "background",
          "options": [
            "strong",
            "subtle"
          ],
          "defaultValue": "subtle"
        },
        {
          "name": "placement",
          "options": [
            "footer",
            "greeting"
          ],
          "defaultValue": "footer"
        },
        {
          "name": "size",
          "options": [
            "md",
            "lg"
          ],
          "defaultValue": "md"
        }
      ],
      "subComponents": [
        {
          "name": "ChatBody",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "ChatFooter",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "ChatGreeting",
          "props": [
            {
              "name": "title",
              "type": "ReactNode",
              "required": true,
              "description": "Heading under the Wally mark, e.g. \"How can I help you today?\"."
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "ChatHeader",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "ChatHeaderActions",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "ChatHeaderTitle",
          "props": [
            {
              "name": "label",
              "type": "ReactNode",
              "required": false,
              "description": "The title shown when there are no children (e.g. a translation). Default: \"Ask Wally\"."
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "ChatSuggestion",
          "props": [
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "ChatSuggestions",
          "props": [
            {
              "name": "placement",
              "type": "ChatSuggestionsPlacement | undefined",
              "required": false,
              "description": "`'footer'` (default, Figma 91:1167): right-aligned Medium pills above the input.\n`'greeting'` (Figma 44:1706): centered Large pills under the greeting.",
              "defaultValue": "footer"
            },
            {
              "name": "label",
              "type": "ReactNode",
              "required": false,
              "description": "Visible label (Figma \"Suggestions\"); also becomes the group's accessible name."
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "ChatTrigger",
          "props": [
            {
              "name": "label",
              "type": "string | undefined",
              "required": false,
              "description": "Tooltip text and accessible name.",
              "defaultValue": "Ask Wally"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "HeaderDefault",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Chat, ChatBody, ChatHeader, ChatHeaderActions, ChatHeaderTitle } from '@wallarm-org/design-system/Chat';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { Ellipsis, History, X } from '@wallarm-org/design-system/icons';\nimport { Separator } from '@wallarm-org/design-system/Separator';\n\nexport const HeaderDefault = () => (\n  <div className='h-200 w-480'>\n    <Chat data-testid='chat' background='none'>\n      <ChatHeader>\n        <ChatHeaderTitle />\n        <ChatHeaderActions>\n          <Button variant='ghost' color='neutral' size='small' aria-label='Chat history'>\n            <History />\n          </Button>\n          <DropdownMenu positioning={{ placement: 'bottom-end' }}>\n            <DropdownMenuTrigger asChild>\n              <Button variant='ghost' color='neutral' size='small' aria-label='More actions'>\n                <Ellipsis />\n              </Button>\n            </DropdownMenuTrigger>\n            <DropdownMenuContent>\n              <DropdownMenuItem>Rename chat</DropdownMenuItem>\n              <DropdownMenuItem>Delete chat</DropdownMenuItem>\n            </DropdownMenuContent>\n          </DropdownMenu>\n          <Separator orientation='vertical' />\n          <Button variant='ghost' color='neutral' size='small' aria-label='Close chat'>\n            <X />\n          </Button>\n        </ChatHeaderActions>\n      </ChatHeader>\n      <ChatBody />\n    </Chat>\n  </div>\n);",
          "storyFile": "Chat/Chat.stories.tsx",
          "storyTitle": "AI/Chat",
          "description": "Figma Default (2:42): the \"Ask Wally\" title with History, a More menu, a separator and Close.\nEvery action is a ghost neutral small `Button` with an `aria-label`."
        },
        {
          "name": "HeaderWithThreadSelect",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Chat, ChatBody, ChatHeader, ChatHeaderActions, ChatHeaderTitle } from '@wallarm-org/design-system/Chat';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { Ellipsis, History, Plus, X } from '@wallarm-org/design-system/icons';\nimport { Select, SelectButton, SelectContent, SelectOption, SelectOptionIndicator, SelectOptionText, SelectPositioner } from '@wallarm-org/design-system/Select';\nimport { Separator } from '@wallarm-org/design-system/Separator';\n\nexport const HeaderWithThreadSelect = () => (\n  <div className='h-200 w-480'>\n    <Chat data-testid='chat' background='none'>\n      <ChatHeader>\n        <ChatHeaderTitle>\n          <Select collection={threads} defaultValue={['blocked']}>\n            <SelectButton variant='ghost' size='small' placeholder='New chat' />\n            <SelectPositioner>\n              <SelectContent>\n                {threads.items.map(item => (\n                  <SelectOption key={item.value} item={item}>\n                    <SelectOptionText>{item.label}</SelectOptionText>\n                    <SelectOptionIndicator />\n                  </SelectOption>\n                ))}\n              </SelectContent>\n            </SelectPositioner>\n          </Select>\n        </ChatHeaderTitle>\n        <ChatHeaderActions>\n          <Button variant='ghost' color='neutral' size='small' aria-label='New chat'>\n            <Plus />\n          </Button>\n          <Separator orientation='vertical' />\n          <Button variant='ghost' color='neutral' size='small' aria-label='Chat history'>\n            <History />\n          </Button>\n          <DropdownMenu positioning={{ placement: 'bottom-end' }}>\n            <DropdownMenuTrigger asChild>\n              <Button variant='ghost' color='neutral' size='small' aria-label='More actions'>\n                <Ellipsis />\n              </Button>\n            </DropdownMenuTrigger>\n            <DropdownMenuContent>\n              <DropdownMenuItem>Rename chat</DropdownMenuItem>\n              <DropdownMenuItem>Delete chat</DropdownMenuItem>\n            </DropdownMenuContent>\n          </DropdownMenu>\n          <Separator orientation='vertical' />\n          <Button variant='ghost' color='neutral' size='small' aria-label='Close chat'>\n            <X />\n          </Button>\n        </ChatHeaderActions>\n      </ChatHeader>\n      <ChatBody />\n    </Chat>\n  </div>\n);",
          "storyFile": "Chat/Chat.stories.tsx",
          "storyTitle": "AI/Chat",
          "description": "Figma Variant2 (44:1465): children of `ChatHeaderTitle` follow a \"/\" joint — here a ghost thread\n`Select` — and a New chat action leads the toolbar."
        },
        {
          "name": "Greeting",
          "code": "import { type MouseEvent, useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Chat, ChatBody, ChatGreeting, ChatHeader, ChatHeaderActions, ChatHeaderTitle, ChatSuggestion, ChatSuggestions } from '@wallarm-org/design-system/Chat';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { Ellipsis, History, X } from '@wallarm-org/design-system/icons';\nimport { Separator } from '@wallarm-org/design-system/Separator';\n\nexport const Greeting = () => {\n  const [picked, setPicked] = useState<string>();\n  const handleSuggestionClick = (event: MouseEvent<HTMLButtonElement>) =>\n    setPicked(event.currentTarget.value);\n\n  return (\n    <div className='h-640 w-480'>\n      <Chat data-testid='chat' background='strong'>\n        <ChatHeader>\n          <ChatHeaderTitle />\n          <ChatHeaderActions>\n            <Button variant='ghost' color='neutral' size='small' aria-label='Chat history'>\n              <History />\n            </Button>\n            <DropdownMenu positioning={{ placement: 'bottom-end' }}>\n              <DropdownMenuTrigger asChild>\n                <Button variant='ghost' color='neutral' size='small' aria-label='More actions'>\n                  <Ellipsis />\n                </Button>\n              </DropdownMenuTrigger>\n              <DropdownMenuContent>\n                <DropdownMenuItem>Rename chat</DropdownMenuItem>\n                <DropdownMenuItem>Delete chat</DropdownMenuItem>\n              </DropdownMenuContent>\n            </DropdownMenu>\n            <Separator orientation='vertical' />\n            <Button variant='ghost' color='neutral' size='small' aria-label='Close chat'>\n              <X />\n            </Button>\n          </ChatHeaderActions>\n        </ChatHeader>\n        <ChatBody>\n          <ChatGreeting title='How can I help you today?'>\n            <ChatSuggestions placement='greeting' label='Suggestions'>\n              {SUGGESTIONS.map((text, index) => (\n                <ChatSuggestion\n                  key={text}\n                  data-testid={`chat--suggestion-${index}`}\n                  value={text}\n                  onClick={handleSuggestionClick}\n                >\n                  {text}\n                </ChatSuggestion>\n              ))}\n            </ChatSuggestions>\n          </ChatGreeting>\n          {picked && (\n            <p data-testid='chat--picked' className='sr-only'>\n              Picked: {picked}\n            </p>\n          )}\n        </ChatBody>\n      </Chat>\n    </div>\n  );\n};",
          "storyFile": "Chat/Chat.stories.tsx",
          "storyTitle": "AI/Chat",
          "description": "The empty state (Figma 44:1464): the circle mark and a heading, with Large suggestion pills\ncentered under it, over the `strong` background."
        },
        {
          "name": "Suggestions",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Chat, ChatBody, ChatFooter, ChatGreeting, ChatHeader, ChatHeaderActions, ChatHeaderTitle, ChatSuggestion, ChatSuggestions } from '@wallarm-org/design-system/Chat';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { Ellipsis, History, X } from '@wallarm-org/design-system/icons';\nimport { Separator } from '@wallarm-org/design-system/Separator';\nimport { HStack } from '@wallarm-org/design-system/Stack';\n\nexport const Suggestions = () => (\n  <HStack gap={24} align='start'>\n    <div className='h-640 w-480'>\n      <Chat data-testid='chat-footer-suggestions'>\n        <ChatHeader>\n          <ChatHeaderTitle />\n          <ChatHeaderActions>\n            <Button variant='ghost' color='neutral' size='small' aria-label='Chat history'>\n              <History />\n            </Button>\n            <DropdownMenu positioning={{ placement: 'bottom-end' }}>\n              <DropdownMenuTrigger asChild>\n                <Button variant='ghost' color='neutral' size='small' aria-label='More actions'>\n                  <Ellipsis />\n                </Button>\n              </DropdownMenuTrigger>\n              <DropdownMenuContent>\n                <DropdownMenuItem>Rename chat</DropdownMenuItem>\n                <DropdownMenuItem>Delete chat</DropdownMenuItem>\n              </DropdownMenuContent>\n            </DropdownMenu>\n            <Separator orientation='vertical' />\n            <Button variant='ghost' color='neutral' size='small' aria-label='Close chat'>\n              <X />\n            </Button>\n          </ChatHeaderActions>\n        </ChatHeader>\n        <ChatBody />\n        <ChatFooter>\n          <ChatSuggestions label='Suggestions'>\n            {SUGGESTIONS.map((text, index) => (\n              <ChatSuggestion\n                key={text}\n                data-testid={`chat-footer-suggestions--suggestion-${index}`}\n              >\n                {text}\n              </ChatSuggestion>\n            ))}\n          </ChatSuggestions>\n        </ChatFooter>\n      </Chat>\n    </div>\n    <div className='h-640 w-480'>\n      <Chat data-testid='chat-greeting-suggestions' background='strong'>\n        <ChatHeader>\n          <ChatHeaderTitle />\n          <ChatHeaderActions>\n            <Button variant='ghost' color='neutral' size='small' aria-label='Chat history'>\n              <History />\n            </Button>\n            <DropdownMenu positioning={{ placement: 'bottom-end' }}>\n              <DropdownMenuTrigger asChild>\n                <Button variant='ghost' color='neutral' size='small' aria-label='More actions'>\n                  <Ellipsis />\n                </Button>\n              </DropdownMenuTrigger>\n              <DropdownMenuContent>\n                <DropdownMenuItem>Rename chat</DropdownMenuItem>\n                <DropdownMenuItem>Delete chat</DropdownMenuItem>\n              </DropdownMenuContent>\n            </DropdownMenu>\n            <Separator orientation='vertical' />\n            <Button variant='ghost' color='neutral' size='small' aria-label='Close chat'>\n              <X />\n            </Button>\n          </ChatHeaderActions>\n        </ChatHeader>\n        <ChatBody>\n          <ChatGreeting title='How can I help you today?'>\n            <ChatSuggestions placement='greeting'>\n              {SUGGESTIONS.map((text, index) => (\n                <ChatSuggestion\n                  key={text}\n                  data-testid={`chat-greeting-suggestions--suggestion-${index}`}\n                >\n                  {text}\n                </ChatSuggestion>\n              ))}\n            </ChatSuggestions>\n          </ChatGreeting>\n        </ChatBody>\n      </Chat>\n    </div>\n  </HStack>\n);",
          "storyFile": "Chat/Chat.stories.tsx",
          "storyTitle": "AI/Chat",
          "description": "Both placements: `footer` (Figma 91:1167) right-aligns Medium pills under a visible label,\n`greeting` (Figma 44:1706) centers Large pills. The pill size follows the placement."
        },
        {
          "name": "Backgrounds",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Chat, ChatBody, ChatHeader, ChatHeaderActions, ChatHeaderTitle } from '@wallarm-org/design-system/Chat';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { Ellipsis, History, X } from '@wallarm-org/design-system/icons';\nimport { Separator } from '@wallarm-org/design-system/Separator';\nimport { HStack } from '@wallarm-org/design-system/Stack';\n\nexport const Backgrounds = () => (\n  <HStack gap={24} align='start'>\n    {BACKGROUNDS.map(background => (\n      <div key={background} className='h-640 w-360'>\n        <Chat data-testid={`chat-${background}`} background={background}>\n          <ChatHeader>\n            <ChatHeaderTitle />\n            <ChatHeaderActions>\n              <Button variant='ghost' color='neutral' size='small' aria-label='Chat history'>\n                <History />\n              </Button>\n              <DropdownMenu positioning={{ placement: 'bottom-end' }}>\n                <DropdownMenuTrigger asChild>\n                  <Button variant='ghost' color='neutral' size='small' aria-label='More actions'>\n                    <Ellipsis />\n                  </Button>\n                </DropdownMenuTrigger>\n                <DropdownMenuContent>\n                  <DropdownMenuItem>Rename chat</DropdownMenuItem>\n                  <DropdownMenuItem>Delete chat</DropdownMenuItem>\n                </DropdownMenuContent>\n              </DropdownMenu>\n              <Separator orientation='vertical' />\n              <Button variant='ghost' color='neutral' size='small' aria-label='Close chat'>\n                <X />\n              </Button>\n            </ChatHeaderActions>\n          </ChatHeader>\n          <ChatBody />\n        </Chat>\n      </div>\n    ))}\n  </HStack>\n);",
          "storyFile": "Chat/Chat.stories.tsx",
          "storyTitle": "AI/Chat",
          "description": "The three `background` values side by side: `strong` (Figma Main, 12%), `subtle` (Figma Chat,\n5%, the default) and `none`. The mesh is decorative and sits under every part."
        },
        {
          "name": "Analytics",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Chat, ChatBody, ChatFooter, ChatHeader, ChatHeaderActions, ChatHeaderTitle, ChatSuggestion, ChatSuggestions } from '@wallarm-org/design-system/Chat';\nimport { X } from '@wallarm-org/design-system/icons';\n\nexport const Analytics = () => (\n  <div className='h-640 w-480'>\n    <Chat data-testid='chat'>\n      <ChatHeader>\n        <ChatHeaderTitle />\n        <ChatHeaderActions>\n          <Button\n            variant='ghost'\n            color='neutral'\n            size='small'\n            aria-label='Close chat'\n            data-analytics-id='AI_CHAT_CLOSE'\n          >\n            <X />\n          </Button>\n        </ChatHeaderActions>\n      </ChatHeader>\n      <ChatBody />\n      <ChatFooter>\n        <ChatSuggestions label='Suggestions'>\n          {SUGGESTIONS.map((text, index) => (\n            <ChatSuggestion\n              key={text}\n              data-testid={`chat--suggestion-${index}`}\n              data-analytics-id='AI_CHAT_SUGGESTION'\n              data-analytics-props={JSON.stringify({ index })}\n            >\n              {text}\n            </ChatSuggestion>\n          ))}\n        </ChatSuggestions>\n      </ChatFooter>\n    </Chat>\n  </div>\n);",
          "storyFile": "Chat/Chat.stories.tsx",
          "storyTitle": "AI/Chat",
          "description": "Analytics attributes go on the interactive parts only: `data-analytics-id` on a `ChatSuggestion`\nlands on its `<button>`; header actions are plain DS `Button`s and carry their own. Keep them off\nthe `Chat` root — a click anywhere inside would resolve to it."
        },
        {
          "name": "Trigger",
          "code": "import { ChatTrigger } from '@wallarm-org/design-system/Chat';\n\nexport const Trigger = () => <ChatTrigger data-testid='chat-trigger' />;",
          "storyFile": "Chat/Chat.stories.tsx",
          "storyTitle": "AI/Chat",
          "description": "The app-header button that opens the panel (Figma 101:1034): the Wally mascot in a ghost small\n`Button`, with an \"Ask Wally\" tooltip that doubles as its accessible name (`label`)."
        },
        {
          "name": "TriggerWithDrawer",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Chat, ChatBody, ChatHeader, ChatHeaderActions, ChatHeaderTitle, ChatTrigger } from '@wallarm-org/design-system/Chat';\nimport { Drawer, DrawerContent, DrawerTrigger } from '@wallarm-org/design-system/Drawer';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { Ellipsis, History, X } from '@wallarm-org/design-system/icons';\nimport { Separator } from '@wallarm-org/design-system/Separator';\n\nexport const TriggerWithDrawer = () => (\n  <Drawer width={480}>\n    <DrawerTrigger asChild>\n      <ChatTrigger data-testid='chat-trigger' data-analytics-id='AI_CHAT_OPEN' />\n    </DrawerTrigger>\n    <DrawerContent>\n      <Chat data-testid='chat'>\n        <ChatHeader>\n          <ChatHeaderTitle />\n          <ChatHeaderActions>\n            <Button variant='ghost' color='neutral' size='small' aria-label='Chat history'>\n              <History />\n            </Button>\n            <DropdownMenu positioning={{ placement: 'bottom-end' }}>\n              <DropdownMenuTrigger asChild>\n                <Button variant='ghost' color='neutral' size='small' aria-label='More actions'>\n                  <Ellipsis />\n                </Button>\n              </DropdownMenuTrigger>\n              <DropdownMenuContent>\n                <DropdownMenuItem>Rename chat</DropdownMenuItem>\n                <DropdownMenuItem>Delete chat</DropdownMenuItem>\n              </DropdownMenuContent>\n            </DropdownMenu>\n            <Separator orientation='vertical' />\n            <Button variant='ghost' color='neutral' size='small' aria-label='Close chat'>\n              <X />\n            </Button>\n          </ChatHeaderActions>\n        </ChatHeader>\n        <ChatBody />\n      </Chat>\n    </DrawerContent>\n  </Drawer>\n);",
          "storyFile": "Chat/Chat.stories.tsx",
          "storyTitle": "AI/Chat",
          "description": "`ChatTrigger` under `DrawerTrigger asChild`: the drawer owns the open state and `aria-expanded`,\nthe tooltip keeps its anchor through the shared trigger id."
        },
        {
          "name": "EmptyPanel",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Chat, ChatBody, ChatFooter, ChatGreeting, ChatHeader, ChatHeaderActions, ChatHeaderTitle, ChatSuggestion, ChatSuggestions } from '@wallarm-org/design-system/Chat';\nimport { ChatInput, ChatInputSubmit, ChatInputTextarea } from '@wallarm-org/design-system/ChatInput';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { Ellipsis, History, X } from '@wallarm-org/design-system/icons';\nimport { Separator } from '@wallarm-org/design-system/Separator';\n\nexport const EmptyPanel = () => {\n  const [value, setValue] = useState('');\n  const handleSubmit = () => setValue('');\n\n  return (\n    <div className='h-640 w-480'>\n      <Chat data-testid='chat' background='strong'>\n        <ChatHeader>\n          <ChatHeaderTitle />\n          <ChatHeaderActions>\n            <Button variant='ghost' color='neutral' size='small' aria-label='Chat history'>\n              <History />\n            </Button>\n            <DropdownMenu positioning={{ placement: 'bottom-end' }}>\n              <DropdownMenuTrigger asChild>\n                <Button variant='ghost' color='neutral' size='small' aria-label='More actions'>\n                  <Ellipsis />\n                </Button>\n              </DropdownMenuTrigger>\n              <DropdownMenuContent>\n                <DropdownMenuItem>Rename chat</DropdownMenuItem>\n                <DropdownMenuItem>Delete chat</DropdownMenuItem>\n              </DropdownMenuContent>\n            </DropdownMenu>\n            <Separator orientation='vertical' />\n            <Button variant='ghost' color='neutral' size='small' aria-label='Close chat'>\n              <X />\n            </Button>\n          </ChatHeaderActions>\n        </ChatHeader>\n        <ChatBody>\n          <ChatGreeting title='How can I help you today?'>\n            <ChatSuggestions placement='greeting' label='Suggestions'>\n              {SUGGESTIONS.map((text, index) => (\n                <ChatSuggestion key={text} data-testid={`chat--suggestion-${index}`}>\n                  {text}\n                </ChatSuggestion>\n              ))}\n            </ChatSuggestions>\n          </ChatGreeting>\n        </ChatBody>\n        <ChatFooter>\n          <ChatInput value={value} onValueChange={setValue} onSubmit={handleSubmit}>\n            <ChatInputTextarea />\n            <ChatInputSubmit />\n          </ChatInput>\n        </ChatFooter>\n      </Chat>\n    </div>\n  );\n};",
          "storyFile": "Chat/Chat.stories.tsx",
          "storyTitle": "AI/Chat",
          "description": "The full empty panel: the greeting with Large suggestion pills over the `strong` background,\nand the composer in the footer. A pill click would send its text as the first message."
        },
        {
          "name": "Conversation",
          "code": "import { useState } from 'react';\nimport { AssistantMessage, AssistantMessageContent } from '@wallarm-org/design-system/AssistantMessage';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { ChainOfThought, ChainOfThoughtStep } from '@wallarm-org/design-system/ChainOfThought';\nimport { Chat, ChatBody, ChatFooter, ChatHeader, ChatHeaderActions, ChatHeaderTitle, ChatSuggestion, ChatSuggestions } from '@wallarm-org/design-system/Chat';\nimport { ChatInput, ChatInputSubmit, ChatInputTextarea } from '@wallarm-org/design-system/ChatInput';\nimport { InlineCodeSnippet } from '@wallarm-org/design-system/CodeSnippet';\nimport { Copyable, CopyableIcon } from '@wallarm-org/design-system/Copyable';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { Brain, Database, Ellipsis, History, Search, ThumbsDown, ThumbsUp, X } from '@wallarm-org/design-system/icons';\nimport { MessageAction, MessageActions, MessageTimestamp } from '@wallarm-org/design-system/MessageActions';\nimport { Separator } from '@wallarm-org/design-system/Separator';\nimport { UserMessage, UserMessageBubble } from '@wallarm-org/design-system/UserMessage';\n\nexport const Conversation = () => {\n  const [value, setValue] = useState('');\n  const handleSubmit = () => setValue('');\n\n  return (\n    <div className='h-640 w-480'>\n      <Chat data-testid='chat'>\n        <ChatHeader>\n          <ChatHeaderTitle />\n          <ChatHeaderActions>\n            <Button variant='ghost' color='neutral' size='small' aria-label='Chat history'>\n              <History />\n            </Button>\n            <DropdownMenu positioning={{ placement: 'bottom-end' }}>\n              <DropdownMenuTrigger asChild>\n                <Button variant='ghost' color='neutral' size='small' aria-label='More actions'>\n                  <Ellipsis />\n                </Button>\n              </DropdownMenuTrigger>\n              <DropdownMenuContent>\n                <DropdownMenuItem>Rename chat</DropdownMenuItem>\n                <DropdownMenuItem>Delete chat</DropdownMenuItem>\n              </DropdownMenuContent>\n            </DropdownMenu>\n            <Separator orientation='vertical' />\n            <Button variant='ghost' color='neutral' size='small' aria-label='Close chat'>\n              <X />\n            </Button>\n          </ChatHeaderActions>\n        </ChatHeader>\n        <ChatBody>\n          <UserMessage data-testid='chat--user-message-0'>\n            <UserMessageBubble>{QUESTION}</UserMessageBubble>\n            <MessageActions>\n              <MessageTimestamp dateTime='2026-10-21T09:41:00Z'>2m ago</MessageTimestamp>\n              <Copyable text={QUESTION}>\n                <MessageAction aria-label='Copy'>\n                  <CopyableIcon />\n                </MessageAction>\n              </Copyable>\n            </MessageActions>\n          </UserMessage>\n          <AssistantMessage data-testid='chat--assistant-message-0'>\n            <ChainOfThought>\n              <ChainOfThoughtStep icon={<Brain />} label='Thought for 5s'>\n                <p>\n                  Look up blocked requests to /api/login for last night, then group them by source.\n                </p>\n              </ChainOfThoughtStep>\n              <ChainOfThoughtStep icon={<Search />} label='Searched for blocked requests' />\n              <ChainOfThoughtStep\n                icon={<Database />}\n                label='Queried attack events'\n                metric='1,204'\n              />\n            </ChainOfThought>\n            <AssistantMessageContent>\n              <h3>SQL injection on the login endpoint</h3>\n              <p>\n                Wallarm blocked 1,204 SQL injection attempts, almost all against{' '}\n                <InlineCodeSnippet code='/api/login' size='sm' />.\n              </p>\n              <ul>\n                <li>\n                  Most came from <InlineCodeSnippet code='203.0.113.0/24' size='sm' />.\n                </li>\n                <li>The peak was at 03:00 UTC.</li>\n                <li>No request reached the application.</li>\n              </ul>\n            </AssistantMessageContent>\n            <MessageActions visible>\n              <Copyable text={ANSWER_TEXT}>\n                <MessageAction aria-label='Copy' data-testid='chat--answer-copy'>\n                  <CopyableIcon />\n                </MessageAction>\n              </Copyable>\n              <MessageAction aria-label='Good response'>\n                <ThumbsUp />\n              </MessageAction>\n              <MessageAction aria-label='Bad response'>\n                <ThumbsDown />\n              </MessageAction>\n              <MessageTimestamp dateTime='2026-10-21T09:42:00Z'>1m ago</MessageTimestamp>\n            </MessageActions>\n          </AssistantMessage>\n        </ChatBody>\n        <ChatFooter>\n          <ChatSuggestions label='Suggestions'>\n            {FOLLOW_UPS.map((text, index) => (\n              <ChatSuggestion key={text} data-testid={`chat--suggestion-${index}`}>\n                {text}\n              </ChatSuggestion>\n            ))}\n          </ChatSuggestions>\n          <ChatInput value={value} onValueChange={setValue} onSubmit={handleSubmit}>\n            <ChatInputTextarea />\n            <ChatInputSubmit />\n          </ChatInput>\n        </ChatFooter>\n      </Chat>\n    </div>\n  );\n};",
          "storyFile": "Chat/Chat.stories.tsx",
          "storyTitle": "AI/Chat",
          "description": "A finished turn: the user's question, then Wally's answer with collapsed reasoning, rendered\nmarkdown and a visible actions row; follow-up suggestions sit above the composer."
        },
        {
          "name": "Streaming",
          "code": "import { useState } from 'react';\nimport { AssistantMessage, AssistantMessageContent } from '@wallarm-org/design-system/AssistantMessage';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { ChainOfThought, ChainOfThoughtStep } from '@wallarm-org/design-system/ChainOfThought';\nimport { Chat, ChatBody, ChatFooter, ChatHeader, ChatHeaderActions, ChatHeaderTitle } from '@wallarm-org/design-system/Chat';\nimport { ChatInput, ChatInputSubmit, ChatInputTextarea } from '@wallarm-org/design-system/ChatInput';\nimport { Copyable, CopyableIcon } from '@wallarm-org/design-system/Copyable';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { Database, Ellipsis, History, Search, X } from '@wallarm-org/design-system/icons';\nimport { MessageAction, MessageActions, MessageTimestamp } from '@wallarm-org/design-system/MessageActions';\nimport { Separator } from '@wallarm-org/design-system/Separator';\nimport { UserMessage, UserMessageBubble } from '@wallarm-org/design-system/UserMessage';\n\nexport const Streaming = () => {\n  const [value, setValue] = useState('');\n  const [isRunning, setIsRunning] = useState(true);\n  const handleSubmit = () => setValue('');\n  const handleStop = () => setIsRunning(false);\n\n  return (\n    <div className='h-640 w-480'>\n      <Chat data-testid='chat'>\n        <ChatHeader>\n          <ChatHeaderTitle />\n          <ChatHeaderActions>\n            <Button variant='ghost' color='neutral' size='small' aria-label='Chat history'>\n              <History />\n            </Button>\n            <DropdownMenu positioning={{ placement: 'bottom-end' }}>\n              <DropdownMenuTrigger asChild>\n                <Button variant='ghost' color='neutral' size='small' aria-label='More actions'>\n                  <Ellipsis />\n                </Button>\n              </DropdownMenuTrigger>\n              <DropdownMenuContent>\n                <DropdownMenuItem>Rename chat</DropdownMenuItem>\n                <DropdownMenuItem>Delete chat</DropdownMenuItem>\n              </DropdownMenuContent>\n            </DropdownMenu>\n            <Separator orientation='vertical' />\n            <Button variant='ghost' color='neutral' size='small' aria-label='Close chat'>\n              <X />\n            </Button>\n          </ChatHeaderActions>\n        </ChatHeader>\n        <ChatBody aria-busy={isRunning}>\n          <UserMessage data-testid='chat--user-message-0'>\n            <UserMessageBubble>{QUESTION}</UserMessageBubble>\n            <MessageActions>\n              <MessageTimestamp dateTime='2026-10-21T09:41:00Z'>2m ago</MessageTimestamp>\n              <Copyable text={QUESTION}>\n                <MessageAction aria-label='Copy'>\n                  <CopyableIcon />\n                </MessageAction>\n              </Copyable>\n            </MessageActions>\n          </UserMessage>\n          <AssistantMessage data-testid='chat--assistant-message-0' aria-busy={isRunning}>\n            <ChainOfThought>\n              <ChainOfThoughtStep icon={<Search />} label='Searched for blocked requests' />\n              <ChainOfThoughtStep\n                icon={<Database />}\n                label={isRunning ? 'Querying attack events...' : 'Stopped'}\n                status={isRunning ? 'running' : 'done'}\n              />\n            </ChainOfThought>\n            <AssistantMessageContent>\n              <p>Wallarm blocked 1,204 SQL injection attempts, almost all against</p>\n            </AssistantMessageContent>\n          </AssistantMessage>\n        </ChatBody>\n        <ChatFooter>\n          <ChatInput\n            value={value}\n            onValueChange={setValue}\n            onSubmit={handleSubmit}\n            isRunning={isRunning}\n            onStop={handleStop}\n          >\n            <ChatInputTextarea />\n            <ChatInputSubmit />\n          </ChatInput>\n        </ChatFooter>\n      </Chat>\n    </div>\n  );\n};",
          "storyFile": "Chat/Chat.stories.tsx",
          "storyTitle": "AI/Chat",
          "description": "A reply in flight: `ChatBody` and the message carry `aria-busy`, the running step shimmers,\nand the submit is Stop. Stop (or Esc in the textarea) ends the run in this demo."
        },
        {
          "name": "ApprovalDocked",
          "code": "import { useState } from 'react';\nimport { ApprovalCard, ApprovalCardActions, ApprovalCardContent, type ApprovalCardStatus } from '@wallarm-org/design-system/ApprovalCard';\nimport { AssistantMessage, AssistantMessageContent } from '@wallarm-org/design-system/AssistantMessage';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { ChainOfThought, ChainOfThoughtStep } from '@wallarm-org/design-system/ChainOfThought';\nimport { Chat, ChatBody, ChatFooter, ChatHeader, ChatHeaderActions, ChatHeaderTitle } from '@wallarm-org/design-system/Chat';\nimport { ChatInput, ChatInputSubmit, ChatInputTextarea } from '@wallarm-org/design-system/ChatInput';\nimport { InlineCodeSnippet } from '@wallarm-org/design-system/CodeSnippet';\nimport { Copyable, CopyableIcon } from '@wallarm-org/design-system/Copyable';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { Ellipsis, History, Search, ShieldBan, X } from '@wallarm-org/design-system/icons';\nimport { MessageAction, MessageActions, MessageTimestamp } from '@wallarm-org/design-system/MessageActions';\nimport { Separator } from '@wallarm-org/design-system/Separator';\nimport { UserMessage, UserMessageBubble } from '@wallarm-org/design-system/UserMessage';\n\nexport const ApprovalDocked = () => {\n  const [value, setValue] = useState('');\n  const [status, setStatus] = useState<ApprovalCardStatus>('pending');\n  const pending = status === 'pending';\n  const handleSubmit = () => setValue('');\n  const handleApprove = () => setStatus('approved');\n  const handleReject = () => setStatus('rejected');\n\n  return (\n    <div className='h-640 w-480'>\n      <Chat data-testid='chat'>\n        <ChatHeader>\n          <ChatHeaderTitle />\n          <ChatHeaderActions>\n            <Button variant='ghost' color='neutral' size='small' aria-label='Chat history'>\n              <History />\n            </Button>\n            <DropdownMenu positioning={{ placement: 'bottom-end' }}>\n              <DropdownMenuTrigger asChild>\n                <Button variant='ghost' color='neutral' size='small' aria-label='More actions'>\n                  <Ellipsis />\n                </Button>\n              </DropdownMenuTrigger>\n              <DropdownMenuContent>\n                <DropdownMenuItem>Rename chat</DropdownMenuItem>\n                <DropdownMenuItem>Delete chat</DropdownMenuItem>\n              </DropdownMenuContent>\n            </DropdownMenu>\n            <Separator orientation='vertical' />\n            <Button variant='ghost' color='neutral' size='small' aria-label='Close chat'>\n              <X />\n            </Button>\n          </ChatHeaderActions>\n        </ChatHeader>\n        <ChatBody aria-busy={pending}>\n          <UserMessage data-testid='chat--user-message-0'>\n            <UserMessageBubble>{QUESTION}</UserMessageBubble>\n            <MessageActions>\n              <MessageTimestamp dateTime='2026-10-21T09:41:00Z'>2m ago</MessageTimestamp>\n              <Copyable text={QUESTION}>\n                <MessageAction aria-label='Copy'>\n                  <CopyableIcon />\n                </MessageAction>\n              </Copyable>\n            </MessageActions>\n          </UserMessage>\n          <AssistantMessage data-testid='chat--assistant-message-0'>\n            <ChainOfThought>\n              <ChainOfThoughtStep icon={<Search />} label='Searched for blocked requests' />\n              <ChainOfThoughtStep\n                icon={<ShieldBan />}\n                label='Proposed a denylist entry'\n                status={pending ? 'running' : 'done'}\n              />\n            </ChainOfThought>\n            {!pending && (\n              <AssistantMessageContent>\n                <p>\n                  {status === 'approved'\n                    ? 'Done. 203.0.113.0/24 is now denied on all applications.'\n                    : 'Okay, I left the denylist unchanged.'}\n                </p>\n              </AssistantMessageContent>\n            )}\n          </AssistantMessage>\n        </ChatBody>\n        <ChatFooter>\n          <ApprovalCard status={status}>\n            <ApprovalCardContent>\n              <p>\n                Add <InlineCodeSnippet code='203.0.113.0/24' size='sm' /> to the denylist on all\n                applications\n              </p>\n            </ApprovalCardContent>\n            <ApprovalCardActions>\n              <Button data-testid='chat--approve' onClick={handleApprove}>\n                Allow\n              </Button>\n              <Button\n                variant='secondary'\n                color='neutral'\n                data-testid='chat--reject'\n                onClick={handleReject}\n              >\n                Reject\n              </Button>\n            </ApprovalCardActions>\n          </ApprovalCard>\n          <ChatInput\n            value={value}\n            onValueChange={setValue}\n            onSubmit={handleSubmit}\n            isRunning={pending}\n          >\n            <ChatInputTextarea />\n            <ChatInputSubmit />\n          </ChatInput>\n        </ChatFooter>\n      </Chat>\n    </div>\n  );\n};",
          "storyFile": "Chat/Chat.stories.tsx",
          "storyTitle": "AI/Chat",
          "description": "Human-in-the-loop: the pending `ApprovalCard` is docked in `ChatFooter` above the composer\nwhile the run waits. Allow or Reject resolves it in place (so its live region and focus work)\nand the answer continues."
        },
        {
          "name": "ApprovalResolved",
          "code": "import { useState } from 'react';\nimport { ApprovalCard } from '@wallarm-org/design-system/ApprovalCard';\nimport { AssistantMessage, AssistantMessageContent } from '@wallarm-org/design-system/AssistantMessage';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { ChainOfThought, ChainOfThoughtStep } from '@wallarm-org/design-system/ChainOfThought';\nimport { Chat, ChatBody, ChatFooter, ChatHeader, ChatHeaderActions, ChatHeaderTitle } from '@wallarm-org/design-system/Chat';\nimport { ChatInput, ChatInputSubmit, ChatInputTextarea } from '@wallarm-org/design-system/ChatInput';\nimport { Copyable, CopyableIcon } from '@wallarm-org/design-system/Copyable';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { Ellipsis, History, Search, ShieldBan, X } from '@wallarm-org/design-system/icons';\nimport { MessageAction, MessageActions, MessageTimestamp } from '@wallarm-org/design-system/MessageActions';\nimport { Separator } from '@wallarm-org/design-system/Separator';\nimport { UserMessage, UserMessageBubble } from '@wallarm-org/design-system/UserMessage';\n\nexport const ApprovalResolved = () => {\n  const [value, setValue] = useState('');\n  const handleSubmit = () => setValue('');\n\n  return (\n    <div className='h-640 w-480'>\n      <Chat data-testid='chat'>\n        <ChatHeader>\n          <ChatHeaderTitle />\n          <ChatHeaderActions>\n            <Button variant='ghost' color='neutral' size='small' aria-label='Chat history'>\n              <History />\n            </Button>\n            <DropdownMenu positioning={{ placement: 'bottom-end' }}>\n              <DropdownMenuTrigger asChild>\n                <Button variant='ghost' color='neutral' size='small' aria-label='More actions'>\n                  <Ellipsis />\n                </Button>\n              </DropdownMenuTrigger>\n              <DropdownMenuContent>\n                <DropdownMenuItem>Rename chat</DropdownMenuItem>\n                <DropdownMenuItem>Delete chat</DropdownMenuItem>\n              </DropdownMenuContent>\n            </DropdownMenu>\n            <Separator orientation='vertical' />\n            <Button variant='ghost' color='neutral' size='small' aria-label='Close chat'>\n              <X />\n            </Button>\n          </ChatHeaderActions>\n        </ChatHeader>\n        <ChatBody>\n          <UserMessage data-testid='chat--user-message-0'>\n            <UserMessageBubble>{QUESTION}</UserMessageBubble>\n            <MessageActions>\n              <MessageTimestamp dateTime='2026-10-21T09:41:00Z'>2m ago</MessageTimestamp>\n              <Copyable text={QUESTION}>\n                <MessageAction aria-label='Copy'>\n                  <CopyableIcon />\n                </MessageAction>\n              </Copyable>\n            </MessageActions>\n          </UserMessage>\n          <AssistantMessage data-testid='chat--assistant-message-0'>\n            <ChainOfThought>\n              <ChainOfThoughtStep icon={<Search />} label='Searched for blocked requests' />\n              <ChainOfThoughtStep icon={<ShieldBan />} label='Proposed a denylist entry' />\n            </ChainOfThought>\n            <AssistantMessageContent>\n              <p>Done. 203.0.113.0/24 is now denied on all applications.</p>\n            </AssistantMessageContent>\n          </AssistantMessage>\n        </ChatBody>\n        <ChatFooter>\n          {/* Content and actions render only while pending; a resolved card shows just its status row. */}\n          <ApprovalCard status='approved' />\n          <ChatInput value={value} onValueChange={setValue} onSubmit={handleSubmit}>\n            <ChatInputTextarea />\n            <ChatInputSubmit />\n          </ChatInput>\n        </ChatFooter>\n      </Chat>\n    </div>\n  );\n};",
          "storyFile": "Chat/Chat.stories.tsx",
          "storyTitle": "AI/Chat",
          "description": "After the decision the docked card collapses to a one-line status and the answer completes."
        },
        {
          "name": "Permissions",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Chat, ChatBody, ChatFooter, ChatGreeting, ChatHeader, ChatHeaderActions, ChatHeaderTitle } from '@wallarm-org/design-system/Chat';\nimport { ChatInput, ChatInputSubmit, ChatInputTextarea } from '@wallarm-org/design-system/ChatInput';\nimport { ChatPermissions, ChatPermissionsContent, ChatPermissionsItem, type ChatPermissionsItemCheckedChangeDetails, ChatPermissionsTrigger } from '@wallarm-org/design-system/ChatPermissions';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { Ellipsis, History, X } from '@wallarm-org/design-system/icons';\nimport { Separator } from '@wallarm-org/design-system/Separator';\n\nexport const Permissions = () => {\n  const [value, setValue] = useState('');\n  const [allowed, setAllowed] = useState<Record<string, boolean>>({\n    search_attacks: true,\n    get_api_inventory: true,\n    propose_add_to_denylist: false,\n  });\n  const handleSubmit = () => setValue('');\n  const handlePermissionChange = ({ checked, name }: ChatPermissionsItemCheckedChangeDetails) =>\n    setAllowed(prev => ({ ...prev, [name]: checked }));\n\n  return (\n    <div className='h-640 w-480'>\n      <Chat data-testid='chat' background='strong'>\n        <ChatHeader>\n          <ChatHeaderTitle />\n          <ChatHeaderActions>\n            <Button variant='ghost' color='neutral' size='small' aria-label='Chat history'>\n              <History />\n            </Button>\n            <DropdownMenu positioning={{ placement: 'bottom-end' }}>\n              <DropdownMenuTrigger asChild>\n                <Button variant='ghost' color='neutral' size='small' aria-label='More actions'>\n                  <Ellipsis />\n                </Button>\n              </DropdownMenuTrigger>\n              <DropdownMenuContent>\n                <DropdownMenuItem>Rename chat</DropdownMenuItem>\n                <DropdownMenuItem>Delete chat</DropdownMenuItem>\n              </DropdownMenuContent>\n            </DropdownMenu>\n            <Separator orientation='vertical' />\n            <Button variant='ghost' color='neutral' size='small' aria-label='Close chat'>\n              <X />\n            </Button>\n          </ChatHeaderActions>\n        </ChatHeader>\n        <ChatBody>\n          <ChatGreeting title='How can I help you today?' />\n        </ChatBody>\n        <ChatFooter>\n          <ChatInput value={value} onValueChange={setValue} onSubmit={handleSubmit}>\n            <ChatInputTextarea />\n            <ChatPermissions>\n              <ChatPermissionsTrigger />\n              <ChatPermissionsContent>\n                {TOOLS.map(tool => (\n                  <ChatPermissionsItem\n                    key={tool.name}\n                    name={tool.name}\n                    data-testid={`chat--permission-${tool.name}`}\n                    title={tool.name}\n                    description={tool.description}\n                    checked={allowed[tool.name]}\n                    onCheckedChange={handlePermissionChange}\n                  />\n                ))}\n              </ChatPermissionsContent>\n            </ChatPermissions>\n            <ChatInputSubmit />\n          </ChatInput>\n        </ChatFooter>\n      </Chat>\n    </div>\n  );\n};",
          "storyFile": "Chat/Chat.stories.tsx",
          "storyTitle": "AI/Chat",
          "description": "The per-conversation tool permissions sit inside the composer, between textarea and submit."
        },
        {
          "name": "InDrawer",
          "code": "import { useState } from 'react';\nimport { AssistantMessage, AssistantMessageContent } from '@wallarm-org/design-system/AssistantMessage';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { ChainOfThought, ChainOfThoughtStep } from '@wallarm-org/design-system/ChainOfThought';\nimport { Chat, ChatBody, ChatFooter, ChatHeader, ChatHeaderActions, ChatHeaderTitle, ChatTrigger } from '@wallarm-org/design-system/Chat';\nimport { ChatInput, ChatInputSubmit, ChatInputTextarea } from '@wallarm-org/design-system/ChatInput';\nimport { InlineCodeSnippet } from '@wallarm-org/design-system/CodeSnippet';\nimport { Copyable, CopyableIcon } from '@wallarm-org/design-system/Copyable';\nimport { Drawer, DrawerClose, DrawerContent, DrawerTrigger } from '@wallarm-org/design-system/Drawer';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { Brain, Database, Ellipsis, History, Search, ThumbsDown, ThumbsUp, X } from '@wallarm-org/design-system/icons';\nimport { MessageAction, MessageActions, MessageTimestamp } from '@wallarm-org/design-system/MessageActions';\nimport { Separator } from '@wallarm-org/design-system/Separator';\nimport { UserMessage, UserMessageBubble } from '@wallarm-org/design-system/UserMessage';\n\nexport const InDrawer = () => {\n  const [value, setValue] = useState('');\n  const [isRunning, setIsRunning] = useState(true);\n  const handleSubmit = () => setValue('');\n  const handleStop = () => setIsRunning(false);\n\n  return (\n    <Drawer width={480}>\n      <DrawerTrigger asChild>\n        <ChatTrigger data-testid='chat-trigger' />\n      </DrawerTrigger>\n      <DrawerContent>\n        <Chat data-testid='chat'>\n          <ChatHeader>\n            <ChatHeaderTitle />\n            <ChatHeaderActions>\n              <Button variant='ghost' color='neutral' size='small' aria-label='Chat history'>\n                <History />\n              </Button>\n              <DropdownMenu positioning={{ placement: 'bottom-end' }}>\n                <DropdownMenuTrigger asChild>\n                  <Button variant='ghost' color='neutral' size='small' aria-label='More actions'>\n                    <Ellipsis />\n                  </Button>\n                </DropdownMenuTrigger>\n                <DropdownMenuContent>\n                  <DropdownMenuItem>Rename chat</DropdownMenuItem>\n                  <DropdownMenuItem>Delete chat</DropdownMenuItem>\n                </DropdownMenuContent>\n              </DropdownMenu>\n              <Separator orientation='vertical' />\n              <DrawerClose asChild>\n                <Button variant='ghost' color='neutral' size='small' aria-label='Close chat'>\n                  <X />\n                </Button>\n              </DrawerClose>\n            </ChatHeaderActions>\n          </ChatHeader>\n          <ChatBody aria-busy={isRunning}>\n            <UserMessage data-testid='chat--user-message-0'>\n              <UserMessageBubble>{QUESTION}</UserMessageBubble>\n              <MessageActions>\n                <MessageTimestamp dateTime='2026-10-21T09:41:00Z'>2m ago</MessageTimestamp>\n                <Copyable text={QUESTION}>\n                  <MessageAction aria-label='Copy'>\n                    <CopyableIcon />\n                  </MessageAction>\n                </Copyable>\n              </MessageActions>\n            </UserMessage>\n            <AssistantMessage data-testid='chat--assistant-message-0' aria-busy={isRunning}>\n              <ChainOfThought>\n                <ChainOfThoughtStep icon={<Brain />} label='Thought for 5s'>\n                  <p>\n                    Look up blocked requests to /api/login for last night, then group them by\n                    source.\n                  </p>\n                </ChainOfThoughtStep>\n                <ChainOfThoughtStep icon={<Search />} label='Searched for blocked requests' />\n                <ChainOfThoughtStep\n                  icon={<Database />}\n                  label='Queried attack events'\n                  metric='1,204'\n                />\n              </ChainOfThought>\n              <AssistantMessageContent>\n                <h3>SQL injection on the login endpoint</h3>\n                <p>\n                  Wallarm blocked 1,204 SQL injection attempts, almost all against{' '}\n                  <InlineCodeSnippet code='/api/login' size='sm' />.\n                </p>\n                <ul>\n                  <li>\n                    Most came from <InlineCodeSnippet code='203.0.113.0/24' size='sm' />.\n                  </li>\n                  <li>The peak was at 03:00 UTC.</li>\n                  <li>No request reached the application.</li>\n                </ul>\n              </AssistantMessageContent>\n              {!isRunning && (\n                <MessageActions visible>\n                  <Copyable text={ANSWER_TEXT}>\n                    <MessageAction aria-label='Copy' data-testid='chat--answer-copy'>\n                      <CopyableIcon />\n                    </MessageAction>\n                  </Copyable>\n                  <MessageAction aria-label='Good response'>\n                    <ThumbsUp />\n                  </MessageAction>\n                  <MessageAction aria-label='Bad response'>\n                    <ThumbsDown />\n                  </MessageAction>\n                  <MessageTimestamp dateTime='2026-10-21T09:42:00Z'>1m ago</MessageTimestamp>\n                </MessageActions>\n              )}\n            </AssistantMessage>\n          </ChatBody>\n          <ChatFooter>\n            <ChatInput\n              value={value}\n              onValueChange={setValue}\n              onSubmit={handleSubmit}\n              isRunning={isRunning}\n              onStop={handleStop}\n            >\n              <ChatInputTextarea />\n              <ChatInputSubmit />\n            </ChatInput>\n          </ChatFooter>\n        </Chat>\n      </DrawerContent>\n    </Drawer>\n  );\n};",
          "storyFile": "Chat/Chat.stories.tsx",
          "storyTitle": "AI/Chat",
          "description": "The real host: `ChatTrigger` opens a 480px right-hand `Drawer` holding the conversation, and\nClose is a `DrawerClose`. Esc in the textarea while running stops the reply instead of closing\nthe drawer; ChatInput handles that itself, so the host needs no `onEscapeKeyDown`."
        }
      ]
    },
    {
      "name": "ChatInput",
      "description": "The composer at the bottom of the Wally chat: a growing textarea where Enter sends and Shift+Enter adds a line, with the send button turning into Stop while a reply streams. It is controlled — the app owns the draft and the running state — and any actions such as `ChatPermissions` go between the textarea and `ChatInputSubmit`.",
      "importPath": "@wallarm-org/design-system/ChatInput",
      "props": [
        {
          "name": "value",
          "type": "string",
          "required": true,
          "description": "Controlled only — the app owns the draft."
        },
        {
          "name": "onValueChange",
          "type": "(value: string) => void",
          "required": true
        },
        {
          "name": "onSubmit",
          "type": "(value: string) => void",
          "required": true,
          "description": "Receives `value.trim()`. Not called when the value is empty, while `isRunning`, or when\n`disabled`. The form's native submit is prevented and focus returns to the textarea."
        },
        {
          "name": "onStop",
          "type": "(() => void) | undefined",
          "required": false,
          "description": "Stop-button click, and Esc in the textarea while `isRunning`.\nInside a Drawer/Dialog that Esc stops the run and doesn't close the layer; no host\n`onEscapeKeyDown` is needed. While running, a consumer `onKeyDown` can't cancel the Esc\nstop with `preventDefault` (the textarea has already claimed the key from the layer).\nWithout `onStop`, Esc is left to the layer. A consumer popup anchored to the textarea\n(mention/autocomplete) keeps Esc while the textarea has `aria-expanded='true'`."
        },
        {
          "name": "isRunning",
          "type": "boolean | undefined",
          "required": false,
          "description": "Swaps Send for Stop and blocks submit. CopilotKit: `agent.isRunning`.",
          "defaultValue": "false"
        },
        {
          "name": "disabled",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "context",
          "type": "ReactNode",
          "required": false,
          "description": "Attached-context chips, shown in a bar behind the box. Nothing to render (`null`, `false`, `[]`) hides the bar."
        },
        {
          "name": "disclaimer",
          "type": "ReactNode",
          "required": false,
          "description": "Line under the box. `null`/`false` hides it.",
          "defaultValue": "DEFAULT_DISCLAIMER"
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "name",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "target",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "autoComplete",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "withContext",
          "options": [
            "false",
            "true"
          ],
          "defaultValue": "false"
        },
        {
          "name": "disabled",
          "options": [
            "true"
          ]
        }
      ],
      "subComponents": [
        {
          "name": "ChatInputSubmit",
          "props": [
            {
              "name": "sendLabel",
              "type": "string | undefined",
              "required": false,
              "description": "Accessible name while idle.",
              "defaultValue": "Send"
            },
            {
              "name": "stopLabel",
              "type": "string | undefined",
              "required": false,
              "description": "Accessible name and tooltip while `isRunning`.",
              "defaultValue": "Stop response"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "ChatInputTextarea",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, HTMLTextAreaElement> | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "autoComplete",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "maxLength",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "minLength",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "placeholder",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "readOnly",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "required",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Default",
          "code": "import { useState } from 'react';\nimport { ChatInput, ChatInputSubmit, ChatInputTextarea } from '@wallarm-org/design-system/ChatInput';\n\nexport const Default = () => {\n  const [value, setValue] = useState('');\n  const [isRunning, setIsRunning] = useState(false);\n\n  const handleSubmit = () => {\n    setValue('');\n    setIsRunning(true);\n  };\n\n  const handleStop = () => {\n    setIsRunning(false);\n  };\n\n  return (\n    <div className='w-[400px]'>\n      <ChatInput\n        data-testid='chat-input'\n        value={value}\n        onValueChange={setValue}\n        isRunning={isRunning}\n        onSubmit={handleSubmit}\n        onStop={handleStop}\n      >\n        <ChatInputTextarea />\n        <ChatInputSubmit />\n      </ChatInput>\n    </div>\n  );\n};",
          "storyFile": "ChatInput/ChatInput.stories.tsx",
          "storyTitle": "AI/ChatInput",
          "description": "Empty and ready: Send stays disabled until there is something other than whitespace to send.\nThe app owns the draft: sending starts a \"response\", Stop or Esc ends it."
        },
        {
          "name": "Typing",
          "code": "import { useState } from 'react';\nimport { ChatInput, ChatInputSubmit, ChatInputTextarea } from '@wallarm-org/design-system/ChatInput';\n\nexport const Typing = () => {\n  const [value, setValue] = useState(\n    'Why was 203.0.113.42 blocked yesterday?\\nShow the attacks it sent\\nand the rule that matched them.',\n  );\n  const [isRunning, setIsRunning] = useState(false);\n\n  const handleSubmit = () => {\n    setValue('');\n    setIsRunning(true);\n  };\n\n  const handleStop = () => {\n    setIsRunning(false);\n  };\n\n  return (\n    <div className='w-[400px]'>\n      <ChatInput\n        data-testid='chat-input'\n        value={value}\n        onValueChange={setValue}\n        isRunning={isRunning}\n        onSubmit={handleSubmit}\n        onStop={handleStop}\n      >\n        <ChatInputTextarea />\n        <ChatInputSubmit />\n      </ChatInput>\n    </div>\n  );\n};",
          "storyFile": "ChatInput/ChatInput.stories.tsx",
          "storyTitle": "AI/ChatInput",
          "description": "A multi-line draft — the textarea grows with its content up to eight lines, then scrolls."
        },
        {
          "name": "Streaming",
          "code": "import { useState } from 'react';\nimport { ChatInput, ChatInputSubmit, ChatInputTextarea } from '@wallarm-org/design-system/ChatInput';\n\nexport const Streaming = () => {\n  const [value, setValue] = useState('');\n  const [isRunning, setIsRunning] = useState(true);\n\n  const handleSubmit = () => {\n    setValue('');\n    setIsRunning(true);\n  };\n\n  const handleStop = () => {\n    setIsRunning(false);\n  };\n\n  return (\n    <div className='w-[400px]'>\n      <ChatInput\n        data-testid='chat-input'\n        value={value}\n        onValueChange={setValue}\n        isRunning={isRunning}\n        onSubmit={handleSubmit}\n        onStop={handleStop}\n      >\n        <ChatInputTextarea />\n        <ChatInputSubmit />\n      </ChatInput>\n    </div>\n  );\n};",
          "storyFile": "ChatInput/ChatInput.stories.tsx",
          "storyTitle": "AI/ChatInput",
          "description": "While a reply streams the button becomes Stop; its tooltip mentions that Esc in the textarea does the same."
        },
        {
          "name": "Disabled",
          "code": "import { useState } from 'react';\nimport { ChatInput, ChatInputSubmit, ChatInputTextarea } from '@wallarm-org/design-system/ChatInput';\n\nexport const Disabled = () => {\n  const [value, setValue] = useState('Draft kept');\n\n  const handleSubmit = () => {\n    setValue('');\n  };\n\n  return (\n    <div className='w-[400px]'>\n      <ChatInput\n        data-testid='chat-input'\n        disabled\n        value={value}\n        onValueChange={setValue}\n        onSubmit={handleSubmit}\n      >\n        <ChatInputTextarea />\n        <ChatInputSubmit />\n      </ChatInput>\n    </div>\n  );\n};",
          "storyFile": "ChatInput/ChatInput.stories.tsx",
          "storyTitle": "AI/ChatInput",
          "description": "Disabled as a whole, e.g. while the assistant is unavailable."
        },
        {
          "name": "WithContext",
          "code": "import { type MouseEvent, useState } from 'react';\nimport { Badge } from '@wallarm-org/design-system/Badge';\nimport { ChatInput, ChatInputSubmit, ChatInputTextarea } from '@wallarm-org/design-system/ChatInput';\nimport { Quote } from '@wallarm-org/design-system/icons';\nimport { TagClose } from '@wallarm-org/design-system/Tag';\n\nexport const WithContext = () => {\n  const [value, setValue] = useState('');\n  const [chips, setChips] = useState(['Attacks', 'Incidents']);\n\n  const handleContextRemove = (event: MouseEvent<HTMLButtonElement>) => {\n    const chip = event.currentTarget.value;\n    setChips(prev => prev.filter(item => item !== chip));\n  };\n\n  const handleSubmit = () => {\n    setValue('');\n  };\n\n  return (\n    <div className='w-[400px]'>\n      <ChatInput\n        data-testid='chat-input'\n        value={value}\n        onValueChange={setValue}\n        onSubmit={handleSubmit}\n        context={chips.map(chip => (\n          <Badge key={chip} type='secondary' color='blue' data-testid={`context-${chip}`}>\n            <Quote />\n            {chip}\n            <TagClose\n              aria-label={`Remove ${chip}`}\n              value={chip}\n              className='rounded-4 focus-visible:ring-3 focus-visible:ring-focus-primary'\n              onClick={handleContextRemove}\n            />\n          </Badge>\n        ))}\n      >\n        <ChatInputTextarea />\n        <ChatInputSubmit />\n      </ChatInput>\n    </div>\n  );\n};",
          "storyFile": "ChatInput/ChatInput.stories.tsx",
          "storyTitle": "AI/ChatInput",
          "description": "Attached context sits in a blue bar behind the box; pass `context` only when there are chips."
        },
        {
          "name": "WithSettings",
          "code": "import { useState } from 'react';\nimport { ChatInput, ChatInputSubmit, ChatInputTextarea } from '@wallarm-org/design-system/ChatInput';\nimport { ChatPermissions, ChatPermissionsContent, ChatPermissionsItem, type ChatPermissionsItemCheckedChangeDetails, ChatPermissionsTrigger } from '@wallarm-org/design-system/ChatPermissions';\n\nexport const WithSettings = () => {\n  const [value, setValue] = useState('');\n  const [allowed, setAllowed] = useState({ search_attacks: true, propose_add_to_denylist: true });\n\n  const handlePermissionChange = ({ checked, name }: ChatPermissionsItemCheckedChangeDetails) => {\n    setAllowed(prev => ({ ...prev, [name]: checked }));\n  };\n\n  const handleSubmit = () => {\n    setValue('');\n  };\n\n  return (\n    <div className='flex h-[320px] items-end'>\n      <div className='w-[400px]'>\n        <ChatInput\n          data-testid='chat-input'\n          value={value}\n          onValueChange={setValue}\n          onSubmit={handleSubmit}\n        >\n          <ChatInputTextarea />\n          <ChatPermissions data-testid='permissions'>\n            <ChatPermissionsTrigger />\n            <ChatPermissionsContent>\n              {Object.entries(allowed).map(([name, checked]) => (\n                <ChatPermissionsItem\n                  key={name}\n                  name={name}\n                  title={name}\n                  checked={checked}\n                  onCheckedChange={handlePermissionChange}\n                />\n              ))}\n            </ChatPermissionsContent>\n          </ChatPermissions>\n          <ChatInputSubmit />\n        </ChatInput>\n      </div>\n    </div>\n  );\n};",
          "storyFile": "ChatInput/ChatInput.stories.tsx",
          "storyTitle": "AI/ChatInput",
          "description": "`ChatPermissions` goes between the textarea and the submit, on the second row."
        },
        {
          "name": "NoDisclaimer",
          "code": "import { useState } from 'react';\nimport { ChatInput, ChatInputSubmit, ChatInputTextarea } from '@wallarm-org/design-system/ChatInput';\n\nexport const NoDisclaimer = () => {\n  const [value, setValue] = useState('');\n\n  const handleSubmit = () => {\n    setValue('');\n  };\n\n  return (\n    <div className='w-[400px]'>\n      <ChatInput\n        data-testid='chat-input'\n        disclaimer={null}\n        value={value}\n        onValueChange={setValue}\n        onSubmit={handleSubmit}\n      >\n        <ChatInputTextarea />\n        <ChatInputSubmit />\n      </ChatInput>\n    </div>\n  );\n};",
          "storyFile": "ChatInput/ChatInput.stories.tsx",
          "storyTitle": "AI/ChatInput",
          "description": "`disclaimer={null}` drops the line under the box."
        },
        {
          "name": "Analytics",
          "code": "import { useState } from 'react';\nimport { ChatInput, ChatInputSubmit, ChatInputTextarea } from '@wallarm-org/design-system/ChatInput';\n\nexport const Analytics = () => {\n  const [value, setValue] = useState('');\n\n  const handleSubmit = () => {\n    setValue('');\n  };\n\n  return (\n    <div className='w-[400px]'>\n      <ChatInput\n        data-testid='chat-input'\n        value={value}\n        onValueChange={setValue}\n        onSubmit={handleSubmit}\n      >\n        <ChatInputTextarea data-analytics-id='WALLY_PROMPT' />\n        <ChatInputSubmit\n          data-analytics-id='WALLY_SEND'\n          data-analytics-props='{\"surface\":\"wally\"}'\n        />\n      </ChatInput>\n    </div>\n  );\n};",
          "storyFile": "ChatInput/ChatInput.stories.tsx",
          "storyTitle": "AI/ChatInput",
          "description": "`data-analytics-*` goes straight on `ChatInputTextarea` and `ChatInputSubmit`, which render the real nodes."
        }
      ]
    },
    {
      "name": "ChatPermissions",
      "description": "The settings button in the chat composer that lists which Wally tools may run without asking first in this conversation. Each row is a switch and takes effect the moment it is flipped — there is no Save, and the popover stays open so several tools can be changed in one go. The app owns the list and its order: enabled tools first, then a `Separator` and the disabled ones.",
      "importPath": "@wallarm-org/design-system/ChatPermissions",
      "props": [
        {
          "name": "open",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "onOpenChange",
          "type": "((open: boolean) => void) | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [
        {
          "name": "ChatPermissionsContent",
          "props": [
            {
              "name": "label",
              "type": "ReactNode",
              "required": false,
              "description": "Heading above the tool rows; also names the dialog. Pass `null`, `false` or `''` to hide it.",
              "defaultValue": "Always allowed in this conversation"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "minHeight",
              "type": "PopoverSizeDimension | undefined",
              "required": false
            },
            {
              "name": "maxHeight",
              "type": "PopoverSizeDimension | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "ChatPermissionsItem",
          "props": [
            {
              "name": "name",
              "type": "string",
              "required": true,
              "description": "Machine name of the tool, e.g. `propose_add_to_denylist`; echoed back in `onCheckedChange`."
            },
            {
              "name": "title",
              "type": "ReactNode",
              "required": true,
              "description": "Visible tool name."
            },
            {
              "name": "description",
              "type": "ReactNode",
              "required": false
            },
            {
              "name": "onCheckedChange",
              "type": "complex",
              "required": false
            },
            {
              "name": "label",
              "type": "string | undefined",
              "required": false,
              "description": "Specifies the localized strings that identifies the accessibility elements and their states"
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false,
              "description": "Whether the switch is disabled."
            },
            {
              "name": "value",
              "type": "string | number | undefined",
              "required": false,
              "description": "The value of switch input. Useful for form submission."
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "description": "Use the provided child element as the default rendered element, combining their props and behavior."
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "ids",
              "type": "ElementIds | undefined",
              "required": false,
              "description": "The ids of the elements in the switch. Useful for composition."
            },
            {
              "name": "readOnly",
              "type": "boolean | undefined",
              "required": false,
              "description": "Whether the switch is read-only"
            },
            {
              "name": "required",
              "type": "boolean | undefined",
              "required": false,
              "description": "If `true`, the switch input is marked as required,"
            },
            {
              "name": "htmlFor",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "invalid",
              "type": "boolean | undefined",
              "required": false,
              "description": "If `true`, the switch is marked as invalid."
            },
            {
              "name": "checked",
              "type": "boolean | undefined",
              "required": false,
              "description": "The controlled checked state of the switch"
            },
            {
              "name": "a11yMode",
              "type": "boolean | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "ChatPermissionsTrigger",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "AllOn",
          "code": "import { useState } from 'react';\nimport { ChatPermissions, ChatPermissionsContent, ChatPermissionsItem, type ChatPermissionsItemCheckedChangeDetails, ChatPermissionsTrigger } from '@wallarm-org/design-system/ChatPermissions';\nimport { Separator } from '@wallarm-org/design-system/Separator';\n\nexport const AllOn = () => {\n  const [allowed, setAllowed] = useState<Record<string, boolean>>({\n    propose_add_to_denylist: true,\n    search_attacks: true,\n    get_api_inventory: true,\n    create_rule: true,\n  });\n  const enabled = TOOLS.filter(tool => allowed[tool.name]);\n  const disabled = TOOLS.filter(tool => !allowed[tool.name]);\n\n  const handleCheckedChange = ({ checked, name }: ChatPermissionsItemCheckedChangeDetails) => {\n    setAllowed(prev => ({ ...prev, [name]: checked }));\n  };\n\n  return (\n    <div className='flex h-[360px] w-[400px] items-end'>\n      <ChatPermissions data-testid='permissions'>\n        <ChatPermissionsTrigger />\n        <ChatPermissionsContent>\n          {enabled.map(tool => (\n            <ChatPermissionsItem\n              key={tool.name}\n              name={tool.name}\n              data-testid={`permission-${tool.name}`}\n              title={tool.name}\n              description={tool.description}\n              checked\n              onCheckedChange={handleCheckedChange}\n            />\n          ))}\n          {enabled.length > 0 && disabled.length > 0 && <Separator spacing={4} />}\n          {disabled.map(tool => (\n            <ChatPermissionsItem\n              key={tool.name}\n              name={tool.name}\n              data-testid={`permission-${tool.name}`}\n              title={tool.name}\n              description={tool.description}\n              checked={false}\n              onCheckedChange={handleCheckedChange}\n            />\n          ))}\n        </ChatPermissionsContent>\n      </ChatPermissions>\n    </div>\n  );\n};",
          "storyFile": "ChatPermissions/ChatPermissions.stories.tsx",
          "storyTitle": "AI/ChatPermissions",
          "description": "Every tool is allowed. Open the popover with the settings button; the tooltip names it until then."
        },
        {
          "name": "SomeOff",
          "code": "import { useState } from 'react';\nimport { ChatPermissions, ChatPermissionsContent, ChatPermissionsItem, type ChatPermissionsItemCheckedChangeDetails, ChatPermissionsTrigger } from '@wallarm-org/design-system/ChatPermissions';\nimport { Separator } from '@wallarm-org/design-system/Separator';\n\nexport const SomeOff = () => {\n  const [allowed, setAllowed] = useState<Record<string, boolean>>({\n    propose_add_to_denylist: true,\n    search_attacks: true,\n    get_api_inventory: false,\n    create_rule: false,\n  });\n  const enabled = TOOLS.filter(tool => allowed[tool.name]);\n  const disabled = TOOLS.filter(tool => !allowed[tool.name]);\n\n  const handleCheckedChange = ({ checked, name }: ChatPermissionsItemCheckedChangeDetails) => {\n    setAllowed(prev => ({ ...prev, [name]: checked }));\n  };\n\n  return (\n    <div className='flex h-[360px] w-[400px] items-end'>\n      <ChatPermissions data-testid='permissions'>\n        <ChatPermissionsTrigger />\n        <ChatPermissionsContent>\n          {enabled.map(tool => (\n            <ChatPermissionsItem\n              key={tool.name}\n              name={tool.name}\n              data-testid={`permission-${tool.name}`}\n              title={tool.name}\n              description={tool.description}\n              checked\n              onCheckedChange={handleCheckedChange}\n            />\n          ))}\n          {enabled.length > 0 && disabled.length > 0 && <Separator spacing={4} />}\n          {disabled.map(tool => (\n            <ChatPermissionsItem\n              key={tool.name}\n              name={tool.name}\n              data-testid={`permission-${tool.name}`}\n              title={tool.name}\n              description={tool.description}\n              checked={false}\n              onCheckedChange={handleCheckedChange}\n            />\n          ))}\n        </ChatPermissionsContent>\n      </ChatPermissions>\n    </div>\n  );\n};",
          "storyFile": "ChatPermissions/ChatPermissions.stories.tsx",
          "storyTitle": "AI/ChatPermissions",
          "description": "Two tools switched off sit below a separator. The order is decided by the app, not the component."
        },
        {
          "name": "Analytics",
          "code": "import { useState } from 'react';\nimport { ChatPermissions, ChatPermissionsContent, ChatPermissionsItem, type ChatPermissionsItemCheckedChangeDetails, ChatPermissionsTrigger } from '@wallarm-org/design-system/ChatPermissions';\n\nexport const Analytics = () => {\n  const [checked, setChecked] = useState(true);\n\n  const handleCheckedChange = (details: ChatPermissionsItemCheckedChangeDetails) => {\n    setChecked(details.checked);\n  };\n\n  return (\n    <div className='flex h-[360px] w-[400px] items-end'>\n      <ChatPermissions data-testid='permissions'>\n        <ChatPermissionsTrigger data-analytics-id='CHAT_PERMISSIONS_OPEN' />\n        <ChatPermissionsContent>\n          <ChatPermissionsItem\n            name='search_attacks'\n            data-testid='permission-search_attacks'\n            data-analytics-id='CHAT_PERMISSION_TOGGLE'\n            data-analytics-props='{\"tool\":\"search_attacks\"}'\n            title='search_attacks'\n            description='Search detected attacks and incidents'\n            checked={checked}\n            onCheckedChange={handleCheckedChange}\n          />\n        </ChatPermissionsContent>\n      </ChatPermissions>\n    </div>\n  );\n};",
          "storyFile": "ChatPermissions/ChatPermissions.stories.tsx",
          "storyTitle": "AI/ChatPermissions",
          "description": "`data-analytics-id` lands on the real trigger `<button>` and on each switch row's `<label>`, so\na click anywhere on the row resolves to the row's id."
        }
      ]
    },
    {
      "name": "Checkbox",
      "description": "Collects any number of choices from a limited set, or turns a single option on or off — reach for `Radio` when only one choice is allowed, and `Switch` when the change takes effect immediately instead of on submit. Past roughly ten options, a `Select` reads better than a long column of boxes.",
      "importPath": "@wallarm-org/design-system/Checkbox",
      "props": [
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "htmlFor",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string",
          "required": false,
          "description": "The unique identifier of the machine."
        },
        {
          "name": "form",
          "type": "string | undefined",
          "required": false,
          "description": "The id of the form that the checkbox belongs to."
        },
        {
          "name": "defaultChecked",
          "type": "CheckedState | undefined",
          "required": false,
          "description": "The initial checked state of the checkbox when rendered.\nUse when you don't need to control the checked state of the checkbox."
        },
        {
          "name": "disabled",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the checkbox is disabled"
        },
        {
          "name": "name",
          "type": "string | undefined",
          "required": false,
          "description": "The name of the input field in a checkbox.\nUseful for form submission."
        },
        {
          "name": "value",
          "type": "string | undefined",
          "required": false,
          "description": "The value of checkbox input. Useful for form submission."
        },
        {
          "name": "ids",
          "type": "ElementIds | undefined",
          "required": false,
          "description": "The ids of the elements in the checkbox. Useful for composition."
        },
        {
          "name": "readOnly",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the checkbox is read-only"
        },
        {
          "name": "required",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the checkbox is required"
        },
        {
          "name": "onCheckedChange",
          "type": "complex",
          "required": false,
          "description": "The callback invoked when the checked state changes."
        },
        {
          "name": "invalid",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the checkbox is invalid"
        },
        {
          "name": "checked",
          "type": "CheckedState | undefined",
          "required": false,
          "description": "The controlled checked state of the checkbox"
        },
        {
          "name": "asChild",
          "type": "boolean | undefined",
          "required": false,
          "description": "Use the provided child element as the default rendered element, combining their props and behavior."
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [
        {
          "name": "CheckboxDescription",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "CheckboxGroup",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string[] | undefined",
              "required": false,
              "description": "The initial value of `value` when uncontrolled"
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false,
              "description": "If `true`, the checkbox group is disabled"
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false,
              "description": "The name of the input fields in the checkbox group\n(Useful for form submission)."
            },
            {
              "name": "value",
              "type": "string[] | undefined",
              "required": false,
              "description": "The controlled value of the checkbox group"
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "description": "Use the provided child element as the default rendered element, combining their props and behavior."
            },
            {
              "name": "readOnly",
              "type": "boolean | undefined",
              "required": false,
              "description": "If `true`, the checkbox group is read-only"
            },
            {
              "name": "invalid",
              "type": "boolean | undefined",
              "required": false,
              "description": "If `true`, the checkbox group is invalid"
            },
            {
              "name": "onValueChange",
              "type": "((value: string[]) => void) | undefined",
              "required": false,
              "description": "The callback to call when the value changes"
            },
            {
              "name": "maxSelectedValues",
              "type": "number | undefined",
              "required": false,
              "description": "The maximum number of selected values"
            },
            {
              "name": "variant",
              "type": "{ default: string; card: string; }",
              "required": false,
              "defaultValue": "default"
            }
          ]
        },
        {
          "name": "CheckboxLabel",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "description": "Use the provided child element as the default rendered element, combining their props and behavior."
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Checkbox, CheckboxIndicator, CheckboxLabel } from '@wallarm-org/design-system/Checkbox';\n\nexport const Basic = () => (\n  <Checkbox data-testid='checkbox'>\n    <CheckboxIndicator />\n    <CheckboxLabel>Accept terms and conditions</CheckboxLabel>\n  </Checkbox>\n);",
          "storyFile": "Checkbox/Checkbox.stories.tsx",
          "storyTitle": "Inputs/Checkbox",
          "description": "The smallest useful composition — `CheckboxIndicator` plus `CheckboxLabel`. Keep labels to a few\nwords in sentence case, and reword rather than truncate."
        },
        {
          "name": "Checked",
          "code": "import { Checkbox, CheckboxIndicator, CheckboxLabel } from '@wallarm-org/design-system/Checkbox';\n\nexport const Checked = () => (\n  <Checkbox checked>\n    <CheckboxIndicator />\n    <CheckboxLabel>Accept terms and conditions</CheckboxLabel>\n  </Checkbox>\n);",
          "storyFile": "Checkbox/Checkbox.stories.tsx",
          "storyTitle": "Inputs/Checkbox",
          "description": "The checked state. Pass `checked` to drive it from your own state, or `defaultChecked` to let the checkbox keep track of it."
        },
        {
          "name": "Indeterminate",
          "code": "import { Checkbox, CheckboxIndicator, CheckboxLabel } from '@wallarm-org/design-system/Checkbox';\n\nexport const Indeterminate = () => (\n  <Checkbox checked='indeterminate'>\n    <CheckboxIndicator />\n    <CheckboxLabel>Accept terms and conditions</CheckboxLabel>\n  </Checkbox>\n);",
          "storyFile": "Checkbox/Checkbox.stories.tsx",
          "storyTitle": "Inputs/Checkbox",
          "description": "`checked='indeterminate'` is for a parent whose children are only partly selected. Set it\ndeliberately — a click never produces it — and clear it once every child is checked or unchecked."
        },
        {
          "name": "Disabled",
          "code": "import { Checkbox, CheckboxIndicator, CheckboxLabel } from '@wallarm-org/design-system/Checkbox';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Disabled = () => (\n  <VStack>\n    <Checkbox disabled>\n      <CheckboxIndicator />\n      <CheckboxLabel>Accept terms and conditions</CheckboxLabel>\n    </Checkbox>\n\n    <Checkbox checked disabled>\n      <CheckboxIndicator />\n      <CheckboxLabel>Accept terms and conditions</CheckboxLabel>\n    </Checkbox>\n\n    <Checkbox checked='indeterminate' disabled>\n      <CheckboxIndicator />\n      <CheckboxLabel>Accept terms and conditions</CheckboxLabel>\n    </Checkbox>\n  </VStack>\n);",
          "storyFile": "Checkbox/Checkbox.stories.tsx",
          "storyTitle": "Inputs/Checkbox",
          "description": "All three states while disabled, so you can see that the indicator stays readable when the option cannot be changed."
        },
        {
          "name": "WithDescription",
          "code": "import { Checkbox, CheckboxDescription, CheckboxIndicator, CheckboxLabel } from '@wallarm-org/design-system/Checkbox';\nimport { Info } from '@wallarm-org/design-system/icons';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@wallarm-org/design-system/Tooltip';\n\nexport const WithDescription = () => (\n  <Checkbox>\n    <CheckboxIndicator />\n    <CheckboxLabel>\n      Accept terms and conditions\n      <Tooltip>\n        <TooltipTrigger>\n          <Info />\n        </TooltipTrigger>\n        <TooltipContent>Additional information</TooltipContent>\n      </Tooltip>\n    </CheckboxLabel>\n    <CheckboxDescription>\n      By clicking this checkbox, you agree to the terms and conditions.\n    </CheckboxDescription>\n  </Checkbox>\n);",
          "storyFile": "Checkbox/Checkbox.stories.tsx",
          "storyTitle": "Inputs/Checkbox",
          "description": "`CheckboxDescription` adds a second line under the label, and switches the row to a grid so that text lines up with the label rather than the box."
        },
        {
          "name": "Group",
          "code": "import { Checkbox, CheckboxGroup, CheckboxIndicator, CheckboxLabel } from '@wallarm-org/design-system/Checkbox';\n\nexport const Group = () => (\n  <CheckboxGroup name='framework' defaultValue={['vue']}>\n    <Checkbox value='react'>\n      <CheckboxIndicator />\n      <CheckboxLabel>React</CheckboxLabel>\n    </Checkbox>\n\n    <Checkbox value='solid'>\n      <CheckboxIndicator />\n      <CheckboxLabel>Solid</CheckboxLabel>\n    </Checkbox>\n\n    <Checkbox value='vue'>\n      <CheckboxIndicator />\n      <CheckboxLabel>Vue</CheckboxLabel>\n    </Checkbox>\n\n    <Checkbox value='svelte'>\n      <CheckboxIndicator />\n      <CheckboxLabel>Svelte</CheckboxLabel>\n    </Checkbox>\n  </CheckboxGroup>\n);",
          "storyFile": "Checkbox/Checkbox.stories.tsx",
          "storyTitle": "Inputs/Checkbox",
          "description": "`CheckboxGroup` ties several checkboxes to one `name` and one array of values, and owns the spacing\nbetween them. Every box stays independent: ticking one must never move another, unless it is a\nparent selecting all of its children."
        },
        {
          "name": "Card",
          "code": "import { Checkbox, CheckboxDescription, CheckboxGroup, CheckboxIndicator, CheckboxLabel } from '@wallarm-org/design-system/Checkbox';\nimport { Info } from '@wallarm-org/design-system/icons';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@wallarm-org/design-system/Tooltip';\n\nexport const Card = () => (\n  <CheckboxGroup variant='card' name='framework' defaultValue={['vue', 'angular']}>\n    <Checkbox value='react'>\n      <CheckboxIndicator />\n      <CheckboxLabel>React</CheckboxLabel>\n      <CheckboxDescription>\n        By clicking this checkbox, you agree to the terms and conditions.\n      </CheckboxDescription>\n    </Checkbox>\n\n    <Checkbox value='solid'>\n      <CheckboxIndicator />\n      <CheckboxLabel>\n        Solid\n        <Tooltip>\n          <TooltipTrigger>\n            <Info />\n          </TooltipTrigger>\n          <TooltipContent>Additional information</TooltipContent>\n        </Tooltip>\n      </CheckboxLabel>\n      <CheckboxDescription>\n        By clicking this checkbox, you agree to the terms and conditions.\n      </CheckboxDescription>\n    </Checkbox>\n\n    <Checkbox value='vue'>\n      <CheckboxIndicator />\n      <CheckboxLabel>Vue</CheckboxLabel>\n      <CheckboxDescription>\n        By clicking this checkbox, you agree to the terms and conditions.\n      </CheckboxDescription>\n    </Checkbox>\n\n    <Checkbox value='svelte' disabled>\n      <CheckboxIndicator />\n      <CheckboxLabel>Svelte</CheckboxLabel>\n      <CheckboxDescription>\n        By clicking this checkbox, you agree to the terms and conditions.\n      </CheckboxDescription>\n    </Checkbox>\n\n    <Checkbox value='angular' disabled>\n      <CheckboxIndicator />\n      <CheckboxLabel>Angular</CheckboxLabel>\n      <CheckboxDescription>\n        By clicking this checkbox, you agree to the terms and conditions.\n      </CheckboxDescription>\n    </Checkbox>\n  </CheckboxGroup>\n);",
          "storyFile": "Checkbox/Checkbox.stories.tsx",
          "storyTitle": "Inputs/Checkbox",
          "description": "`variant='card'` gives every option its own bordered surface. Cards exist to carry a description —\nthat is what the extra room is for, and a card holding a bare label wastes it. Plain rows read\nbetter for short lists of short labels."
        },
        {
          "name": "FormField",
          "code": "import { Checkbox, CheckboxGroup, CheckboxIndicator, CheckboxLabel } from '@wallarm-org/design-system/Checkbox';\nimport { Field, FieldDescription, FieldLabel } from '@wallarm-org/design-system/Field';\nimport { Info } from '@wallarm-org/design-system/icons';\nimport { HStack } from '@wallarm-org/design-system/Stack';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@wallarm-org/design-system/Tooltip';\n\nexport const FormField = () => (\n  <HStack align='start' gap={40}>\n    <Field>\n      <FieldLabel>\n        Label{' '}\n        <Tooltip>\n          <TooltipTrigger>\n            <Info />\n          </TooltipTrigger>\n          <TooltipContent>Additional information</TooltipContent>\n        </Tooltip>\n      </FieldLabel>\n\n      <FieldDescription>This is an input description.</FieldDescription>\n\n      <CheckboxGroup name='framework' defaultValue={['vue']}>\n        <Checkbox value='react'>\n          <CheckboxIndicator />\n          <CheckboxLabel>React</CheckboxLabel>\n        </Checkbox>\n\n        <Checkbox value='solid'>\n          <CheckboxIndicator />\n          <CheckboxLabel>Solid</CheckboxLabel>\n        </Checkbox>\n\n        <Checkbox value='vue'>\n          <CheckboxIndicator />\n          <CheckboxLabel>Vue</CheckboxLabel>\n        </Checkbox>\n\n        <Checkbox value='svelte'>\n          <CheckboxIndicator />\n          <CheckboxLabel>Svelte</CheckboxLabel>\n        </Checkbox>\n      </CheckboxGroup>\n    </Field>\n\n    <Field>\n      <FieldLabel>\n        Label\n        <Tooltip>\n          <TooltipTrigger>\n            <Info />\n          </TooltipTrigger>\n          <TooltipContent>Additional information</TooltipContent>\n        </Tooltip>\n      </FieldLabel>\n\n      <FieldDescription>This is an input description.</FieldDescription>\n\n      <CheckboxGroup variant='card' name='framework' defaultValue={['vue']}>\n        <Checkbox value='react'>\n          <CheckboxIndicator />\n          <CheckboxLabel>React</CheckboxLabel>\n        </Checkbox>\n\n        <Checkbox value='solid'>\n          <CheckboxIndicator />\n          <CheckboxLabel>Solid</CheckboxLabel>\n        </Checkbox>\n\n        <Checkbox value='vue'>\n          <CheckboxIndicator />\n          <CheckboxLabel>Vue</CheckboxLabel>\n        </Checkbox>\n\n        <Checkbox value='svelte'>\n          <CheckboxIndicator />\n          <CheckboxLabel>Svelte</CheckboxLabel>\n        </Checkbox>\n      </CheckboxGroup>\n    </Field>\n  </HStack>\n);",
          "storyFile": "Checkbox/Checkbox.stories.tsx",
          "storyTitle": "Inputs/Checkbox",
          "description": "Wrapped in `Field`, so the label and description above the options come from `FieldLabel` and `FieldDescription`. Shown as plain rows and as cards."
        }
      ]
    },
    {
      "name": "Checkmark",
      "importPath": "@wallarm-org/design-system/Checkmark",
      "props": [
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "checkedState",
          "type": "CheckedState | undefined",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [],
      "examples": []
    },
    {
      "name": "Code",
      "description": "Geist Mono for code, identifiers and machine-readable values — anything read as literal rather than as prose. This ramp is for inline fragments; multi-line blocks are `CodeSnippet`, drawn with looser leading so stacked lines breathe.",
      "importPath": "@wallarm-org/design-system/Code",
      "props": [
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "color",
          "type": "string | undefined",
          "required": false,
          "defaultValue": "primary"
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "size",
          "type": "{ xs: string; s: string; m: string; l: string; }",
          "required": false,
          "defaultValue": "l"
        },
        {
          "name": "weight",
          "type": "{ light: string; regular: string; medium: string; bold: string; }",
          "required": false,
          "defaultValue": "regular"
        },
        {
          "name": "truncate",
          "type": "{ true: string; }",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "italic",
          "type": "{ true: string; false: string; }",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "asChild",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "lineClamp",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "size",
          "options": [
            "xs",
            "s",
            "m",
            "l"
          ]
        },
        {
          "name": "weight",
          "options": [
            "light",
            "regular",
            "medium",
            "bold"
          ]
        },
        {
          "name": "color",
          "options": [
            "primary",
            "primary-alt",
            "secondary",
            "destructive"
          ]
        },
        {
          "name": "italic",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        },
        {
          "name": "truncate",
          "options": [
            "true"
          ]
        }
      ],
      "subComponents": [],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Code } from '@wallarm-org/design-system/Code';\n\nexport const Basic = () => (\n  <Code>const example = 'code'</Code>\n);",
          "storyFile": "Code/Code.stories.tsx",
          "storyTitle": "Typography/Code",
          "description": "An inline fragment in running text. It keeps the surrounding line height, so a paragraph\ncontaining code does not open up."
        },
        {
          "name": "Sizes",
          "code": "import { Code } from '@wallarm-org/design-system/Code';\nimport { VStack } from '@wallarm-org/design-system/Stack';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const Sizes = () => (\n  <VStack gap={24} align='start'>\n    {SIZES.map(({ size, metrics }) => (\n      <VStack key={size} gap={4} align='start'>\n        <Text size='xs' color='secondary'>\n          size=&apos;{size}&apos; · {metrics}\n        </Text>\n        <Code size={size}>\n          console.log('hello world');\n        </Code>\n      </VStack>\n    ))}\n  </VStack>\n);",
          "storyFile": "Code/Code.stories.tsx",
          "storyTitle": "Typography/Code",
          "description": "The ramp. Never add letter-spacing to it — monospace depends on a fixed character cell, and\ntracking breaks alignment in diffs, terminal output and anything measured in `ch`."
        },
        {
          "name": "Weights",
          "code": "import { Code } from '@wallarm-org/design-system/Code';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Weights = () => (\n  <VStack align='start'>\n    <Code size='m' weight='light'>\n      const light = 'Light weight code';\n    </Code>\n    <Code size='m' weight='regular'>\n      const regular = 'Regular weight code';\n    </Code>\n    <Code size='m' weight='medium'>\n      const medium = 'Medium weight code';\n    </Code>\n    <Code size='m' weight='bold'>\n      const bold = 'Bold weight code';\n    </Code>\n  </VStack>\n);",
          "storyFile": "Code/Code.stories.tsx",
          "storyTitle": "Typography/Code",
          "description": "Weight for emphasis within code, which buys less here than elsewhere: in a monospace run,\nbold is harder to spot than colour."
        },
        {
          "name": "Colors",
          "code": "import { Code } from '@wallarm-org/design-system/Code';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Colors = () => (\n  <VStack align='start'>\n    <Code color='primary'>\n      const light = 'Primary color code';\n    </Code>\n    <Code color='secondary'>\n      const regular = 'Secondary color code';\n    </Code>\n  </VStack>\n);",
          "storyFile": "Code/Code.stories.tsx",
          "storyTitle": "Typography/Code",
          "description": "The same de-emphasis ladder as `Text`, for dimming part of an identifier rather than all of\nit."
        },
        {
          "name": "Multiline",
          "code": "import { Code } from '@wallarm-org/design-system/Code';\n\nexport const Multiline = () => (\n  <Code size='m'>\n    {`function example() {\n  const message = 'Hello, World!';\n  console.log(message);\n  return message;\n}`}\n  </Code>\n);",
          "storyFile": "Code/Code.stories.tsx",
          "storyTitle": "Typography/Code",
          "description": "What happens when code wraps in this ramp — tight leading, because it is drawn for one line.\nPast a couple of lines, reach for `CodeSnippet`."
        },
        {
          "name": "Italic",
          "code": "import { Code } from '@wallarm-org/design-system/Code';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Italic = () => (\n  <VStack align='start'>\n    <Code size='s' italic>\n      {'// Italic small code comment'}\n    </Code>\n    <Code size='m' italic>\n      {'// Italic medium code comment'}\n    </Code>\n    <Code size='l' italic>\n      {'// Italic large code comment'}\n    </Code>\n    <Code size='s' weight='bold' italic>\n      {'// Bold italic small'}\n    </Code>\n    <Code size='m' weight='bold' italic>\n      {'// Bold italic medium'}\n    </Code>\n    <Code size='l' weight='bold' italic>\n      {'// Bold italic large'}\n    </Code>\n  </VStack>\n);",
          "storyFile": "Code/Code.stories.tsx",
          "storyTitle": "Typography/Code",
          "description": "`italic` is a modifier rather than a step, pairing with any size and weight. Conventionally\nit marks a placeholder the reader is meant to replace."
        },
        {
          "name": "AsChild",
          "code": "import { Code } from '@wallarm-org/design-system/Code';\n\nexport const AsChild = () => (\n  <Code size='m' weight='medium' asChild>\n    <code>{'<CustomCodeElement />'}</code>\n  </Code>\n);",
          "storyFile": "Code/Code.stories.tsx",
          "storyTitle": "Typography/Code",
          "description": "`asChild` puts the monospace styling on your own element, for when the tag carries meaning\nthe styling should not override."
        }
      ]
    },
    {
      "name": "CodeEditor",
      "description": "An editable code surface that is visually the same component as `CodeSnippet` and reuses its header, tabs, actions and show-more — reach for `CodeSnippet` whenever the code is only read, since a page that never renders `CodeEditorContent` never loads the editor engine. Colours come from the same `CodeSnippetAdapterProvider` (plain text without one), so a read-only editor matches the snippet except for a native thin scrollbar, a caret and selection drawn by the editor, and an HTTP JSON body that stays coloured when `Content-Type` has parameters or the body has blank lines. The adapter re-tokenizes the whole document after each pause in typing, which stays within a frame up to about 2 000 lines with Prism; longer documents still edit smoothly, their colours just settle a moment later. Like the snippet, the editor sits inside a `display: contents` wrapper that keeps it mounted across fullscreen, so space editors with their own `className` (for example `mt-16`) or a `gap` on the parent — not `space-*`, `divide-*` or child selectors on the parent. `lines`, `folds`, `completions` and `schema` are compared by identity, so memoise them or hoist them to module constants — a new value on every render reconfigures the editor. Autocomplete suggests language keywords and words already in the document for every language; HTTP methods and headers and JSON Schema values have their own contextual suggestions. Pass `completions` to add application-specific results. Syntax errors are best-effort: JSON reports the `JSON.parse` message, JavaScript and TypeScript use Babel, Lua uses luaparse (first error only), YAML and Python use their Lezer parsers, which still flag a few valid Python forms such as `lambda a, /, b` and parenthesised `with` items. `lines` and `folds` stay on their line numbers while typing; to keep a decoration on a piece of text, recompute it from `value` (for example `useMemo(() => linesFor(value), [value])`, or a `folds` function such as `getHttpFolds`). The editor injects `<style>` tags, so under a strict Content Security Policy pass `cspNonce`. Tab indents, so keyboard users leave with Escape, then Tab, or press Ctrl+M (Alt+Shift+M on macOS) to switch Tab between indenting and moving focus — point `aria-describedby` at text holding `CODE_EDITOR_KEYBOARD_HINT` to tell screen-reader users.",
      "importPath": "@wallarm-org/design-system/CodeEditor",
      "props": [
        {
          "name": "value",
          "type": "string | undefined",
          "required": false,
          "description": "Controlled document"
        },
        {
          "name": "defaultValue",
          "type": "string | undefined",
          "required": false,
          "description": "Uncontrolled initial document (controlled vs uncontrolled is locked on first render)"
        },
        {
          "name": "onChange",
          "type": "((value: string) => void) | undefined",
          "required": false,
          "description": "Fired for user edits only, never for external `value` syncs"
        },
        {
          "name": "language",
          "type": "CodeEditorLanguage | undefined",
          "required": false,
          "description": "Passed verbatim to the syntax adapter; selects the structural parser"
        },
        {
          "name": "documentId",
          "type": "string | undefined",
          "required": false,
          "description": "Document identity: changing it swaps to that document's cached state (undo history,\nselection, folds). Requires a controlled `value`: when the id changes, `value` must already\nhold that document's text (an uncached id starts from `value`). In uncontrolled mode the new\ndocument would be seeded with the previous document's text."
        },
        {
          "name": "readOnly",
          "type": "boolean | undefined",
          "required": false,
          "description": "Non-editable and unfocusable content; text remains selectable, searchable and copyable"
        },
        {
          "name": "startingLineNumber",
          "type": "number | undefined",
          "required": false,
          "description": "Offsets gutter numbers; `lines`, `folds`, `diagnostics` use absolute numbers"
        },
        {
          "name": "lines",
          "type": "Record<number, LineConfig> | undefined",
          "required": false,
          "description": "Per-line configuration keyed by absolute line number (static, see spec D6).\nCompared by identity: memoise it (or hoist it to a constant) — a new object\nevery render reconfigures the lines and gutters on every render."
        },
        {
          "name": "folds",
          "type": "CodeEditorFolds | undefined",
          "required": false,
          "description": "Fold regions, or a function re-run after edits; collapsed state is kept by `id`.\nCompared by identity: memoise the array or pass a stable function (e.g. `getHttpFolds`) —\nan inline array/arrow reconfigures folds on every render and bypasses the re-run debounce."
        },
        {
          "name": "wrapLines",
          "type": "boolean | undefined",
          "required": false,
          "description": "Controlled line wrapping"
        },
        {
          "name": "defaultWrapLines",
          "type": "boolean | undefined",
          "required": false,
          "description": "Uncontrolled initial line wrapping"
        },
        {
          "name": "onWrapLinesChange",
          "type": "((wrap: boolean) => void) | undefined",
          "required": false,
          "description": "Fired when the wrap button toggles wrapping"
        },
        {
          "name": "maxLines",
          "type": "number | undefined",
          "required": false,
          "description": "Height clamp in rows; auto-renders `CodeSnippetShowMoreButton` unless one is a direct child"
        },
        {
          "name": "original",
          "type": "string | undefined",
          "required": false,
          "description": "Enables diff mode against this text"
        },
        {
          "name": "schema",
          "type": "JsonSchema | undefined",
          "required": false,
          "description": "JSON Schema for the document (`json`) or the JSON body (`http`)"
        },
        {
          "name": "completions",
          "type": "CodeEditorCompletionSource[] | undefined",
          "required": false,
          "description": "Consumer completion sources, added after the built-in ones. Compared by identity: a new\narray reconfigures autocomplete and closes an open list, so keep it stable (module constant\nor `useMemo`)."
        },
        {
          "name": "diagnostics",
          "type": "CodeEditorDiagnostic[] | undefined",
          "required": false,
          "description": "External diagnostics, merged with syntax and schema ones"
        },
        {
          "name": "onDiagnosticsChange",
          "type": "((diagnostics: CodeEditorDiagnostic[]) => void) | undefined",
          "required": false,
          "description": "Fired when the merged diagnostics change"
        },
        {
          "name": "apiRef",
          "type": "Ref<CodeEditorApi> | undefined",
          "required": false,
          "description": "Imperative handle"
        },
        {
          "name": "cspNonce",
          "type": "string | undefined",
          "required": false,
          "description": "Nonce for the style tags the editor injects"
        },
        {
          "name": "onCopy",
          "type": "((value: string) => void) | undefined",
          "required": false,
          "description": "Fired by `CodeSnippetCopyButton` after a copy, with the current document"
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "size",
          "type": "{ sm: string; md: string; lg: string; }",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "column",
          "options": [
            "stick",
            "lineNumbers",
            "folds",
            "prefix"
          ],
          "defaultValue": "lineNumbers"
        },
        {
          "name": "hasGutter",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        },
        {
          "name": "wrapLines",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        }
      ],
      "subComponents": [
        {
          "name": "CodeEditorContent",
          "props": [
            {
              "name": "lineNumbers",
              "type": "boolean | undefined",
              "required": false,
              "description": "Show the line-number gutter (CodeSnippet's `<CodeSnippetLineNumbers />` equivalent)",
              "defaultValue": "false"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "CodeEditorRoot",
          "props": [
            {
              "name": "value",
              "type": "string | undefined",
              "required": false,
              "description": "Controlled document"
            },
            {
              "name": "defaultValue",
              "type": "string | undefined",
              "required": false,
              "description": "Uncontrolled initial document (controlled vs uncontrolled is locked on first render)",
              "defaultValue": ""
            },
            {
              "name": "onChange",
              "type": "((value: string) => void) | undefined",
              "required": false,
              "description": "Fired for user edits only, never for external `value` syncs"
            },
            {
              "name": "language",
              "type": "CodeEditorLanguage | undefined",
              "required": false,
              "description": "Passed verbatim to the syntax adapter; selects the structural parser",
              "defaultValue": "text"
            },
            {
              "name": "documentId",
              "type": "string | undefined",
              "required": false,
              "description": "Document identity: changing it swaps to that document's cached state (undo history,\nselection, folds). Requires a controlled `value`: when the id changes, `value` must already\nhold that document's text (an uncached id starts from `value`). In uncontrolled mode the new\ndocument would be seeded with the previous document's text."
            },
            {
              "name": "readOnly",
              "type": "boolean | undefined",
              "required": false,
              "description": "Non-editable and unfocusable content; text remains selectable, searchable and copyable",
              "defaultValue": "false"
            },
            {
              "name": "startingLineNumber",
              "type": "number | undefined",
              "required": false,
              "description": "Offsets gutter numbers; `lines`, `folds`, `diagnostics` use absolute numbers",
              "defaultValue": "1"
            },
            {
              "name": "lines",
              "type": "Record<number, LineConfig> | undefined",
              "required": false,
              "description": "Per-line configuration keyed by absolute line number (static, see spec D6).\nCompared by identity: memoise it (or hoist it to a constant) — a new object\nevery render reconfigures the lines and gutters on every render.",
              "defaultValue": "EMPTY_LINES"
            },
            {
              "name": "folds",
              "type": "CodeEditorFolds | undefined",
              "required": false,
              "description": "Fold regions, or a function re-run after edits; collapsed state is kept by `id`.\nCompared by identity: memoise the array or pass a stable function (e.g. `getHttpFolds`) —\nan inline array/arrow reconfigures folds on every render and bypasses the re-run debounce."
            },
            {
              "name": "wrapLines",
              "type": "boolean | undefined",
              "required": false,
              "description": "Controlled line wrapping"
            },
            {
              "name": "defaultWrapLines",
              "type": "boolean | undefined",
              "required": false,
              "description": "Uncontrolled initial line wrapping",
              "defaultValue": "false"
            },
            {
              "name": "onWrapLinesChange",
              "type": "((wrap: boolean) => void) | undefined",
              "required": false,
              "description": "Fired when the wrap button toggles wrapping"
            },
            {
              "name": "maxLines",
              "type": "number | undefined",
              "required": false,
              "description": "Height clamp in rows; auto-renders `CodeSnippetShowMoreButton` unless one is a direct child",
              "defaultValue": "0"
            },
            {
              "name": "original",
              "type": "string | undefined",
              "required": false,
              "description": "Enables diff mode against this text"
            },
            {
              "name": "schema",
              "type": "JsonSchema | undefined",
              "required": false,
              "description": "JSON Schema for the document (`json`) or the JSON body (`http`)"
            },
            {
              "name": "completions",
              "type": "CodeEditorCompletionSource[] | undefined",
              "required": false,
              "description": "Consumer completion sources, added after the built-in ones. Compared by identity: a new\narray reconfigures autocomplete and closes an open list, so keep it stable (module constant\nor `useMemo`).",
              "defaultValue": "EMPTY_COMPLETIONS"
            },
            {
              "name": "diagnostics",
              "type": "CodeEditorDiagnostic[] | undefined",
              "required": false,
              "description": "External diagnostics, merged with syntax and schema ones",
              "defaultValue": "EMPTY_DIAGNOSTICS"
            },
            {
              "name": "onDiagnosticsChange",
              "type": "((diagnostics: CodeEditorDiagnostic[]) => void) | undefined",
              "required": false,
              "description": "Fired when the merged diagnostics change"
            },
            {
              "name": "apiRef",
              "type": "Ref<CodeEditorApi> | undefined",
              "required": false,
              "description": "Imperative handle"
            },
            {
              "name": "cspNonce",
              "type": "string | undefined",
              "required": false,
              "description": "Nonce for the style tags the editor injects"
            },
            {
              "name": "onCopy",
              "type": "((value: string) => void) | undefined",
              "required": false,
              "description": "Fired by `CodeSnippetCopyButton` after a copy, with the current document"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "size",
              "type": "{ sm: string; md: string; lg: string; }",
              "required": false,
              "defaultValue": "sm"
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Default",
          "code": "import { useState } from 'react';\nimport { CodeEditorContent, CodeEditorRoot } from '@wallarm-org/design-system/CodeEditor';\n\nexport const Default = () => {\n  const [value, setValue] = useState(jsonCode);\n\n  return (\n    <div style={{ width: '600px' }}>\n      <CodeEditorRoot\n        value={value}\n        onChange={setValue}\n        language='json'\n        data-testid='code-editor-default'\n      >\n        <CodeEditorContent lineNumbers aria-label='Package manifest' />\n      </CodeEditorRoot>\n    </div>\n  );\n};",
          "storyFile": "CodeEditor/CodeEditor.stories.tsx",
          "storyTitle": "Data Display/CodeEditor",
          "description": "A controlled editor: `value` plus `onChange`, like any input. With no adapter in scope the\ntext is plain, exactly as `CodeSnippet` renders it without a provider."
        },
        {
          "name": "WithHeader",
          "code": "import { useState } from 'react';\nimport { CodeEditorContent, CodeEditorRoot } from '@wallarm-org/design-system/CodeEditor';\nimport { CodeSnippetActions, CodeSnippetCopyButton, CodeSnippetFullscreenButton, CodeSnippetHeader, CodeSnippetTitle, CodeSnippetWrapButton } from '@wallarm-org/design-system/CodeSnippet';\n\nexport const WithHeader = () => {\n  const [value, setValue] = useState(jsonCode);\n\n  return (\n    <div style={{ width: '600px' }}>\n      <CodeEditorRoot\n        value={value}\n        onChange={setValue}\n        language='json'\n        data-testid='code-editor-with-header'\n      >\n        <CodeSnippetHeader>\n          <CodeSnippetTitle>rule.json</CodeSnippetTitle>\n          <CodeSnippetActions>\n            <CodeSnippetCopyButton />\n            <CodeSnippetWrapButton />\n            <CodeSnippetFullscreenButton />\n          </CodeSnippetActions>\n        </CodeSnippetHeader>\n        <CodeEditorContent lineNumbers aria-label='Rule JSON' />\n      </CodeEditorRoot>\n    </div>\n  );\n};",
          "storyFile": "CodeEditor/CodeEditor.stories.tsx",
          "storyTitle": "Data Display/CodeEditor",
          "description": "The `CodeSnippet` header works unchanged: a title and the copy, wrap and fullscreen buttons.\nCopy puts the edited value on the clipboard, and fullscreen keeps the undo history."
        },
        {
          "name": "FloatingActions",
          "code": "import { useState } from 'react';\nimport { CodeEditorContent, CodeEditorRoot } from '@wallarm-org/design-system/CodeEditor';\nimport { CodeSnippetActions, CodeSnippetCopyButton, CodeSnippetWrapButton } from '@wallarm-org/design-system/CodeSnippet';\n\nexport const FloatingActions = () => {\n  const [value, setValue] = useState(sampleCode);\n\n  return (\n    <div style={{ width: '320px' }}>\n      <CodeEditorRoot\n        value={value}\n        onChange={setValue}\n        language='text'\n        data-testid='code-editor-floating-actions'\n      >\n        <CodeSnippetActions>\n          <CodeSnippetWrapButton />\n          <CodeSnippetCopyButton />\n        </CodeSnippetActions>\n        <CodeEditorContent lineNumbers aria-label='Sample code' />\n      </CodeEditorRoot>\n    </div>\n  );\n};",
          "storyFile": "CodeEditor/CodeEditor.stories.tsx",
          "storyTitle": "Data Display/CodeEditor",
          "description": "Without a header, `CodeSnippetActions` as a direct child floats over the top-right of the\neditor, as it does over a snippet."
        },
        {
          "name": "LineNumbersAndStartingLine",
          "code": "import { CodeEditorContent, CodeEditorRoot } from '@wallarm-org/design-system/CodeEditor';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const LineNumbersAndStartingLine = () => (\n  <VStack gap={16}>\n    <VStack align='start' gap={4}>\n      <div style={{ width: '600px' }}>\n        <CodeEditorRoot\n          defaultValue={sampleCode}\n          language='text'\n          data-testid='code-editor-line-numbers'\n        >\n          <CodeEditorContent lineNumbers aria-label='Sample code' />\n        </CodeEditorRoot>\n      </div>\n    </VStack>\n    <VStack align='start' gap={4}>\n      <div style={{ width: '600px' }}>\n        <CodeEditorRoot\n          defaultValue={sampleCode}\n          language='text'\n          startingLineNumber={97}\n          data-testid='code-editor-starting-line'\n        >\n          <CodeEditorContent lineNumbers aria-label='Sample code from line 97' />\n        </CodeEditorRoot>\n      </div>\n    </VStack>\n  </VStack>\n);",
          "storyFile": "CodeEditor/CodeEditor.stories.tsx",
          "storyTitle": "Data Display/CodeEditor",
          "description": "`lineNumbers` on `CodeEditorContent` is the equivalent of `CodeSnippetLineNumbers`, and\n`startingLineNumber` renumbers the gutter for a fragment taken from a longer file."
        },
        {
          "name": "LineColorsAndPrefixes",
          "code": "import { CodeEditorContent, CodeEditorRoot } from '@wallarm-org/design-system/CodeEditor';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const LineColorsAndPrefixes = () => (\n  <VStack gap={16}>\n    <VStack align='start' gap={4}>\n      <div style={{ width: '600px' }}>\n        <CodeEditorRoot\n          defaultValue={colorsCode}\n          language='text'\n          lines={colorLines}\n          data-testid='code-editor-line-colors'\n        >\n          <CodeEditorContent lineNumbers aria-label='Line colours' />\n        </CodeEditorRoot>\n      </div>\n    </VStack>\n    <VStack align='start' gap={4}>\n      <div style={{ width: '600px' }}>\n        <CodeEditorRoot\n          defaultValue={diffCode}\n          language='text'\n          lines={diffLines}\n          data-testid='code-editor-line-diff'\n        >\n          <CodeEditorContent lineNumbers aria-label='Diff prefixes' />\n        </CodeEditorRoot>\n      </div>\n    </VStack>\n    <VStack align='start' gap={4}>\n      <div style={{ width: '600px' }}>\n        <CodeEditorRoot\n          defaultValue={annotatedHeadersCode}\n          language='text'\n          lines={iconLines}\n          data-testid='code-editor-line-icons'\n        >\n          <CodeEditorContent lineNumbers aria-label='Annotated headers' />\n        </CodeEditorRoot>\n      </div>\n    </VStack>\n  </VStack>\n);",
          "storyFile": "CodeEditor/CodeEditor.stories.tsx",
          "storyTitle": "Data Display/CodeEditor",
          "description": "`lines` uses the same `LineConfig` as CodeSnippet: seven semantic colours, text prefixes for a\nhand-made diff, and ReactNode prefixes such as a tooltipped icon. Lines are static and tied\nto line numbers, so they stay on their number while you type."
        },
        {
          "name": "Ranges",
          "code": "import { CodeEditorContent, CodeEditorRoot } from '@wallarm-org/design-system/CodeEditor';\n\nexport const Ranges = () => (\n  <div style={{ width: '600px' }}>\n    <CodeEditorRoot\n      defaultValue={rangesCode}\n      language='text'\n      lines={rangeLines}\n      data-testid='code-editor-ranges'\n    >\n      <CodeEditorContent lineNumbers aria-label='Request with ranges' />\n    </CodeEditorRoot>\n  </div>\n);",
          "storyFile": "CodeEditor/CodeEditor.stories.tsx",
          "storyTitle": "Data Display/CodeEditor",
          "description": "`ranges` colours character offsets inside a line (start inclusive, end exclusive). The line\nkeeps its background, and only the range gets the colour."
        },
        {
          "name": "HttpRequestWithPrism",
          "code": "import { useState } from 'react';\nimport { CodeEditorContent, CodeEditorRoot } from '@wallarm-org/design-system/CodeEditor';\nimport { CodeSnippetAdapterProvider, loadPrismAdapter } from '@wallarm-org/design-system/CodeSnippet';\n\nexport const HttpRequestWithPrism = () => {\n  const [value, setValue] = useState(httpRequestCode);\n\n  return (\n    <CodeSnippetAdapterProvider adapter={loadPrismAdapter}>\n      <div style={{ width: '600px' }}>\n        <CodeEditorRoot\n          value={value}\n          onChange={setValue}\n          language='http'\n          data-testid='code-editor-http-request'\n        >\n          <CodeEditorContent lineNumbers aria-label='HTTP request' />\n        </CodeEditorRoot>\n      </div>\n    </CodeSnippetAdapterProvider>\n  );\n};",
          "storyFile": "CodeEditor/CodeEditor.stories.tsx",
          "storyTitle": "Data Display/CodeEditor",
          "description": "`language='http'` under Prism. The colours come from the adapter and the structure (start\nline, headers, JSON body) comes from the editor's own HTTP grammar."
        },
        {
          "name": "HttpResponseWithShiki",
          "code": "import { useState } from 'react';\nimport { CodeEditorContent, CodeEditorRoot } from '@wallarm-org/design-system/CodeEditor';\nimport { CodeSnippetAdapterProvider, loadShikiAdapter } from '@wallarm-org/design-system/CodeSnippet';\n\nexport const HttpResponseWithShiki = () => {\n  const [value, setValue] = useState(httpResponseCode);\n\n  return (\n    <CodeSnippetAdapterProvider adapter={loadShikiAdapter}>\n      <div style={{ width: '600px' }}>\n        <CodeEditorRoot\n          value={value}\n          onChange={setValue}\n          language='http'\n          data-testid='code-editor-http-response'\n        >\n          <CodeEditorContent lineNumbers aria-label='HTTP response' />\n        </CodeEditorRoot>\n      </div>\n    </CodeSnippetAdapterProvider>\n  );\n};",
          "storyFile": "CodeEditor/CodeEditor.stories.tsx",
          "storyTitle": "Data Display/CodeEditor",
          "description": "The response side under Shiki. After an edit, highlighting is repainted in the background,\nso for a moment you may see the previous colours mapped through your change."
        },
        {
          "name": "HttpFolds",
          "code": "import { useState } from 'react';\nimport { CodeEditorContent, CodeEditorRoot } from '@wallarm-org/design-system/CodeEditor';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const HttpFolds = () => {\n  const [request, setRequest] = useState(foldableRequestCode);\n  const [response, setResponse] = useState(foldableResponseCode);\n  return (\n    <VStack gap={16}>\n      <VStack align='start' gap={4}>\n        <div style={{ width: '600px' }}>\n          <CodeEditorRoot\n            value={request}\n            onChange={setRequest}\n            language='http'\n            folds={foldRequestHeadersCollapsed}\n            data-testid='code-editor-http-folds-request'\n          >\n            <CodeEditorContent lineNumbers aria-label='Foldable HTTP request' />\n          </CodeEditorRoot>\n        </div>\n      </VStack>\n      <VStack align='start' gap={4}>\n        <div style={{ width: '600px' }}>\n          <CodeEditorRoot\n            value={response}\n            onChange={setResponse}\n            language='http'\n            startingLineNumber={100}\n            folds={foldHttp}\n            data-testid='code-editor-http-folds-response'\n          >\n            <CodeEditorContent lineNumbers aria-label='Foldable HTTP response' />\n          </CodeEditorRoot>\n        </div>\n      </VStack>\n    </VStack>\n  );\n};",
          "storyFile": "CodeEditor/CodeEditor.stories.tsx",
          "storyTitle": "Data Display/CodeEditor",
          "description": "`folds` as a function of the value: `getHttpFolds` runs again after edits, so adding a header\ngrows the headers fold. Collapsed state is kept by fold `id`. The second editor starts at\nline 100, and the fold function gets the same offset."
        },
        {
          "name": "ShowMore",
          "code": "import { CodeEditorContent, CodeEditorRoot } from '@wallarm-org/design-system/CodeEditor';\nimport { CodeSnippetShowMoreButton } from '@wallarm-org/design-system/CodeSnippet';\n\nexport const ShowMore = () => (\n  <div style={{ display: 'flex', flexDirection: 'column', gap: '24px', width: '500px' }}>\n    <div>\n      <CodeEditorRoot\n        defaultValue={showMoreCode}\n        language='text'\n        maxLines={7}\n        data-testid='code-editor-show-more'\n      >\n        <CodeEditorContent aria-label='Request headers' />\n      </CodeEditorRoot>\n    </div>\n    <div>\n      <CodeEditorRoot\n        defaultValue={showMoreThresholdCode}\n        language='text'\n        maxLines={7}\n        data-testid='code-editor-show-more-threshold'\n      >\n        <CodeEditorContent aria-label='Request headers' />\n      </CodeEditorRoot>\n    </div>\n    <div>\n      <CodeEditorRoot\n        defaultValue={showMoreCode}\n        language='text'\n        maxLines={7}\n        data-testid='code-editor-show-more-manual'\n      >\n        <CodeEditorContent aria-label='Request headers' />\n        <CodeSnippetShowMoreButton data-analytics-id='CODE_EDITOR_SHOW_MORE' />\n      </CodeEditorRoot>\n    </div>\n  </div>\n);",
          "storyFile": "CodeEditor/CodeEditor.stories.tsx",
          "storyTitle": "Data Display/CodeEditor",
          "description": "`maxLines` limits the height, and the editor scrolls inside it (no rows are removed). The\nbutton appears on its own when at least three lines are hidden. Render\n`CodeSnippetShowMoreButton` yourself only to pass props to the real button."
        },
        {
          "name": "Wrap",
          "code": "import { useState } from 'react';\nimport { CodeEditorContent, CodeEditorRoot } from '@wallarm-org/design-system/CodeEditor';\nimport { CodeSnippetActions, CodeSnippetWrapButton } from '@wallarm-org/design-system/CodeSnippet';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Wrap = () => {\n  const [wrap, setWrap] = useState(true);\n  return (\n    <VStack gap={16}>\n      <VStack align='start' gap={4}>\n        <div style={{ width: '600px' }}>\n          <CodeEditorRoot\n            defaultValue={longCode}\n            language='text'\n            lines={wrapDiffLines}\n            data-testid='code-editor-wrap-off'\n          >\n            <CodeEditorContent lineNumbers aria-label='Long lines' />\n          </CodeEditorRoot>\n        </div>\n      </VStack>\n      <VStack align='start' gap={4}>\n        <div style={{ width: '600px' }}>\n          <CodeEditorRoot\n            defaultValue={longCode}\n            language='text'\n            defaultWrapLines\n            lines={wrapDiffLines}\n            data-testid='code-editor-wrap-uncontrolled'\n          >\n            <CodeSnippetActions>\n              <CodeSnippetWrapButton />\n            </CodeSnippetActions>\n            <CodeEditorContent lineNumbers aria-label='Long lines, wrapped' />\n          </CodeEditorRoot>\n        </div>\n      </VStack>\n      <VStack align='start' gap={4}>\n        <div style={{ width: '600px' }}>\n          <CodeEditorRoot\n            defaultValue={longCode}\n            language='text'\n            wrapLines={wrap}\n            onWrapLinesChange={setWrap}\n            data-testid='code-editor-wrap-controlled'\n          >\n            <CodeSnippetActions>\n              <CodeSnippetWrapButton />\n            </CodeSnippetActions>\n            <CodeEditorContent lineNumbers aria-label='Long lines, controlled wrap' />\n          </CodeEditorRoot>\n        </div>\n      </VStack>\n    </VStack>\n  );\n};",
          "storyFile": "CodeEditor/CodeEditor.stories.tsx",
          "storyTitle": "Data Display/CodeEditor",
          "description": "Wrapping can be uncontrolled (`defaultWrapLines`, driven by the wrap button) or controlled\n(`wrapLines` plus `onWrapLinesChange`). Colour sticks and prefixes stay on the first visual row."
        },
        {
          "name": "Sizes",
          "code": "import { CodeEditorContent, CodeEditorRoot } from '@wallarm-org/design-system/CodeEditor';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Sizes = () => (\n  <VStack gap={16}>\n    <VStack align='start' gap={4}>\n      <div style={{ width: '600px' }}>\n        <CodeEditorRoot\n          defaultValue={bashCode}\n          language='bash'\n          size='sm'\n          data-testid='code-editor-size-sm'\n        >\n          <CodeEditorContent lineNumbers aria-label='Install commands, small' />\n        </CodeEditorRoot>\n      </div>\n    </VStack>\n    <VStack align='start' gap={4}>\n      <div style={{ width: '600px' }}>\n        <CodeEditorRoot\n          defaultValue={bashCode}\n          language='bash'\n          size='md'\n          data-testid='code-editor-size-md'\n        >\n          <CodeEditorContent lineNumbers aria-label='Install commands, medium' />\n        </CodeEditorRoot>\n      </div>\n    </VStack>\n    <VStack align='start' gap={4}>\n      <div style={{ width: '600px' }}>\n        <CodeEditorRoot\n          defaultValue={bashCode}\n          language='bash'\n          size='lg'\n          data-testid='code-editor-size-lg'\n        >\n          <CodeEditorContent lineNumbers aria-label='Install commands, large' />\n        </CodeEditorRoot>\n      </div>\n    </VStack>\n  </VStack>\n);",
          "storyFile": "CodeEditor/CodeEditor.stories.tsx",
          "storyTitle": "Data Display/CodeEditor",
          "description": "The same three sizes as CodeSnippet: `sm` (12px, default), `md` (14px) and `lg` (16px), each\non 20px rows."
        },
        {
          "name": "ReadOnly",
          "code": "import { CodeEditorContent, CodeEditorRoot } from '@wallarm-org/design-system/CodeEditor';\nimport { CodeSnippetActions, CodeSnippetCopyButton, CodeSnippetHeader, CodeSnippetTitle } from '@wallarm-org/design-system/CodeSnippet';\n\nexport const ReadOnly = () => (\n  <div style={{ width: '600px' }}>\n    <CodeEditorRoot\n      value={httpResponseCode}\n      language='http'\n      readOnly\n      data-testid='code-editor-read-only'\n    >\n      <CodeSnippetHeader>\n        <CodeSnippetTitle>Response</CodeSnippetTitle>\n        <CodeSnippetActions>\n          <CodeSnippetCopyButton />\n        </CodeSnippetActions>\n      </CodeSnippetHeader>\n      <CodeEditorContent lineNumbers aria-label='HTTP response, read only' />\n    </CodeEditorRoot>\n  </div>\n);",
          "storyFile": "CodeEditor/CodeEditor.stories.tsx",
          "storyTitle": "Data Display/CodeEditor",
          "description": "`readOnly` lets you select, search and copy without focusing the code or showing a caret. Use it when the value\ncan change elsewhere but not here. If it never changes, use `CodeSnippet`."
        },
        {
          "name": "Tabs",
          "code": "import { useState } from 'react';\nimport { CodeEditorContent, CodeEditorRoot } from '@wallarm-org/design-system/CodeEditor';\nimport { CodeSnippetActions, CodeSnippetCopyButton, CodeSnippetHeader, CodeSnippetTab, CodeSnippetTabs } from '@wallarm-org/design-system/CodeSnippet';\n\nexport const Tabs = () => {\n  const [tab, setTab] = useState<TabId>('request');\n  const [docs, setDocs] = useState<Record<TabId, string>>(tabDocuments);\n\n  return (\n    <div style={{ width: '600px' }}>\n      <CodeEditorRoot\n        documentId={tab}\n        value={docs[tab]}\n        onChange={value => setDocs(prev => ({ ...prev, [tab]: value }))}\n        language='http'\n        data-testid='code-editor-tabs'\n      >\n        <CodeSnippetHeader>\n          <CodeSnippetTabs\n            value={tab}\n            onValueChange={value => {\n              if (isTabId(value)) setTab(value);\n            }}\n          >\n            <CodeSnippetTab value='request' data-testid='code-editor-tabs--tab-request'>\n              Request\n            </CodeSnippetTab>\n            <CodeSnippetTab value='response' data-testid='code-editor-tabs--tab-response'>\n              Response\n            </CodeSnippetTab>\n          </CodeSnippetTabs>\n          <CodeSnippetActions>\n            <CodeSnippetCopyButton />\n          </CodeSnippetActions>\n        </CodeSnippetHeader>\n        <CodeEditorContent lineNumbers aria-label='HTTP message' />\n      </CodeEditorRoot>\n    </div>\n  );\n};",
          "storyFile": "CodeEditor/CodeEditor.stories.tsx",
          "storyTitle": "Data Display/CodeEditor",
          "description": "Tabs swap `value`, and `documentId` swaps the editor's whole state with it, so each tab keeps\nits own undo history, selection and collapsed folds."
        },
        {
          "name": "ParityDefault",
          "code": "export const ParityDefault = () => (\n  <ParityPair testId='parity-default' code={sampleCode} language='text' />\n);",
          "storyFile": "CodeEditor/CodeEditor.stories.tsx",
          "storyTitle": "Data Display/CodeEditor",
          "description": "Parity check: the same code and props in CodeSnippet and in a read-only CodeEditor should look\nidentical. Accepted differences: a native thin scrollbar, and CodeMirror's caret and selection\nlayer (shown only while focused)."
        },
        {
          "name": "ParityLineColors",
          "code": "export const ParityLineColors = () => (\n  <ParityPair\n    testId='parity-line-colors'\n    code={colorsCode}\n    language='text'\n    lines={parityColorLines}\n  />\n);",
          "storyFile": "CodeEditor/CodeEditor.stories.tsx",
          "storyTitle": "Data Display/CodeEditor",
          "description": "Parity check with line colours, text prefixes and a tooltipped icon prefix: same stick, same\ntint, same prefix column."
        },
        {
          "name": "ParityFoldsCollapsed",
          "code": "export const ParityFoldsCollapsed = () => (\n  <ParityPair\n    testId='parity-folds-collapsed'\n    code={foldableRequestCode}\n    language='text'\n    folds={parityCollapsedFolds}\n  />\n);",
          "storyFile": "CodeEditor/CodeEditor.stories.tsx",
          "storyTitle": "Data Display/CodeEditor",
          "description": "Parity check with the headers fold collapsed: same chevrons and the same summary row in place\nof the hidden lines."
        },
        {
          "name": "ParityHttpPrism",
          "code": "import { CodeSnippetAdapterProvider, loadPrismAdapter } from '@wallarm-org/design-system/CodeSnippet';\n\nexport const ParityHttpPrism = () => (\n  <CodeSnippetAdapterProvider adapter={loadPrismAdapter}>\n    <ParityPair testId='parity-http-prism' code={httpRequestCode} language='http' />\n  </CodeSnippetAdapterProvider>\n);",
          "storyFile": "CodeEditor/CodeEditor.stories.tsx",
          "storyTitle": "Data Display/CodeEditor",
          "description": "Parity check for an HTTP request with a JSON body, both under the same Prism provider: token\ncolours come from the same adapter."
        },
        {
          "name": "ParityRanges",
          "code": "export const ParityRanges = () => (\n  <ParityPair testId='parity-ranges' code={rangesCode} language='text' lines={rangeLines} />\n);",
          "storyFile": "CodeEditor/CodeEditor.stories.tsx",
          "storyTitle": "Data Display/CodeEditor",
          "description": "Parity check for `ranges`: the same bold, coloured spans inside the same tinted lines."
        },
        {
          "name": "ParityWrap",
          "code": "export const ParityWrap = () => (\n  <ParityPair testId='parity-wrap' code={longCode} language='text' wrapLines />\n);",
          "storyFile": "CodeEditor/CodeEditor.stories.tsx",
          "storyTitle": "Data Display/CodeEditor",
          "description": "Parity check for wrapped lines: long lines break at the same points and line numbers stay on\nthe first row of each wrapped line."
        },
        {
          "name": "ParitySizes",
          "code": "import { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const ParitySizes = () => (\n  <VStack gap={24}>\n    <ParityPair testId='parity-size-sm' code={bashCode} language='bash' size='sm' />\n    <ParityPair testId='parity-size-md' code={bashCode} language='bash' size='md' />\n    <ParityPair testId='parity-size-lg' code={bashCode} language='bash' size='lg' />\n  </VStack>\n);",
          "storyFile": "CodeEditor/CodeEditor.stories.tsx",
          "storyTitle": "Data Display/CodeEditor",
          "description": "Parity check for the three sizes: the same font size, line height and gutter padding per size."
        },
        {
          "name": "ParityFrame",
          "code": "import { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const ParityFrame = () => (\n  <VStack gap={24}>\n    <ParityPair testId='parity-frame-header' code={sampleCode} language='text'>\n      {PARITY_HEADER_FRAME}\n    </ParityPair>\n    <ParityPair testId='parity-frame-floating' code={sampleCode} language='text'>\n      {PARITY_FLOATING_FRAME}\n    </ParityPair>\n  </VStack>\n);",
          "storyFile": "CodeEditor/CodeEditor.stories.tsx",
          "storyTitle": "Data Display/CodeEditor",
          "description": "Parity check for the shared frame: a header with tabs and actions, and floating actions\nwithout a header, sit in the same place with the same spacing."
        },
        {
          "name": "ParityShowMore",
          "code": "export const ParityShowMore = () => (\n  <ParityPair testId='parity-show-more' code={showMoreCode} language='text' maxLines={7} />\n);",
          "storyFile": "CodeEditor/CodeEditor.stories.tsx",
          "storyTitle": "Data Display/CodeEditor",
          "description": "Parity check for `maxLines`: the same clamped height and the same \"Show N more lines\" button."
        },
        {
          "name": "Languages",
          "code": "import { CodeSnippetAdapterProvider, loadShikiAdapter } from '@wallarm-org/design-system/CodeSnippet';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Languages = () => (\n  <CodeSnippetAdapterProvider adapter={loadShikiAdapter}>\n    <VStack gap={16}>\n      {LANGUAGE_SAMPLES.map(sample => (\n        <LanguageExample key={sample.id} sample={sample} />\n      ))}\n    </VStack>\n  </CodeSnippetAdapterProvider>\n);",
          "storyFile": "CodeEditor/CodeEditor.stories.tsx",
          "storyTitle": "Data Display/CodeEditor",
          "description": "Colours come from the adapter (Shiki here); JavaScript, TypeScript, Python and Lua parsers load\non first use."
        },
        {
          "name": "SyntaxErrors",
          "code": "import { CodeSnippetAdapterProvider, loadShikiAdapter } from '@wallarm-org/design-system/CodeSnippet';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const SyntaxErrors = () => (\n  <CodeSnippetAdapterProvider adapter={loadShikiAdapter}>\n    <VStack gap={16}>\n      {SYNTAX_ERROR_SAMPLES.map(sample => (\n        <SyntaxErrorExample key={sample.language} sample={sample} />\n      ))}\n    </VStack>\n  </CodeSnippetAdapterProvider>\n);",
          "storyFile": "CodeEditor/CodeEditor.stories.tsx",
          "storyTitle": "Data Display/CodeEditor",
          "description": "Syntax errors for every language with a structure parser: JSON and an HTTP JSON body use the\nprecise `JSON.parse` message, JavaScript and TypeScript use Babel, Lua uses luaparse (first error only), YAML and Python report\nLezer error nodes. Hover an underline to read the message; the count below each editor comes from\n`onDiagnosticsChange`. Bash and plain text have no syntax diagnostics."
        },
        {
          "name": "Diff",
          "code": "import { useState } from 'react';\nimport { CodeEditorContent, CodeEditorRoot } from '@wallarm-org/design-system/CodeEditor';\n\nexport const Diff = () => {\n  const [value, setValue] = useState(DIFF_MODIFIED);\n\n  return (\n    <CodeEditorRoot\n      data-testid='code-editor-diff'\n      language='http'\n      original={DIFF_ORIGINAL}\n      value={value}\n      onChange={setValue}\n    >\n      <CodeEditorContent aria-label='Request draft compared with the stored request' lineNumbers />\n    </CodeEditorRoot>\n  );\n};",
          "storyFile": "CodeEditor/CodeEditor.stories.tsx",
          "storyTitle": "Data Display/CodeEditor",
          "description": "`original` turns on diff mode: added and changed lines read as `success` lines with a `+`,\nremoved lines as `danger` rows with a `-` and no line number. The rows stay editable, and the\ndiff updates as you type."
        },
        {
          "name": "DiffWrapLines",
          "code": "import { useState } from 'react';\nimport { CodeEditorContent, CodeEditorRoot } from '@wallarm-org/design-system/CodeEditor';\n\nexport const DiffWrapLines = () => {\n  const [value, setValue] = useState(DIFF_WRAP_MODIFIED);\n\n  return (\n    <div className='w-480'>\n      <CodeEditorRoot\n        data-testid='code-editor-diff-wrap'\n        language='http'\n        original={DIFF_WRAP_ORIGINAL}\n        value={value}\n        onChange={setValue}\n        defaultWrapLines\n      >\n        <CodeEditorContent aria-label='Request without the debug header' lineNumbers />\n      </CodeEditorRoot>\n    </div>\n  );\n};",
          "storyFile": "CodeEditor/CodeEditor.stories.tsx",
          "storyTitle": "Data Display/CodeEditor",
          "description": "With wrapping on, a removed line longer than the frame wraps inside its `danger` row and its\n`-` marker stays on the first visual row, beside where the line starts."
        },
        {
          "name": "AnalyticsAttributes",
          "code": "import { CodeEditorContent, CodeEditorRoot } from '@wallarm-org/design-system/CodeEditor';\nimport { CodeSnippetActions, CodeSnippetCopyButton, CodeSnippetFullscreenButton, CodeSnippetHeader, CodeSnippetTitle, CodeSnippetWrapButton } from '@wallarm-org/design-system/CodeSnippet';\n\nexport const AnalyticsAttributes = () => (\n  <CodeEditorRoot\n    data-testid='analytics-editor'\n    language='http'\n    defaultValue={analyticsRequest}\n    folds={analyticsFolds}\n  >\n    <CodeSnippetHeader>\n      <CodeSnippetTitle>Request</CodeSnippetTitle>\n      <CodeSnippetActions>\n        <CodeSnippetCopyButton data-analytics-id='CODE_EDITOR_COPY' />\n        <CodeSnippetWrapButton data-analytics-id='CODE_EDITOR_WRAP' />\n        <CodeSnippetFullscreenButton data-analytics-id='CODE_EDITOR_FULLSCREEN' />\n      </CodeSnippetActions>\n    </CodeSnippetHeader>\n    <CodeEditorContent\n      aria-label='HTTP request'\n      lineNumbers\n      data-analytics-id='CODE_EDITOR_REQUEST'\n      data-analytics-props='{\"surface\":\"rule-editor\"}'\n    />\n  </CodeEditorRoot>\n);",
          "storyFile": "CodeEditor/CodeEditor.stories.tsx",
          "storyTitle": "Data Display/CodeEditor",
          "description": "Where analytics attributes land. `data-*` / `aria-*` / `id` on `CodeEditorContent`\nreach the typing surface (`role=\"textbox\"`), chrome buttons take them directly, and\nfold buttons take them through `toggleProps` / `summaryProps`. Popups drawn by the\neditor (autocomplete, tooltips, search panel) are not attributable — see\n`CodeEditor/ANALYTICS_GAPS.md`."
        },
        {
          "name": "EditingWorkflow",
          "code": "import { EditingWorkflowDemo } from './story-content/_storyEditingWorkflow';\n\nexport const EditingWorkflow = () => <EditingWorkflowDemo />;",
          "storyFile": "CodeEditor/CodeEditor.stories.tsx",
          "storyTitle": "Data Display/CodeEditor",
          "description": "A controlled HTTP request with header and body folds and a JSON Schema on the body —\n`retries` breaks the schema's maximum on purpose, so the underline and its hover message\nare part of the example. The editor's description points at `CODE_EDITOR_KEYBOARD_HINT`."
        },
        {
          "name": "TabsKeepHistory",
          "code": "import { TabsKeepHistoryDemo } from './story-content/_storyTabsKeepHistory';\n\nexport const TabsKeepHistory = () => <TabsKeepHistoryDemo />;",
          "storyFile": "CodeEditor/CodeEditor.stories.tsx",
          "storyTitle": "Data Display/CodeEditor",
          "description": "Each tab passes its own `documentId`, so switching swaps in that document's undo history,\nselection and collapsed folds instead of replacing the text of one shared document."
        },
        {
          "name": "LongDocument",
          "code": "import { LongDocumentDemo } from './story-content/_storyLongDocument';\n\nexport const LongDocument = () => <LongDocumentDemo />;",
          "storyFile": "CodeEditor/CodeEditor.stories.tsx",
          "storyTitle": "Data Display/CodeEditor",
          "description": "2 000 read-only lines clamped by `maxLines` — the top of the envelope the colour painter is\nbuilt for, where `readOnly` still lets the text be selected, searched and copied."
        },
        {
          "name": "FullscreenInsideDrawer",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { CodeEditorContent, CodeEditorRoot } from '@wallarm-org/design-system/CodeEditor';\nimport { CodeSnippetActions, CodeSnippetCopyButton, CodeSnippetFullscreenButton, CodeSnippetHeader, CodeSnippetTitle } from '@wallarm-org/design-system/CodeSnippet';\nimport { Drawer, DrawerBody, DrawerContent, DrawerHeader, DrawerTitle, DrawerTrigger } from '@wallarm-org/design-system/Drawer';\n\nexport const FullscreenInsideDrawer = () => {\n  const [value, setValue] = useState(jsonCode);\n\n  return (\n    <Drawer>\n      <DrawerTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Open Drawer\n        </Button>\n      </DrawerTrigger>\n      <DrawerContent>\n        <DrawerHeader>\n          <DrawerTitle>Rule</DrawerTitle>\n        </DrawerHeader>\n        <DrawerBody>\n          <CodeEditorRoot value={value} onChange={setValue} language='json'>\n            <CodeSnippetHeader>\n              <CodeSnippetTitle>rule.json</CodeSnippetTitle>\n              <CodeSnippetActions>\n                <CodeSnippetFullscreenButton />\n                <CodeSnippetCopyButton />\n              </CodeSnippetActions>\n            </CodeSnippetHeader>\n            <CodeEditorContent lineNumbers aria-label='Rule JSON' />\n          </CodeEditorRoot>\n        </DrawerBody>\n      </DrawerContent>\n    </Drawer>\n  );\n};",
          "storyFile": "CodeEditor/CodeEditor.stories.tsx",
          "storyTitle": "Data Display/CodeEditor",
          "description": "Fullscreen opened from a modal `Drawer` stacks above it: the editor and its buttons take\npointer and keyboard input, and Escape leaves fullscreen while the drawer stays open."
        }
      ]
    },
    {
      "name": "CodeSnippet",
      "description": "A block of code to be read and copied, never edited — reach for `InlineCodeSnippet` when the code belongs inside a sentence, and a real editor when the value is meant to change. Everything beyond the code is composed: a `CodeSnippetHeader` carrying a title or tabs, `CodeSnippetActions` for copy, wrap and fullscreen, `CodeSnippetLineNumbers`, and per-line colour, prefixes and folds — and highlighting happens only inside a `CodeSnippetAdapterProvider`. The snippet sits inside a `display: contents` wrapper that keeps it mounted across fullscreen, so space snippets with their own `className` (for example `mt-16`) or a `gap` on the parent — not `space-*`, `divide-*` or child selectors on the parent.",
      "importPath": "@wallarm-org/design-system/CodeSnippet",
      "props": [],
      "variants": [
        {
          "name": "size",
          "options": [
            "sm",
            "md",
            "lg"
          ],
          "defaultValue": "sm"
        }
      ],
      "subComponents": [
        {
          "name": "CodeSnippetActions",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "CodeSnippetAdapterProvider",
          "props": [
            {
              "name": "adapter",
              "type": "AdapterInput<TLanguage>",
              "required": true,
              "description": "Syntax adapter or a loader function that returns a Promise of the adapter.\nUsing a loader function enables code splitting - the adapter bundle will\nonly be loaded when the component mounts."
            }
          ]
        },
        {
          "name": "CodeSnippetCode",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "CodeSnippetContent",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "nativeScroll",
              "type": "boolean | undefined",
              "required": false,
              "description": "Use native browser scroll instead of ScrollArea.",
              "defaultValue": "false"
            }
          ]
        },
        {
          "name": "CodeSnippetCopyButton",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "color",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "size",
              "type": "{ small: string; medium: string; large: string; 'inline-edit': string; }",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "variant",
              "type": "{ primary: string; outline: string; ghost: string; secondary: string; }",
              "required": false
            },
            {
              "name": "loading",
              "type": "{ true: string; }",
              "required": false
            },
            {
              "name": "as",
              "type": "C | undefined",
              "required": false
            },
            {
              "name": "fullWidth",
              "type": "{ true: string; false: string; }",
              "required": false
            }
          ]
        },
        {
          "name": "CodeSnippetFullscreenButton",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "color",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "size",
              "type": "{ small: string; medium: string; large: string; 'inline-edit': string; }",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "variant",
              "type": "{ primary: string; outline: string; ghost: string; secondary: string; }",
              "required": false
            },
            {
              "name": "loading",
              "type": "{ true: string; }",
              "required": false
            },
            {
              "name": "as",
              "type": "C | undefined",
              "required": false
            },
            {
              "name": "fullWidth",
              "type": "{ true: string; false: string; }",
              "required": false
            }
          ]
        },
        {
          "name": "CodeSnippetHeader",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "CodeSnippetLineNumbers",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "CodeSnippetRoot",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onCopy",
              "type": "ClipboardEventHandler<T> | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "size",
              "type": "{ sm: string; md: string; lg: string; }",
              "required": false,
              "defaultValue": "sm"
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "code",
              "type": "string",
              "required": true,
              "description": "The code string to display"
            },
            {
              "name": "language",
              "type": "TLanguage | undefined",
              "required": false,
              "description": "Programming language for syntax highlighting",
              "defaultValue": "text' as TLanguage"
            },
            {
              "name": "lines",
              "type": "Record<number, LineConfig> | undefined",
              "required": false,
              "description": "Per-line configuration (color, prefix) keyed by line number",
              "defaultValue": "EMPTY_LINES"
            },
            {
              "name": "startingLineNumber",
              "type": "number | undefined",
              "required": false,
              "description": "Starting line number (default: 1)",
              "defaultValue": "1"
            },
            {
              "name": "wrapLines",
              "type": "boolean | undefined",
              "required": false,
              "description": "Enable line wrapping"
            },
            {
              "name": "maxLines",
              "type": "number | undefined",
              "required": false,
              "description": "Max lines before collapsing.\nRoot auto-renders the default show-more button unless a direct\n`CodeSnippetShowMoreButton` child is provided for button-level props.",
              "defaultValue": "0"
            },
            {
              "name": "folds",
              "type": "FoldRegion[] | undefined",
              "required": false,
              "description": "Foldable regions that can be collapsed/expanded"
            }
          ]
        },
        {
          "name": "CodeSnippetShowMoreButton",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "color",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "size",
              "type": "{ small: string; medium: string; large: string; 'inline-edit': string; }",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "variant",
              "type": "{ primary: string; outline: string; ghost: string; secondary: string; }",
              "required": false
            },
            {
              "name": "loading",
              "type": "{ true: string; }",
              "required": false
            },
            {
              "name": "as",
              "type": "C | undefined",
              "required": false
            },
            {
              "name": "fullWidth",
              "type": "{ true: string; false: string; }",
              "required": false
            }
          ]
        },
        {
          "name": "CodeSnippetTab",
          "props": [
            {
              "name": "value",
              "type": "string",
              "required": true
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "onFocus",
              "type": "((e: FocusEvent<HTMLButtonElement, Element>) => void) | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "CodeSnippetTabs",
          "props": [
            {
              "name": "value",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onValueChange",
              "type": "((value: string) => void) | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "CodeSnippetTitle",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "CodeSnippetWrapButton",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "color",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "onToggle",
              "type": "((active: boolean, event: MouseEvent<HTMLButtonElement, MouseEvent>) => void) | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "size",
              "type": "{ small: string; medium: string; large: string; 'inline-edit': string; }",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "variant",
              "type": "{ outline: string; ghost: string; }",
              "required": false
            },
            {
              "name": "loading",
              "type": "{ true: string; }",
              "required": false
            },
            {
              "name": "as",
              "type": "C | undefined",
              "required": false
            },
            {
              "name": "fullWidth",
              "type": "{ true: string; false: string; }",
              "required": false
            },
            {
              "name": "active",
              "type": "{ true: string; false: string; }",
              "required": false
            }
          ]
        },
        {
          "name": "InlineCodeSnippet",
          "props": [
            {
              "name": "code",
              "type": "string",
              "required": true,
              "description": "The code content to display"
            },
            {
              "name": "size",
              "type": "\"inherit\" | \"sm\" | \"md\" | \"lg\" | undefined",
              "required": false,
              "description": "Size variant",
              "defaultValue": "inherit"
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "description": "Render as the React element passed via `children` instead of the default `<code>`. The `code` prop becomes the cloned element's content.",
              "defaultValue": "false"
            },
            {
              "name": "copyable",
              "type": "boolean | undefined",
              "required": false,
              "description": "Enable click to copy functionality (default: true)",
              "defaultValue": "true"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Default",
          "code": "import { CodeSnippetCode, CodeSnippetContent, CodeSnippetRoot } from '@wallarm-org/design-system/CodeSnippet';\n\nexport const Default = () => (\n  <CodeSnippetRoot code={bashCode} language='text'>\n    <CodeSnippetContent>\n      <CodeSnippetCode />\n    </CodeSnippetContent>\n  </CodeSnippetRoot>\n);",
          "storyFile": "CodeSnippet/CodeSnippet.stories.tsx",
          "storyTitle": "Data Display/CodeSnippet/CodeSnippet",
          "description": "The block with no adapter in scope — mono type on a tinted surface, and the plain\nfallback rather than an absence of highlighting to fix."
        },
        {
          "name": "WithLineNumbers",
          "code": "import { CodeSnippetCode, CodeSnippetContent, CodeSnippetLineNumbers, CodeSnippetRoot } from '@wallarm-org/design-system/CodeSnippet';\n\nexport const WithLineNumbers = () => (\n  <CodeSnippetRoot code={sampleCode} language='text'>\n    <CodeSnippetContent>\n      <CodeSnippetLineNumbers />\n      <CodeSnippetCode />\n    </CodeSnippetContent>\n  </CodeSnippetRoot>\n);",
          "storyFile": "CodeSnippet/CodeSnippet.stories.tsx",
          "storyTitle": "Data Display/CodeSnippet/CodeSnippet",
          "description": "`CodeSnippetLineNumbers` is a sibling of the code inside `CodeSnippetContent`, so the\ngutter is something you compose in rather than a prop you switch on."
        },
        {
          "name": "Sizes",
          "code": "import { CodeSnippetCode, CodeSnippetContent, CodeSnippetRoot } from '@wallarm-org/design-system/CodeSnippet';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Sizes = () => (\n  <VStack gap={16}>\n    <VStack align='start' gap={4}>\n      <CodeSnippetRoot code={bashCode} language='text' size='sm'>\n        <CodeSnippetContent>\n          <CodeSnippetCode />\n        </CodeSnippetContent>\n      </CodeSnippetRoot>\n    </VStack>\n    <VStack align='start' gap={4}>\n      <CodeSnippetRoot code={bashCode} language='text' size='md'>\n        <CodeSnippetContent>\n          <CodeSnippetCode />\n        </CodeSnippetContent>\n      </CodeSnippetRoot>\n    </VStack>\n    <VStack align='start' gap={4}>\n      <CodeSnippetRoot code={bashCode} language='text' size='lg'>\n        <CodeSnippetContent>\n          <CodeSnippetCode />\n        </CodeSnippetContent>\n      </CodeSnippetRoot>\n    </VStack>\n  </VStack>\n);",
          "storyFile": "CodeSnippet/CodeSnippet.stories.tsx",
          "storyTitle": "Data Display/CodeSnippet/CodeSnippet",
          "description": "The three sizes. `sm` is the default at 12px; `md` and `lg` step the code to 14 and\n16px for a block meant to be read from further away."
        },
        {
          "name": "LineAnnotations",
          "code": "import { CodeSnippetCode, CodeSnippetContent, CodeSnippetLineNumbers, CodeSnippetRoot } from '@wallarm-org/design-system/CodeSnippet';\nimport { Info, Skull, TriangleAlert } from '@wallarm-org/design-system/icons';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@wallarm-org/design-system/Tooltip';\n\nexport const LineAnnotations = () => {\n  const httpCode = `Host: inventory.example.com\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)\nAppleWebKit/537.36\nAccept: application/json, text/plain, */*\nAccept-Language: en-US,en;q=0.9\nConnection: keep-alive\nCache-Control: no-cache`;\n\n  return (\n    <CodeSnippetRoot\n      code={httpCode}\n      language='text'\n      lines={{\n        3: {\n          color: 'danger',\n          prefix: (\n            <Tooltip>\n              <TooltipTrigger>\n                <Skull />\n              </TooltipTrigger>\n              <TooltipContent>Tooltip</TooltipContent>\n            </Tooltip>\n          ),\n        },\n        5: {\n          color: 'warning',\n          prefix: (\n            <Tooltip>\n              <TooltipTrigger>\n                <TriangleAlert />\n              </TooltipTrigger>\n              <TooltipContent>Tooltip</TooltipContent>\n            </Tooltip>\n          ),\n        },\n        7: {\n          color: 'info',\n          prefix: (\n            <Tooltip>\n              <TooltipTrigger>\n                <Info />\n              </TooltipTrigger>\n              <TooltipContent>Tooltip</TooltipContent>\n            </Tooltip>\n          ),\n        },\n      }}\n    >\n      <CodeSnippetContent>\n        <CodeSnippetLineNumbers />\n        <CodeSnippetCode />\n      </CodeSnippetContent>\n    </CodeSnippetRoot>\n  );\n};",
          "storyFile": "CodeSnippet/CodeSnippet.stories.tsx",
          "storyTitle": "Data Display/CodeSnippet/CodeSnippet",
          "description": "`lines`, keyed by line number, tints a line and hangs a prefix off it — here a\ntooltipped icon on each of the three headers worth calling out."
        },
        {
          "name": "LineColors",
          "code": "import { CodeSnippetCode, CodeSnippetContent, CodeSnippetLineNumbers, CodeSnippetRoot } from '@wallarm-org/design-system/CodeSnippet';\nimport { Info } from '@wallarm-org/design-system/icons';\n\nexport const LineColors = () => {\n  const colorsCode = `Line 1: Default (no color)\nLine 2: Danger color\nLine 3: Warning color\nLine 4: Info color\nLine 5: Success color\nLine 6: Brand color\nLine 7: AI color\nLine 8: Neutral color`;\n\n  return (\n    <CodeSnippetRoot\n      code={colorsCode}\n      language='text'\n      lines={{\n        2: { color: 'danger' },\n        3: { color: 'warning' },\n        4: { color: 'info' },\n        5: { color: 'success' },\n        6: { color: 'brand' },\n        7: { color: 'ai' },\n        8: { color: 'neutral' },\n      }}\n    >\n      <CodeSnippetContent>\n        <CodeSnippetLineNumbers />\n        <CodeSnippetCode />\n      </CodeSnippetContent>\n    </CodeSnippetRoot>\n  );\n};",
          "storyFile": "CodeSnippet/CodeSnippet.stories.tsx",
          "storyTitle": "Data Display/CodeSnippet/CodeSnippet",
          "description": "The seven line colours are semantic, so choose by what the line means — `danger` for\nthe attack, `info` for the aside — not by which tint reads best."
        },
        {
          "name": "LineRanges",
          "code": "import { CodeSnippetCode, CodeSnippetContent, CodeSnippetLineNumbers, CodeSnippetRoot } from '@wallarm-org/design-system/CodeSnippet';\n\nexport const LineRanges = () => {\n  const httpCode = `GET /api/v2/users HTTP/1.1\nHost: inventory.example.com\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)\nAccept: application/json, text/plain, */*\nAccept-Language: en-US,en;q=0.9\nConnection: keep-alive\nX-Forwarded-For: 192.168.1.100\nCache-Control: no-cache`;\n\n  return (\n    <CodeSnippetRoot\n      code={httpCode}\n      language='text'\n      lines={{\n        4: {\n          color: 'danger',\n          ranges: [{ start: 8, end: 24 }],\n        },\n        7: {\n          color: 'info',\n          ranges: [{ start: 17, end: 30 }],\n        },\n      }}\n    >\n      <CodeSnippetContent>\n        <CodeSnippetLineNumbers />\n        <CodeSnippetCode />\n      </CodeSnippetContent>\n    </CodeSnippetRoot>\n  );\n};",
          "storyFile": "CodeSnippet/CodeSnippet.stories.tsx",
          "storyTitle": "Data Display/CodeSnippet/CodeSnippet",
          "description": "`ranges` narrows the emphasis to character offsets inside the line — start inclusive,\nend exclusive — and once a line has them only the range is coloured, though the\nline's own background stays."
        },
        {
          "name": "TextStyles",
          "code": "import { CodeSnippetCode, CodeSnippetContent, CodeSnippetLineNumbers, CodeSnippetRoot } from '@wallarm-org/design-system/CodeSnippet';\n\nexport const TextStyles = () => {\n  const stylesCode = `Line 1: Default (regular)\nLine 2: Medium weight\nLine 3: Italic style\nLine 4: Danger with italic override\nLine 5: Neutral (default italic)\nLine 6: Custom className\nLine 7: Custom inline style`;\n\n  return (\n    <CodeSnippetRoot\n      code={stylesCode}\n      language='text'\n      lines={{\n        2: { textStyle: 'medium' },\n        3: { textStyle: 'italic' },\n        4: { color: 'danger', textStyle: 'italic' },\n        5: { color: 'neutral' },\n        6: { className: 'underline' },\n        7: { style: { textDecoration: 'line-through' } },\n      }}\n    >\n      <CodeSnippetContent>\n        <CodeSnippetLineNumbers />\n        <CodeSnippetCode />\n      </CodeSnippetContent>\n    </CodeSnippetRoot>\n  );\n};",
          "storyFile": "CodeSnippet/CodeSnippet.stories.tsx",
          "storyTitle": "Data Display/CodeSnippet/CodeSnippet",
          "description": "`textStyle` overrides the weight or slant a colour would have chosen, with `className`\nand `style` left for the cases the three named styles do not cover."
        },
        {
          "name": "LineWithPrefix",
          "code": "import { CodeSnippetCode, CodeSnippetContent, CodeSnippetLineNumbers, CodeSnippetRoot } from '@wallarm-org/design-system/CodeSnippet';\n\nexport const LineWithPrefix = () => {\n  const diffCode = `const greeting = \"Hello\";\nconsole.log(\"old message\");\nconsole.log(\"new message\");\nconsole.log(\"another new line\");\n\nexport default greeting;`;\n\n  return (\n    <CodeSnippetRoot\n      code={diffCode}\n      language='text'\n      lines={{\n        2: { color: 'danger', prefix: '-' },\n        3: { color: 'success', prefix: '+' },\n        4: { color: 'success', prefix: '+' },\n      }}\n    >\n      <CodeSnippetContent>\n        <CodeSnippetLineNumbers />\n        <CodeSnippetCode />\n      </CodeSnippetContent>\n    </CodeSnippetRoot>\n  );\n};",
          "storyFile": "CodeSnippet/CodeSnippet.stories.tsx",
          "storyTitle": "Data Display/CodeSnippet/CodeSnippet",
          "description": "A `+` and `-` prefix over `success` and `danger` lines gives you a diff without a diff\ncomponent."
        },
        {
          "name": "LineWrapping",
          "code": "import { CodeSnippetCode, CodeSnippetContent, CodeSnippetLineNumbers, CodeSnippetRoot, getHttpFolds } from '@wallarm-org/design-system/CodeSnippet';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const LineWrapping = () => {\n  const longCode = `const veryLongVariableName = \"This is a very long string that will demonstrate line wrapping behavior when the content exceeds the container width\";\nconsole.log(veryLongVariableName);`;\n  const httpCode = `GET /api/v2/users?page=1&limit=20&filter=active&sort=name&order=asc&include=profile,settings HTTP/1.1\nHost: api.wallarm.com\nAuthorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0\nContent-Type: application/json\nAccept: application/json\n{\n  \"filter\": { \"status\": \"active\", \"role\": \"admin\" }\n}`;\n  return (\n    <VStack gap={16}>\n      <VStack align='start' gap={4}>\n        <div style={{ maxWidth: '600px' }}>\n          <CodeSnippetRoot code={longCode} language='text'>\n            <CodeSnippetContent>\n              <CodeSnippetLineNumbers />\n              <CodeSnippetCode />\n            </CodeSnippetContent>\n          </CodeSnippetRoot>\n        </div>\n      </VStack>\n      <VStack align='start' gap={4}>\n        <div style={{ maxWidth: '600px' }}>\n          <CodeSnippetRoot code={longCode} language='text' wrapLines>\n            <CodeSnippetContent>\n              <CodeSnippetLineNumbers />\n              <CodeSnippetCode />\n            </CodeSnippetContent>\n          </CodeSnippetRoot>\n        </div>\n      </VStack>\n      <VStack align='start' gap={4}>\n        <div style={{ maxWidth: '600px' }}>\n          <CodeSnippetRoot\n            code={longCode}\n            language='text'\n            lines={{\n              1: { color: 'danger', prefix: '-' },\n              2: { color: 'success', prefix: '+' },\n            }}\n          >\n            <CodeSnippetContent>\n              <CodeSnippetLineNumbers />\n              <CodeSnippetCode />\n            </CodeSnippetContent>\n          </CodeSnippetRoot>\n        </div>\n      </VStack>\n      <VStack align='start' gap={4}>\n        <div style={{ maxWidth: '600px' }}>\n          <CodeSnippetRoot\n            code={longCode}\n            language='text'\n            wrapLines\n            lines={{\n              1: { color: 'danger', prefix: '-' },\n              2: { color: 'success', prefix: '+' },\n            }}\n          >\n            <CodeSnippetContent>\n              <CodeSnippetLineNumbers />\n              <CodeSnippetCode />\n            </CodeSnippetContent>\n          </CodeSnippetRoot>\n        </div>\n      </VStack>\n      <VStack align='start' gap={4}>\n        <div style={{ maxWidth: '600px' }}>\n          <CodeSnippetRoot\n            code={httpCode}\n            language='text'\n            folds={getHttpFolds(httpCode, { headers: { defaultCollapsed: true } })}\n          >\n            <CodeSnippetContent>\n              <CodeSnippetLineNumbers />\n              <CodeSnippetCode />\n            </CodeSnippetContent>\n          </CodeSnippetRoot>\n        </div>\n      </VStack>\n      <VStack align='start' gap={4}>\n        <div style={{ maxWidth: '600px' }}>\n          <CodeSnippetRoot\n            code={httpCode}\n            language='text'\n            wrapLines\n            folds={getHttpFolds(httpCode, { headers: { defaultCollapsed: true } })}\n          >\n            <CodeSnippetContent>\n              <CodeSnippetLineNumbers />\n              <CodeSnippetCode />\n            </CodeSnippetContent>\n          </CodeSnippetRoot>\n        </div>\n      </VStack>\n    </VStack>\n  );\n};",
          "storyFile": "CodeSnippet/CodeSnippet.stories.tsx",
          "storyTitle": "Data Display/CodeSnippet/CodeSnippet",
          "description": "`wrapLines` against the same code unwrapped, in three pairs — what to check is that\nprefixes, colour sticks and fold toggles stay on the first visual row of a wrapped line."
        },
        {
          "name": "WithBothScrolls",
          "code": "import { CodeSnippetCode, CodeSnippetContent, CodeSnippetLineNumbers, CodeSnippetRoot } from '@wallarm-org/design-system/CodeSnippet';\nimport { Skull, TriangleAlert } from '@wallarm-org/design-system/icons';\n\nexport const WithBothScrolls = () => (\n  <div style={{ maxWidth: '500px', maxHeight: '300px', background: 'white' }}>\n    <CodeSnippetRoot\n      code={longScrollCode}\n      language='text'\n      lines={{\n        2: { color: 'warning', prefix: <TriangleAlert /> },\n        3: { color: 'info' },\n        13: { color: 'danger', prefix: <Skull /> },\n        20: { color: 'success', prefix: '+' },\n      }}\n      style={{ height: '280px' }}\n    >\n      <CodeSnippetContent>\n        <CodeSnippetLineNumbers />\n        <CodeSnippetCode />\n      </CodeSnippetContent>\n    </CodeSnippetRoot>\n  </div>\n);",
          "storyFile": "CodeSnippet/CodeSnippet.stories.tsx",
          "storyTitle": "Data Display/CodeSnippet/CodeSnippet",
          "description": "Given a fixed height inside a narrow column, the block scrolls in both directions\nrather than pushing its container around."
        },
        {
          "name": "CustomStartingLine",
          "code": "import { CodeSnippetCode, CodeSnippetContent, CodeSnippetLineNumbers, CodeSnippetRoot } from '@wallarm-org/design-system/CodeSnippet';\n\nexport const CustomStartingLine = () => (\n  <CodeSnippetRoot code={sampleCode} language='text' startingLineNumber={97}>\n    <CodeSnippetContent>\n      <CodeSnippetLineNumbers />\n      <CodeSnippetCode />\n    </CodeSnippetContent>\n  </CodeSnippetRoot>\n);",
          "storyFile": "CodeSnippet/CodeSnippet.stories.tsx",
          "storyTitle": "Data Display/CodeSnippet/CodeSnippet",
          "description": "`startingLineNumber` renumbers the gutter, for a fragment lifted out of a longer file."
        },
        {
          "name": "JSONWithShiki",
          "code": "import { loadShikiAdapter, CodeSnippetAdapterProvider, CodeSnippetCode, CodeSnippetContent, CodeSnippetLineNumbers, CodeSnippetRoot } from '@wallarm-org/design-system/CodeSnippet';\n\nexport const JSONWithShiki = () => (\n  <CodeSnippetAdapterProvider adapter={loadShikiAdapter}>\n    <CodeSnippetRoot code={jsonCode} language='json'>\n      <CodeSnippetContent>\n        <CodeSnippetLineNumbers />\n        <CodeSnippetCode />\n      </CodeSnippetContent>\n    </CodeSnippetRoot>\n  </CodeSnippetAdapterProvider>\n);",
          "storyFile": "CodeSnippet/CodeSnippet.stories.tsx",
          "storyTitle": "Data Display/CodeSnippet/CodeSnippet",
          "description": "Shiki, supplied through `CodeSnippetAdapterProvider`, uses VS Code-style grammars.\nThe adapter lazily initializes its supported languages and github-light theme with\nthe Oniguruma WASM engine on the first highlight call."
        },
        {
          "name": "TypescriptWithPrism",
          "code": "import { loadPrismAdapter, CodeSnippetAdapterProvider, CodeSnippetCode, CodeSnippetContent, CodeSnippetLineNumbers, CodeSnippetRoot } from '@wallarm-org/design-system/CodeSnippet';\n\nexport const TypescriptWithPrism = () => (\n  <CodeSnippetAdapterProvider adapter={loadPrismAdapter}>\n    <CodeSnippetRoot code={typescriptCode} language='typescript'>\n      <CodeSnippetContent>\n        <CodeSnippetLineNumbers />\n        <CodeSnippetCode />\n      </CodeSnippetContent>\n    </CodeSnippetRoot>\n  </CodeSnippetAdapterProvider>\n);",
          "storyFile": "CodeSnippet/CodeSnippet.stories.tsx",
          "storyTitle": "Data Display/CodeSnippet/CodeSnippet",
          "description": "TypeScript highlighted with Prism. Its loader emits only the Prism adapter's\ndependencies; unused Shiki and highlight.js loaders are discarded by the consumer."
        },
        {
          "name": "BashWithPrism",
          "code": "import { loadPrismAdapter, CodeSnippetAdapterProvider, CodeSnippetCode, CodeSnippetContent, CodeSnippetLineNumbers, CodeSnippetRoot } from '@wallarm-org/design-system/CodeSnippet';\n\nexport const BashWithPrism = () => (\n  <CodeSnippetAdapterProvider adapter={loadPrismAdapter}>\n    <CodeSnippetRoot code={curlCode} language='bash'>\n      <CodeSnippetContent>\n        <CodeSnippetLineNumbers />\n        <CodeSnippetCode />\n      </CodeSnippetContent>\n    </CodeSnippetRoot>\n  </CodeSnippetAdapterProvider>\n);",
          "storyFile": "CodeSnippet/CodeSnippet.stories.tsx",
          "storyTitle": "Data Display/CodeSnippet/CodeSnippet",
          "description": "A multi-line `curl` under Prism, where the continuation backslashes and the quoted JSON\nbody are the parts a highlighter usually gets wrong."
        },
        {
          "name": "HTMLWithHighlightJs",
          "code": "import { loadHighlightJsAdapter, CodeSnippetAdapterProvider, CodeSnippetCode, CodeSnippetContent, CodeSnippetLineNumbers, CodeSnippetRoot } from '@wallarm-org/design-system/CodeSnippet';\n\nexport const HTMLWithHighlightJs = () => (\n  <CodeSnippetAdapterProvider adapter={loadHighlightJsAdapter}>\n    <CodeSnippetRoot code={htmlCode} language='html'>\n      <CodeSnippetContent>\n        <CodeSnippetLineNumbers />\n        <CodeSnippetCode />\n      </CodeSnippetContent>\n    </CodeSnippetRoot>\n  </CodeSnippetAdapterProvider>\n);",
          "storyFile": "CodeSnippet/CodeSnippet.stories.tsx",
          "storyTitle": "Data Display/CodeSnippet/CodeSnippet",
          "description": "HTML highlighted with highlight.js. The adapter loads the library lazily and\nexposes the languages listed by its getSupportedLanguages() method."
        },
        {
          "name": "HTTPRequestWithPrism",
          "code": "import { loadPrismAdapter, CodeSnippetAdapterProvider, CodeSnippetCode, CodeSnippetContent, CodeSnippetLineNumbers, CodeSnippetRoot } from '@wallarm-org/design-system/CodeSnippet';\n\nexport const HTTPRequestWithPrism = () => (\n  <CodeSnippetAdapterProvider adapter={loadPrismAdapter}>\n    <CodeSnippetRoot code={httpRequestCode} language='http'>\n      <CodeSnippetContent>\n        <CodeSnippetLineNumbers />\n        <CodeSnippetCode />\n      </CodeSnippetContent>\n    </CodeSnippetRoot>\n  </CodeSnippetAdapterProvider>\n);",
          "storyFile": "CodeSnippet/CodeSnippet.stories.tsx",
          "storyTitle": "Data Display/CodeSnippet/CodeSnippet",
          "description": "`language='http'` is a grammar in its own right — method, path and version on the first\nline, then header names told apart from their values."
        },
        {
          "name": "HTTPResponseWithShiki",
          "code": "import { loadShikiAdapter, CodeSnippetAdapterProvider, CodeSnippetCode, CodeSnippetContent, CodeSnippetLineNumbers, CodeSnippetRoot } from '@wallarm-org/design-system/CodeSnippet';\n\nexport const HTTPResponseWithShiki = () => (\n  <CodeSnippetAdapterProvider adapter={loadShikiAdapter}>\n    <CodeSnippetRoot code={httpResponseCode} language='http'>\n      <CodeSnippetContent>\n        <CodeSnippetLineNumbers />\n        <CodeSnippetCode />\n      </CodeSnippetContent>\n    </CodeSnippetRoot>\n  </CodeSnippetAdapterProvider>\n);",
          "storyFile": "CodeSnippet/CodeSnippet.stories.tsx",
          "storyTitle": "Data Display/CodeSnippet/CodeSnippet",
          "description": "The response side, where the JSON body after the headers is highlighted as JSON rather\nthan as more header text."
        },
        {
          "name": "WithHeader",
          "code": "import { CodeSnippetCode, CodeSnippetContent, CodeSnippetHeader, CodeSnippetRoot, CodeSnippetTitle } from '@wallarm-org/design-system/CodeSnippet';\n\nexport const WithHeader = () => (\n  <CodeSnippetRoot code={bashCode} language='text'>\n    <CodeSnippetHeader>\n      <CodeSnippetTitle>install.sh</CodeSnippetTitle>\n    </CodeSnippetHeader>\n    <CodeSnippetContent>\n      <CodeSnippetCode />\n    </CodeSnippetContent>\n  </CodeSnippetRoot>\n);",
          "storyFile": "CodeSnippet/CodeSnippet.stories.tsx",
          "storyTitle": "Data Display/CodeSnippet/CodeSnippet",
          "description": "`CodeSnippetHeader` with a `CodeSnippetTitle` names the file the code came from, as a\nbar above the block rather than a caption on it."
        },
        {
          "name": "WithTabsAndActions",
          "code": "import { useState } from 'react';\nimport { CodeSnippetActions, CodeSnippetCode, CodeSnippetContent, CodeSnippetCopyButton, CodeSnippetFullscreenButton, CodeSnippetHeader, CodeSnippetRoot, CodeSnippetTab, CodeSnippetTabs, CodeSnippetWrapButton } from '@wallarm-org/design-system/CodeSnippet';\n\nexport const WithTabsAndActions = () => {\n  const [tab, setTab] = useState('npm');\n  const code = packageManagerCodes[tab] ?? '';\n\n  return (\n    <div style={{ width: '320px' }}>\n      <CodeSnippetRoot code={code} language='text'>\n        <CodeSnippetHeader>\n          <CodeSnippetTabs value={tab} onValueChange={setTab}>\n            <CodeSnippetTab value='npm'>npm</CodeSnippetTab>\n            <CodeSnippetTab value='pnpm'>pnpm</CodeSnippetTab>\n            <CodeSnippetTab value='yarn'>yarn</CodeSnippetTab>\n            <CodeSnippetTab value='bun'>bun</CodeSnippetTab>\n          </CodeSnippetTabs>\n          <CodeSnippetActions>\n            <CodeSnippetFullscreenButton />\n            <CodeSnippetWrapButton />\n            <CodeSnippetCopyButton />\n          </CodeSnippetActions>\n        </CodeSnippetHeader>\n        <CodeSnippetContent>\n          <CodeSnippetCode />\n        </CodeSnippetContent>\n      </CodeSnippetRoot>\n    </div>\n  );\n};",
          "storyFile": "CodeSnippet/CodeSnippet.stories.tsx",
          "storyTitle": "Data Display/CodeSnippet/CodeSnippet",
          "description": "Tabs in the header swap the `code` the block is given, which is how one command per\npackage manager is built; the actions sit at the far end of the same bar."
        },
        {
          "name": "WithFloatingActions",
          "code": "import { CodeSnippetActions, CodeSnippetCode, CodeSnippetContent, CodeSnippetCopyButton, CodeSnippetLineNumbers, CodeSnippetRoot, CodeSnippetWrapButton } from '@wallarm-org/design-system/CodeSnippet';\n\nexport const WithFloatingActions = () => (\n  <div style={{ width: '320px' }}>\n    <CodeSnippetRoot code={sampleCode} language='text'>\n      <CodeSnippetActions>\n        <CodeSnippetWrapButton />\n        <CodeSnippetCopyButton />\n      </CodeSnippetActions>\n      <CodeSnippetContent>\n        <CodeSnippetLineNumbers />\n        <CodeSnippetCode />\n      </CodeSnippetContent>\n    </CodeSnippetRoot>\n  </div>\n);",
          "storyFile": "CodeSnippet/CodeSnippet.stories.tsx",
          "storyTitle": "Data Display/CodeSnippet/CodeSnippet",
          "description": "With no header to hold them, `CodeSnippetActions` floats over the top-right of the code\n— the shape for a block whose only affordance is copy."
        },
        {
          "name": "ShowMore",
          "code": "import { CodeSnippetCode, CodeSnippetContent, CodeSnippetRoot, CodeSnippetShowMoreButton } from '@wallarm-org/design-system/CodeSnippet';\n\nexport const ShowMore = () => (\n  <div style={{ display: 'flex', flexDirection: 'column', gap: '24px', width: '500px' }}>\n    <div>\n      <CodeSnippetRoot\n        code={showMoreCode}\n        language='text'\n        maxLines={7}\n        data-testid='show-more-clipped'\n      >\n        <CodeSnippetContent>\n          <CodeSnippetCode />\n        </CodeSnippetContent>\n      </CodeSnippetRoot>\n    </div>\n    <div>\n      <CodeSnippetRoot\n        code={showMoreThresholdCode}\n        language='text'\n        maxLines={7}\n        data-testid='show-more-threshold'\n      >\n        <CodeSnippetContent>\n          <CodeSnippetCode />\n        </CodeSnippetContent>\n      </CodeSnippetRoot>\n    </div>\n    <div>\n      <CodeSnippetRoot code={showMoreCode} language='text' maxLines={7}>\n        <CodeSnippetContent>\n          <CodeSnippetCode />\n        </CodeSnippetContent>\n        <CodeSnippetShowMoreButton data-analytics-id='CODE_SHOW_MORE' />\n      </CodeSnippetRoot>\n    </div>\n  </div>\n);",
          "storyFile": "CodeSnippet/CodeSnippet.stories.tsx",
          "storyTitle": "Data Display/CodeSnippet/CodeSnippet",
          "description": "`maxLines` clips the block and adds the control itself — but only when it would hide at\nleast three lines, so the middle snippet stays open; the third passes props to the real\nbutton by rendering `CodeSnippetShowMoreButton` in place of the automatic one."
        },
        {
          "name": "HTTPRequestWithFolding",
          "code": "import { CodeSnippetCode, CodeSnippetContent, CodeSnippetLineNumbers, CodeSnippetRoot, getHttpFolds } from '@wallarm-org/design-system/CodeSnippet';\n\nexport const HTTPRequestWithFolding = () => (\n  <CodeSnippetRoot\n    code={foldableRequestCode}\n    language='text'\n    folds={getHttpFolds(foldableRequestCode)}\n  >\n    <CodeSnippetContent>\n      <CodeSnippetLineNumbers />\n      <CodeSnippetCode />\n    </CodeSnippetContent>\n  </CodeSnippetRoot>\n);",
          "storyFile": "CodeSnippet/CodeSnippet.stories.tsx",
          "storyTitle": "Data Display/CodeSnippet/CodeSnippet",
          "description": "`getHttpFolds` reads an HTTP message and returns its fold regions, so the reader opens\nthe headers or the body rather than scrolling past both."
        },
        {
          "name": "HTTPResponseWithFolding",
          "code": "import { CodeSnippetCode, CodeSnippetContent, CodeSnippetLineNumbers, CodeSnippetRoot, getHttpFolds } from '@wallarm-org/design-system/CodeSnippet';\n\nexport const HTTPResponseWithFolding = () => (\n  <CodeSnippetRoot\n    code={foldableResponseCode}\n    language='text'\n    folds={getHttpFolds(foldableResponseCode)}\n  >\n    <CodeSnippetContent>\n      <CodeSnippetLineNumbers />\n      <CodeSnippetCode />\n    </CodeSnippetContent>\n  </CodeSnippetRoot>\n);",
          "storyFile": "CodeSnippet/CodeSnippet.stories.tsx",
          "storyTitle": "Data Display/CodeSnippet/CodeSnippet",
          "description": "The same helper on a response, where the body is usually the half worth folding away."
        },
        {
          "name": "WithFoldingExpanded",
          "code": "import { CodeSnippetCode, CodeSnippetContent, CodeSnippetLineNumbers, CodeSnippetRoot, getHttpFolds } from '@wallarm-org/design-system/CodeSnippet';\n\nexport const WithFoldingExpanded = () => (\n  <CodeSnippetRoot\n    code={foldableRequestCode}\n    language='text'\n    folds={getHttpFolds(foldableRequestCode)}\n    lines={{\n      3: { color: 'warning' },\n      4: { color: 'danger', ranges: [{ start: 14, end: 42, color: 'danger' }] },\n      10: { color: 'info' },\n      11: { color: 'info' },\n    }}\n  >\n    <CodeSnippetContent>\n      <CodeSnippetLineNumbers />\n      <CodeSnippetCode />\n    </CodeSnippetContent>\n  </CodeSnippetRoot>\n);",
          "storyFile": "CodeSnippet/CodeSnippet.stories.tsx",
          "storyTitle": "Data Display/CodeSnippet/CodeSnippet",
          "description": "Folds over coloured lines: a collapsed fold takes its colours and prefixes with it, and\nhands them back on expand."
        },
        {
          "name": "WithFoldingAndShowMore",
          "code": "import { loadShikiAdapter, CodeSnippetAdapterProvider, CodeSnippetCode, CodeSnippetContent, CodeSnippetLineNumbers, CodeSnippetRoot, getHttpFolds } from '@wallarm-org/design-system/CodeSnippet';\n\nexport const WithFoldingAndShowMore = () => (\n  <CodeSnippetAdapterProvider adapter={loadShikiAdapter}>\n    <CodeSnippetRoot\n      code={foldableResponseCode}\n      language='http'\n      startingLineNumber={100}\n      maxLines={6}\n      folds={getHttpFolds(foldableResponseCode, { startingLineNumber: 100 })}\n    >\n      <CodeSnippetContent>\n        <CodeSnippetLineNumbers />\n        <CodeSnippetCode />\n      </CodeSnippetContent>\n    </CodeSnippetRoot>\n  </CodeSnippetAdapterProvider>\n);",
          "storyFile": "CodeSnippet/CodeSnippet.stories.tsx",
          "storyTitle": "Data Display/CodeSnippet/CodeSnippet",
          "description": "Folds, `maxLines` and `startingLineNumber` together — fold line numbers are absolute, so\n`getHttpFolds` has to be given the same offset the gutter uses."
        },
        {
          "name": "FullscreenInsideDrawer",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { CodeSnippetActions, CodeSnippetCode, CodeSnippetContent, CodeSnippetCopyButton, CodeSnippetFullscreenButton, CodeSnippetHeader, CodeSnippetRoot, CodeSnippetTitle } from '@wallarm-org/design-system/CodeSnippet';\nimport { Drawer, DrawerBody, DrawerContent, DrawerHeader, DrawerTitle, DrawerTrigger } from '@wallarm-org/design-system/Drawer';\n\nexport const FullscreenInsideDrawer = () => (\n  <Drawer>\n    <DrawerTrigger asChild>\n      <Button variant='outline' color='neutral'>\n        Open Drawer\n      </Button>\n    </DrawerTrigger>\n    <DrawerContent>\n      <DrawerHeader>\n        <DrawerTitle>Request</DrawerTitle>\n      </DrawerHeader>\n      <DrawerBody>\n        <CodeSnippetRoot code={jsonCode} language='json'>\n          <CodeSnippetHeader>\n            <CodeSnippetTitle>package.json</CodeSnippetTitle>\n            <CodeSnippetActions>\n              <CodeSnippetFullscreenButton />\n              <CodeSnippetCopyButton />\n            </CodeSnippetActions>\n          </CodeSnippetHeader>\n          <CodeSnippetContent>\n            <CodeSnippetCode />\n          </CodeSnippetContent>\n        </CodeSnippetRoot>\n      </DrawerBody>\n    </DrawerContent>\n  </Drawer>\n);",
          "storyFile": "CodeSnippet/CodeSnippet.stories.tsx",
          "storyTitle": "Data Display/CodeSnippet/CodeSnippet",
          "description": "Fullscreen opened from a modal `Drawer` stacks above it as a nested layer: its buttons stay\nclickable, and Escape or a backdrop click leaves fullscreen while the drawer stays open."
        },
        {
          "name": "Default",
          "code": "import { InlineCodeSnippet } from '@wallarm-org/design-system/CodeSnippet';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Default = () => (\n  <VStack align='start'>\n    <p className='text-xs text-text-primary'>\n      Small text: Run{' '}\n      <InlineCodeSnippet code='npm install @wads/ui' data-testid='inline-code-copyable' /> to\n      install dependencies.\n    </p>\n    <p className='text-sm text-text-primary'>\n      Medium text: Run <InlineCodeSnippet code='npm install @wads/ui' /> to install dependencies.\n    </p>\n    <p className='text-base text-text-primary'>\n      Large text: Run <InlineCodeSnippet code='npm install @wads/ui' /> to install dependencies.\n    </p>\n  </VStack>\n);",
          "storyFile": "CodeSnippet/InlineCodeSnippet.stories.tsx",
          "storyTitle": "Data Display/CodeSnippet/InlineCodeSnippet",
          "description": "One snippet in three sentence sizes: `size='inherit'`, the default, scales the type\nand the padding with whatever it sits in, and hovering offers the copy."
        },
        {
          "name": "Sizes",
          "code": "import { InlineCodeSnippet } from '@wallarm-org/design-system/CodeSnippet';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Sizes = () => (\n  <VStack align='start' gap={16}>\n    <VStack align='start' gap={4}>\n      <div className='text-xs text-text-primary'>\n        To start creating an interface, run{' '}\n        <InlineCodeSnippet code='npm install @wads/ui' size='sm' /> and then apply the following...\n      </div>\n    </VStack>\n    <VStack align='start' gap={4}>\n      <div className='text-sm text-text-primary'>\n        To start creating an interface, run{' '}\n        <InlineCodeSnippet code='npm install @wads/ui' size='md' /> and then apply the following...\n      </div>\n    </VStack>\n    <VStack align='start' gap={4}>\n      <div className='text-base text-text-primary'>\n        To start creating an interface, run{' '}\n        <InlineCodeSnippet code='npm install @wads/ui' size='lg' /> and then apply the following...\n      </div>\n    </VStack>\n  </VStack>\n);",
          "storyFile": "CodeSnippet/InlineCodeSnippet.stories.tsx",
          "storyTitle": "Data Display/CodeSnippet/InlineCodeSnippet",
          "description": "The three fixed sizes, each beside the text size it pairs with — set one when the\nsnippet must hold its size regardless of its surroundings."
        },
        {
          "name": "NonCopyable",
          "code": "import { InlineCodeSnippet } from '@wallarm-org/design-system/CodeSnippet';\n\nexport const NonCopyable = () => (\n  <p className='text-sm text-text-primary'>\n    This code is not copyable:{' '}\n    <InlineCodeSnippet\n      code='npm install @wads/ui'\n      copyable={false}\n      data-testid='inline-code-non-copyable'\n    />\n  </p>\n);",
          "storyFile": "CodeSnippet/InlineCodeSnippet.stories.tsx",
          "storyTitle": "Data Display/CodeSnippet/InlineCodeSnippet",
          "description": "`copyable={false}` takes the tooltip and the pointer cursor away with the copy, for a\nsnippet that is only being named rather than reused."
        },
        {
          "name": "VariousContent",
          "code": "import { InlineCodeSnippet } from '@wallarm-org/design-system/CodeSnippet';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const VariousContent = () => (\n  <VStack align='start'>\n    <InlineCodeSnippet code='npm install' />\n    <InlineCodeSnippet code='curl -X POST https://api.wallarm.com' />\n    <InlineCodeSnippet code='{\"status\": \"ok\"}' />\n    <InlineCodeSnippet code='SELECT * FROM users WHERE id = 1' />\n    <InlineCodeSnippet code=\"git commit -m 'feat: add feature'\" />\n  </VStack>\n);",
          "storyFile": "CodeSnippet/InlineCodeSnippet.stories.tsx",
          "storyTitle": "Data Display/CodeSnippet/InlineCodeSnippet",
          "description": "Commands, JSON, SQL and a quoted message all render in one colour — inline code gets\nthe mono treatment and nothing else."
        }
      ]
    },
    {
      "name": "Conversation",
      "description": "Stick-to-bottom for the Wally log: `Conversation` takes `ChatBody`’s place between `ChatHeader` and `ChatFooter`, and `ConversationContent` renders the built `ChatBody` (`role=log`) as the scroller. While an answer streams the view follows it; once the reader scrolls up it stops following and `ConversationScrollButton` appears. Scrolling back down, clicking the button or changing `autoScrollKey` (pass the last user message id) re-sticks. `ConversationEmptyState` is the greeting for an empty chat, rendered inside the scroller. The scroll button is the stock small icon-only Button, floated at the bottom centre.",
      "importPath": "@wallarm-org/design-system/Conversation",
      "props": [
        {
          "name": "threshold",
          "type": "number | undefined",
          "required": false,
          "description": "Distance in px from the bottom that still counts as \"at bottom\". Default 70.",
          "defaultValue": "70"
        },
        {
          "name": "autoScrollKey",
          "type": "string | number | undefined",
          "required": false,
          "description": "When it changes, re-stick and scroll to the bottom even if the reader scrolled up. Pass the\nlast user message id, so sending always reveals the answer. For a thread switch, remount\ninstead: `key={threadId}`."
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [
        {
          "name": "ConversationContent",
          "props": [
            {
              "name": "contentClassName",
              "type": "string | undefined",
              "required": false,
              "description": "Classes for the inner column (`flex flex-col`, no gap — v1 §3.1)."
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "ConversationEmptyState",
          "props": [
            {
              "name": "title",
              "type": "ReactNode",
              "required": false,
              "description": "Greeting heading. Default 'How can I help you today?'.",
              "defaultValue": "How can I help you today?"
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "ConversationScrollButton",
          "props": [
            {
              "name": "label",
              "type": "string | undefined",
              "required": false,
              "description": "Accessible name and tooltip. Default 'Scroll to latest message'.",
              "defaultValue": "Scroll to latest message"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Default",
          "code": "import { Fragment, useState } from 'react';\nimport { AssistantMessage, AssistantMessageContent } from '@wallarm-org/design-system/AssistantMessage';\nimport { Chat, ChatFooter, ChatHeader, ChatHeaderTitle } from '@wallarm-org/design-system/Chat';\nimport { ChatInput, ChatInputSubmit, ChatInputTextarea } from '@wallarm-org/design-system/ChatInput';\nimport { Conversation, ConversationContent, ConversationScrollButton } from '@wallarm-org/design-system/Conversation';\nimport { MessageActions, MessageTimestamp } from '@wallarm-org/design-system/MessageActions';\nimport { UserMessage, UserMessageBubble } from '@wallarm-org/design-system/UserMessage';\n\nexport const Default = () => {\n  const [turns, setTurns] = useState(HISTORY);\n  const [value, setValue] = useState('');\n  const lastId = turns[turns.length - 1]?.id;\n\n  const handleSubmit = (question: string) => {\n    setTurns(previous => [\n      ...previous,\n      { id: `u${previous.length}`, question, answer: ANSWER.slice(0, 2) },\n    ]);\n    setValue('');\n  };\n\n  return (\n    <div className='h-640 w-480'>\n      <Chat data-testid='chat'>\n        <ChatHeader>\n          <ChatHeaderTitle />\n        </ChatHeader>\n        <Conversation autoScrollKey={lastId}>\n          <ConversationContent>\n            {turns.map((turn, index) => (\n              <Fragment key={turn.id}>\n                <UserMessage data-testid={`conversation--user-message-${index}`}>\n                  <UserMessageBubble>{turn.question}</UserMessageBubble>\n                  <MessageActions>\n                    <MessageTimestamp dateTime='2026-10-21T09:41:00Z'>2m ago</MessageTimestamp>\n                  </MessageActions>\n                </UserMessage>\n                <AssistantMessage data-testid={`conversation--assistant-message-${index}`}>\n                  <AssistantMessageContent>\n                    {turn.answer.map(paragraph => (\n                      <p key={paragraph}>{paragraph}</p>\n                    ))}\n                  </AssistantMessageContent>\n                  <MessageActions visible>\n                    <MessageTimestamp dateTime='2026-10-21T09:42:00Z'>1m ago</MessageTimestamp>\n                  </MessageActions>\n                </AssistantMessage>\n              </Fragment>\n            ))}\n          </ConversationContent>\n          <ConversationScrollButton />\n        </Conversation>\n        <ChatFooter>\n          <ChatInput value={value} onValueChange={setValue} onSubmit={handleSubmit}>\n            <ChatInputTextarea />\n            <ChatInputSubmit />\n          </ChatInput>\n        </ChatFooter>\n      </Chat>\n    </div>\n  );\n};",
          "storyFile": "Conversation/Conversation.stories.tsx",
          "storyTitle": "AI/Conversation",
          "description": "A long history that opens at the latest message. Sending a message appends a turn and changes\n`autoScrollKey`, so the view re-sticks even after the reader scrolled up."
        },
        {
          "name": "Empty",
          "code": "import { useState } from 'react';\nimport { Chat, ChatFooter, ChatHeader, ChatHeaderTitle, ChatSuggestion, ChatSuggestions } from '@wallarm-org/design-system/Chat';\nimport { ChatInput, ChatInputSubmit, ChatInputTextarea } from '@wallarm-org/design-system/ChatInput';\nimport { Conversation, ConversationContent, ConversationEmptyState, ConversationScrollButton } from '@wallarm-org/design-system/Conversation';\n\nexport const Empty = () => {\n  const [value, setValue] = useState('');\n\n  const handleSubmit = () => {\n    setValue('');\n  };\n\n  return (\n    <div className='h-640 w-480'>\n      <Chat data-testid='chat' background='strong'>\n        <ChatHeader>\n          <ChatHeaderTitle />\n        </ChatHeader>\n        <Conversation>\n          <ConversationContent>\n            <ConversationEmptyState>\n              <ChatSuggestions placement='greeting' label='Suggestions'>\n                <ChatSuggestion data-testid='chat--suggestion-0'>\n                  Why was this request blocked?\n                </ChatSuggestion>\n                <ChatSuggestion data-testid='chat--suggestion-1'>\n                  Show top attacked endpoints\n                </ChatSuggestion>\n              </ChatSuggestions>\n            </ConversationEmptyState>\n          </ConversationContent>\n          <ConversationScrollButton />\n        </Conversation>\n        <ChatFooter>\n          <ChatInput value={value} onValueChange={setValue} onSubmit={handleSubmit}>\n            <ChatInputTextarea />\n            <ChatInputSubmit />\n          </ChatInput>\n        </ChatFooter>\n      </Chat>\n    </div>\n  );\n};",
          "storyFile": "Conversation/Conversation.stories.tsx",
          "storyTitle": "AI/Conversation",
          "description": "`ConversationEmptyState` with greeting pills, over the `strong` background."
        },
        {
          "name": "Streaming",
          "code": "import { Fragment, useEffect, useState } from 'react';\nimport { AssistantMessage, AssistantMessageContent } from '@wallarm-org/design-system/AssistantMessage';\nimport { Chat, ChatHeader, ChatHeaderTitle } from '@wallarm-org/design-system/Chat';\nimport { Conversation, ConversationContent, ConversationScrollButton } from '@wallarm-org/design-system/Conversation';\nimport { MessageActions, MessageTimestamp } from '@wallarm-org/design-system/MessageActions';\nimport { UserMessage, UserMessageBubble } from '@wallarm-org/design-system/UserMessage';\n\nexport const Streaming = () => {\n  const [count, setCount] = useState(1);\n  const streaming = count < ANSWER.length;\n\n  useEffect(() => {\n    if (!streaming) return;\n    const timer = setInterval(() => setCount(value => value + 1), 600);\n    return () => clearInterval(timer);\n  }, [streaming]);\n\n  return (\n    <div className='h-640 w-480'>\n      <Chat data-testid='chat'>\n        <ChatHeader>\n          <ChatHeaderTitle />\n        </ChatHeader>\n        <Conversation>\n          <ConversationContent aria-busy={streaming}>\n            {HISTORY.map((turn, index) => (\n              <Fragment key={turn.id}>\n                <UserMessage data-testid={`conversation--user-message-${index}`}>\n                  <UserMessageBubble>{turn.question}</UserMessageBubble>\n                  <MessageActions>\n                    <MessageTimestamp dateTime='2026-10-21T09:41:00Z'>2m ago</MessageTimestamp>\n                  </MessageActions>\n                </UserMessage>\n                <AssistantMessage data-testid={`conversation--assistant-message-${index}`}>\n                  <AssistantMessageContent>\n                    {turn.answer.map(paragraph => (\n                      <p key={paragraph}>{paragraph}</p>\n                    ))}\n                  </AssistantMessageContent>\n                  <MessageActions visible>\n                    <MessageTimestamp dateTime='2026-10-21T09:42:00Z'>1m ago</MessageTimestamp>\n                  </MessageActions>\n                </AssistantMessage>\n              </Fragment>\n            ))}\n            <AssistantMessage data-testid='conversation--streaming-message' aria-busy={streaming}>\n              <AssistantMessageContent>\n                {ANSWER.slice(0, count).map(paragraph => (\n                  <p key={paragraph}>{paragraph}</p>\n                ))}\n              </AssistantMessageContent>\n            </AssistantMessage>\n          </ConversationContent>\n          <ConversationScrollButton />\n        </Conversation>\n      </Chat>\n    </div>\n  );\n};",
          "storyFile": "Conversation/Conversation.stories.tsx",
          "storyTitle": "AI/Conversation",
          "description": "A paragraph streams in every 600ms. The view follows the growing answer; scroll up and it stops\nfollowing and the scroll button appears."
        },
        {
          "name": "Analytics",
          "code": "import { Fragment } from 'react';\nimport { AssistantMessage, AssistantMessageContent } from '@wallarm-org/design-system/AssistantMessage';\nimport { Chat, ChatHeader, ChatHeaderTitle } from '@wallarm-org/design-system/Chat';\nimport { Conversation, ConversationContent, ConversationScrollButton } from '@wallarm-org/design-system/Conversation';\nimport { MessageActions, MessageTimestamp } from '@wallarm-org/design-system/MessageActions';\nimport { UserMessage, UserMessageBubble } from '@wallarm-org/design-system/UserMessage';\n\nexport const Analytics = () => (\n  <div className='h-640 w-480'>\n    <Chat data-testid='chat'>\n      <ChatHeader>\n        <ChatHeaderTitle />\n      </ChatHeader>\n      <Conversation>\n        <ConversationContent>\n          {HISTORY.map((turn, index) => (\n            <Fragment key={turn.id}>\n              <UserMessage data-testid={`conversation--user-message-${index}`}>\n                <UserMessageBubble>{turn.question}</UserMessageBubble>\n                <MessageActions>\n                  <MessageTimestamp dateTime='2026-10-21T09:41:00Z'>2m ago</MessageTimestamp>\n                </MessageActions>\n              </UserMessage>\n              <AssistantMessage data-testid={`conversation--assistant-message-${index}`}>\n                <AssistantMessageContent>\n                  {turn.answer.map(paragraph => (\n                    <p key={paragraph}>{paragraph}</p>\n                  ))}\n                </AssistantMessageContent>\n                <MessageActions visible>\n                  <MessageTimestamp dateTime='2026-10-21T09:42:00Z'>1m ago</MessageTimestamp>\n                </MessageActions>\n              </AssistantMessage>\n            </Fragment>\n          ))}\n        </ConversationContent>\n        <ConversationScrollButton data-analytics-id='WALLY_SCROLL_TO_LATEST' />\n      </Conversation>\n    </Chat>\n  </div>\n);",
          "storyFile": "Conversation/Conversation.stories.tsx",
          "storyTitle": "AI/Conversation",
          "description": "`data-analytics-id` on `ConversationScrollButton` lands on its `<button>`. Scroll the log up to\nreveal it. Keep analytics off the `Conversation` root — a click anywhere inside would resolve to it."
        }
      ]
    },
    {
      "name": "Copyable",
      "description": "Click-to-copy is a **behaviour pattern**, not a component.\nAny existing element — a Button, InlineCodeSnippet, Attribute value, table cell, or DropdownMenuItem — copies a value on click and confirms it.\n\n### Feedback rules\n\n1. **Element can change itself** (button, icon button, code snippet action): swap in place. Copy icon → Check, label \"Copy code\" → \"Copied\" at the idle width, tooltip \"Click to copy\" → \"Copied\".\n2. **Clickable text without an icon** (inline code snippet, a value): tooltip only.\n3. **Element disappears after the action or has nothing to transform** (menu item): toast \"Copied\".\n\nNever two feedbacks at once. Copied state resets after ~2 s.",
      "importPath": "@wallarm-org/design-system/Copyable",
      "props": [
        {
          "name": "text",
          "type": "string | (() => string)",
          "required": true,
          "description": "The text to copy to the clipboard. Pass a function to read the text\nlazily at click time (e.g. the live document of an editor)."
        },
        {
          "name": "tooltip",
          "type": "string | boolean | { idle: string; copied: string; } | undefined",
          "required": false,
          "description": "Show a tooltip with copy feedback.\n\n- `true`  — \"Click to copy\" / \"Copied\"\n- `string` — custom idle text; copied text stays \"Copied\"\n- `{ idle: string; copied: string }` — fully custom tooltip text"
        },
        {
          "name": "onCopied",
          "type": "(() => void) | undefined",
          "required": false,
          "description": "Fired after a successful copy. Use for toast feedback."
        },
        {
          "name": "resetDelay",
          "type": "number | undefined",
          "required": false,
          "description": "Time in ms before the `copied` state resets (default: 2000).",
          "defaultValue": "2000"
        }
      ],
      "variants": [],
      "subComponents": [
        {
          "name": "CopyableIcon",
          "props": [
            {
              "name": "height",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "max",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "min",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "target",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "width",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "href",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "size",
              "type": "{ inherit: string; xs: string; sm: string; md: string; lg: string; xl: string; '2xl': string; }",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "CopyableLabel",
          "props": [
            {
              "name": "idle",
              "type": "string",
              "required": true,
              "description": "Label shown in the idle state"
            },
            {
              "name": "copied",
              "type": "string | undefined",
              "required": false,
              "description": "Label shown after a successful copy (default: \"Copied\")"
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "IconButton",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Copyable, CopyableIcon } from '@wallarm-org/design-system/Copyable';\nimport { Copy } from '@wallarm-org/design-system/icons';\n\nexport const IconButton = () => (\n  <Copyable text={SAMPLE_TEXT} tooltip>\n    <Button variant='ghost' color='neutral' size='small' aria-label='Copy'>\n      <CopyableIcon />\n    </Button>\n  </Copyable>\n);",
          "storyFile": "Copyable/stories/ClickToCopy.stories.tsx",
          "storyTitle": "Patterns/Click to Copy",
          "description": "A ghost icon-only button — the most compact form. The icon swaps from\n`Copy` to `Check` and the tooltip changes from \"Click to copy\" to \"Copied\"."
        },
        {
          "name": "LabelledButton",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Copyable, CopyableIcon, CopyableLabel } from '@wallarm-org/design-system/Copyable';\nimport { Copy } from '@wallarm-org/design-system/icons';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const LabelledButton = () => (\n  <VStack align='start' gap={16}>\n    <Copyable text={SAMPLE_TEXT} tooltip>\n      <Button variant='secondary' size='medium'>\n        <CopyableIcon /> <CopyableLabel idle='Copy code' copied='Copied' />\n      </Button>\n    </Copyable>\n    <Copyable text={SAMPLE_TEXT} tooltip>\n      <Button variant='ghost' color='neutral' size='medium'>\n        <CopyableIcon /> <CopyableLabel idle='Copy link' copied='Copied' />\n      </Button>\n    </Copyable>\n  </VStack>\n);",
          "storyFile": "Copyable/stories/ClickToCopy.stories.tsx",
          "storyTitle": "Patterns/Click to Copy",
          "description": "A labelled button using `CopyableLabel` for width-stable text swap.\nThe wrapper always occupies the width of the wider label, preventing\nlayout shift when the text toggles between \"Copy code\" and \"Copied\"."
        },
        {
          "name": "InInlineCodeSnippet",
          "code": "import { InlineCodeSnippet } from '@wallarm-org/design-system/CodeSnippet';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const InInlineCodeSnippet = () => (\n  <Text size='sm' color='secondary'>\n    To start creating an interface, run <InlineCodeSnippet code='npm install @wads/ui' size='md' />\n  </Text>\n);",
          "storyFile": "Copyable/stories/ClickToCopy.stories.tsx",
          "storyTitle": "Patterns/Click to Copy",
          "description": "`InlineCodeSnippet` has built-in click-to-copy with tooltip-only feedback\n(feedback rule 2 — clickable text without an icon)."
        },
        {
          "name": "InCodeSnippet",
          "code": "import { CodeSnippetActions, CodeSnippetAdapterProvider, CodeSnippetCode, CodeSnippetContent, CodeSnippetCopyButton, CodeSnippetRoot, plainAdapter } from '@wallarm-org/design-system/CodeSnippet';\n\nexport const InCodeSnippet = () => (\n  <CodeSnippetAdapterProvider adapter={plainAdapter}>\n    <CodeSnippetRoot code={SAMPLE_CODE} language='text'>\n      <CodeSnippetActions>\n        <CodeSnippetCopyButton />\n      </CodeSnippetActions>\n      <CodeSnippetContent>\n        <CodeSnippetCode />\n      </CodeSnippetContent>\n    </CodeSnippetRoot>\n  </CodeSnippetAdapterProvider>\n);",
          "storyFile": "Copyable/stories/ClickToCopy.stories.tsx",
          "storyTitle": "Patterns/Click to Copy",
          "description": "Inside a `CodeSnippet`, the `CodeSnippetCopyButton` uses the Copyable\npattern internally — icon-only, ghost/neutral, with tooltip feedback."
        },
        {
          "name": "ValueText",
          "code": "import { Attribute, AttributeLabel, AttributeValue } from '@wallarm-org/design-system/Attribute';\nimport { Copyable } from '@wallarm-org/design-system/Copyable';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const ValueText = () => {\n  const value = '192.168.1.1';\n\n  return (\n    <Attribute>\n      <AttributeLabel>IP Address</AttributeLabel>\n      <AttributeValue>\n        <Copyable text={value} tooltip>\n          <Text size='sm'>{value}</Text>\n        </Copyable>\n      </AttributeValue>\n    </Attribute>\n  );\n};",
          "storyFile": "Copyable/stories/ClickToCopy.stories.tsx",
          "storyTitle": "Patterns/Click to Copy",
          "description": "A plain text value wrapped in `Copyable` with tooltip feedback (feedback\nrule 2). This is the pattern for Attribute values or any non-interactive\ntext that should be copyable on click."
        },
        {
          "name": "DropdownMenuItemWithToast",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Copyable } from '@wallarm-org/design-system/Copyable';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuItemIcon, DropdownMenuItemText, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { Copy } from '@wallarm-org/design-system/icons';\nimport { toaster } from '@wallarm-org/design-system/Toast';\n\nexport const DropdownMenuItemWithToast = () => {\n  const handleCopied = () => {\n    toaster.create({ title: 'Copied', type: 'default', variant: 'simple' });\n  };\n\n  return (\n    <DropdownMenu>\n      <DropdownMenuTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Actions\n        </Button>\n      </DropdownMenuTrigger>\n      <DropdownMenuContent>\n        <Copyable text={SAMPLE_TEXT} onCopied={handleCopied}>\n          <DropdownMenuItem>\n            <DropdownMenuItemIcon>\n              <Copy />\n            </DropdownMenuItemIcon>\n            <DropdownMenuItemText>Copy value</DropdownMenuItemText>\n          </DropdownMenuItem>\n        </Copyable>\n        <DropdownMenuItem>Edit</DropdownMenuItem>\n        <DropdownMenuItem>Delete</DropdownMenuItem>\n      </DropdownMenuContent>\n    </DropdownMenu>\n  );\n};",
          "storyFile": "Copyable/stories/ClickToCopy.stories.tsx",
          "storyTitle": "Patterns/Click to Copy",
          "description": "When the element disappears after the action (like a dropdown menu item),\nuse toast feedback via `onCopied` (feedback rule 3). The `Copyable`\ncomponent does not bake in toast — the consumer fires it from the callback."
        },
        {
          "name": "SelectMenuItemWithToast",
          "code": "import { useState } from 'react';\nimport { createListCollection, Select, SelectButton, SelectContent, SelectOption, SelectOptionText, SelectPositioner } from '@wallarm-org/design-system/Select';\nimport { toaster } from '@wallarm-org/design-system/Toast';\n\nexport const SelectMenuItemWithToast = () => {\n  const endpoints = [\n    'GET /api/users',\n    'POST /api/users',\n    'GET /api/users/:id',\n    'DELETE /api/users/:id',\n  ];\n\n  const collection = createListCollection({\n    items: endpoints.map(e => ({ label: e, value: e })),\n  });\n\n  const [value, setValue] = useState<string[]>([]);\n\n  const handleValueChange = (details: { value: string[] }) => {\n    const selected = details.value[0];\n    if (selected) {\n      navigator.clipboard.writeText(selected);\n      toaster.create({ title: 'Copied', type: 'default', variant: 'simple' });\n    }\n    // Reset so the select doesn't hold a value — it acts as a copy trigger\n    setValue([]);\n  };\n\n  return (\n    <Select\n      collection={collection}\n      value={value}\n      onValueChange={handleValueChange}\n      positioning={{ placement: 'bottom-start' }}\n    >\n      <SelectButton placeholder='Select endpoint to copy' style={{ width: 280 }} />\n      <SelectPositioner>\n        <SelectContent>\n          {endpoints.map(ep => (\n            <SelectOption key={ep} item={{ label: ep, value: ep }}>\n              <SelectOptionText>{ep}</SelectOptionText>\n            </SelectOption>\n          ))}\n        </SelectContent>\n      </SelectPositioner>\n    </Select>\n  );\n};",
          "storyFile": "Copyable/stories/ClickToCopy.stories.tsx",
          "storyTitle": "Patterns/Click to Copy",
          "description": "A Select option that copies on select — same toast feedback pattern as the\ndropdown menu item (feedback rule 3)."
        },
        {
          "name": "AllRecipes",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { InlineCodeSnippet } from '@wallarm-org/design-system/CodeSnippet';\nimport { Copyable, CopyableIcon, CopyableLabel } from '@wallarm-org/design-system/Copyable';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuItemIcon, DropdownMenuItemText, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { Copy } from '@wallarm-org/design-system/icons';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\nimport { Text } from '@wallarm-org/design-system/Text';\nimport { toaster } from '@wallarm-org/design-system/Toast';\n\nexport const AllRecipes = () => {\n  const handleCopied = () => {\n    toaster.create({ title: 'Copied', type: 'default', variant: 'simple' });\n  };\n\n  return (\n    <VStack align='start' gap={32}>\n      <VStack align='start' gap={8}>\n        <Text size='xs' color='secondary' weight='medium'>\n          Icon button (swap)\n        </Text>\n        <Copyable text={SAMPLE_TEXT} tooltip>\n          <Button variant='ghost' color='neutral' size='small' aria-label='Copy'>\n            <CopyableIcon />\n          </Button>\n        </Copyable>\n      </VStack>\n\n      <VStack align='start' gap={8}>\n        <Text size='xs' color='secondary' weight='medium'>\n          Labelled button (swap)\n        </Text>\n        <HStack gap={12}>\n          <Copyable text={SAMPLE_TEXT} tooltip>\n            <Button variant='secondary' size='medium'>\n              <CopyableIcon /> <CopyableLabel idle='Copy code' copied='Copied' />\n            </Button>\n          </Copyable>\n        </HStack>\n      </VStack>\n\n      <VStack align='start' gap={8}>\n        <Text size='xs' color='secondary' weight='medium'>\n          Inline code snippet (tooltip only)\n        </Text>\n        <Text size='sm'>\n          Run <InlineCodeSnippet code='npm install' size='md' /> to install.\n        </Text>\n      </VStack>\n\n      <VStack align='start' gap={8}>\n        <Text size='xs' color='secondary' weight='medium'>\n          Dropdown menu item (toast)\n        </Text>\n        <DropdownMenu>\n          <DropdownMenuTrigger asChild>\n            <Button variant='outline' color='neutral' size='small'>\n              Actions\n            </Button>\n          </DropdownMenuTrigger>\n          <DropdownMenuContent>\n            <Copyable text={SAMPLE_TEXT} onCopied={handleCopied}>\n              <DropdownMenuItem>\n                <DropdownMenuItemIcon>\n                  <Copy />\n                </DropdownMenuItemIcon>\n                <DropdownMenuItemText>Copy value</DropdownMenuItemText>\n              </DropdownMenuItem>\n            </Copyable>\n          </DropdownMenuContent>\n        </DropdownMenu>\n      </VStack>\n    </VStack>\n  );\n};",
          "storyFile": "Copyable/stories/ClickToCopy.stories.tsx",
          "storyTitle": "Patterns/Click to Copy",
          "description": "All recipes side-by-side for comparison. The three feedback types —\nin-place swap, tooltip-only, and toast — are shown together."
        }
      ]
    },
    {
      "name": "Country",
      "description": "Shows one country from its ISO 3166-1 alpha-2 code — `CountryFlag`, `CountryName`, or both — and only ever a country: a flag names a place, not a language. Compose the name next to the flag wherever the reader could be in any doubt, and expect an unrecognised code to drop the flag and print the code itself.",
      "importPath": "@wallarm-org/design-system/Country",
      "props": [
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "size",
          "type": "{ small: string; medium: string; }",
          "required": false,
          "defaultValue": "small"
        },
        {
          "name": "asChild",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "code",
          "type": "\"AF\" | \"AX\" | \"AL\" | \"DZ\" | \"AS\" | \"AD\" | \"AO\" | \"AI\" | \"AG\" | \"AR\" | \"AM\" | \"AW\" | \"AU\" | \"AT\" | \"AZ\" | \"BS\" | \"BH\" | \"BD\" | \"BB\" | \"BY\" | \"BE\" | \"BZ\" | \"BJ\" | \"BM\" | \"BT\" | \"BO\" | \"BQ\" | \"BA\" | \"BW\" | \"BV\" | \"BR\" | \"IO\" | \"BN\" | \"BG\" | \"BF\" | \"BI\" | \"CV\" | \"KH\" | \"CM\" | \"CA\" | \"KY\" | \"CF\" | \"TD\" | \"CL\" | \"CN\" | \"CX\" | \"CC\" | \"CO\" | \"KM\" | \"CG\" | \"CD\" | \"CK\" | \"CR\" | \"CI\" | \"HR\" | \"CU\" | \"CW\" | \"CY\" | \"CZ\" | \"DK\" | \"DJ\" | \"DM\" | \"DO\" | \"DNO\" | \"EC\" | \"EG\" | \"SV\" | \"GQ\" | \"ER\" | \"EE\" | \"ET\" | \"FK\" | \"FO\" | \"FJ\" | \"FI\" | \"FR\" | \"GF\" | \"PF\" | \"TF\" | \"GA\" | \"GM\" | \"GE\" | \"DE\" | \"GH\" | \"GI\" | \"GR\" | \"GL\" | \"GD\" | \"GP\" | \"GU\" | \"GT\" | \"GG\" | \"GN\" | \"GW\" | \"GY\" | \"HT\" | \"HM\" | \"VA\" | \"HN\" | \"HK\" | \"HU\" | \"IS\" | \"IN\" | \"ID\" | \"IR\" | \"IQ\" | \"IE\" | \"IM\" | \"IL\" | \"IT\" | \"JM\" | \"JP\" | \"JE\" | \"JO\" | \"KZ\" | \"KE\" | \"KI\" | \"KP\" | \"KR\" | \"KW\" | \"KG\" | \"LA\" | \"LV\" | \"LB\" | \"LS\" | \"LR\" | \"LY\" | \"LI\" | \"LT\" | \"LHO\" | \"LU\" | \"MO\" | \"MK\" | \"MG\" | \"MW\" | \"MY\" | \"MV\" | \"ML\" | \"MT\" | \"MH\" | \"MQ\" | \"MR\" | \"MU\" | \"YT\" | \"MX\" | \"FM\" | \"MD\" | \"MC\" | \"MN\" | \"ME\" | \"MS\" | \"MA\" | \"MZ\" | \"MM\" | \"NA\" | \"NR\" | \"NP\" | \"NL\" | \"NC\" | \"NZ\" | \"NI\" | \"NE\" | \"NG\" | \"NU\" | \"NF\" | \"MP\" | \"NO\" | \"OM\" | \"PK\" | \"PW\" | \"PS\" | \"PA\" | \"PG\" | \"PY\" | \"PE\" | \"PH\" | \"PN\" | \"PL\" | \"PT\" | \"PR\" | \"QA\" | \"ROC\" | \"RE\" | \"RO\" | \"RU\" | \"RW\" | \"BL\" | \"SH\" | \"KN\" | \"LC\" | \"MF\" | \"PM\" | \"VC\" | \"WS\" | \"SM\" | \"ST\" | \"SA\" | \"SN\" | \"RS\" | \"SC\" | \"SL\" | \"SG\" | \"SX\" | \"SK\" | \"SI\" | \"SB\" | \"SO\" | \"ZA\" | \"GS\" | \"SS\" | \"ES\" | \"LK\" | \"SD\" | \"SR\" | \"SJ\" | \"SZ\" | \"SE\" | \"CH\" | \"SY\" | \"TW\" | \"TJ\" | \"TZ\" | \"TH\" | \"TL\" | \"TG\" | \"TK\" | \"TO\" | \"TT\" | \"TN\" | \"TR\" | \"TM\" | \"TC\" | \"TV\" | \"UG\" | \"UA\" | \"AE\" | \"GB\" | \"US\" | \"UY\" | \"UZ\" | \"VU\" | \"VE\" | \"VN\" | \"VG\" | \"VI\" | \"WF\" | \"EH\" | \"YE\" | \"ZM\" | \"ZW\"",
          "required": true
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "size",
          "options": [
            "small",
            "medium"
          ]
        }
      ],
      "subComponents": [
        {
          "name": "CountryFlag",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "height",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "loading",
              "type": "\"eager\" | \"lazy\" | undefined",
              "required": false
            },
            {
              "name": "width",
              "type": "string | number | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "CountryName",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Country, CountryFlag, CountryName } from '@wallarm-org/design-system/Country';\n\nexport const Basic = args => (\n  <Country code={args.code} size={args.size}>\n    <CountryFlag />\n    <CountryName />\n  </Country>\n);",
          "storyFile": "Country/Country.stories.tsx",
          "storyTitle": "Data Display/Country",
          "description": "Flag then name — the composition to reach for by default. `code` sits on the root and\nreaches both children through context."
        },
        {
          "name": "Sizes",
          "code": "import { Country, CountryFlag, CountryName } from '@wallarm-org/design-system/Country';\nimport { HStack } from '@wallarm-org/design-system/Stack';\n\nexport const Sizes = () => (\n  <HStack align='center' gap={16}>\n    <Country code='US' size='small'>\n      <CountryFlag />\n      <CountryName />\n    </Country>\n    <Country code='US' size='medium'>\n      <CountryFlag />\n      <CountryName />\n    </Country>\n  </HStack>\n);",
          "storyFile": "Country/Country.stories.tsx",
          "storyTitle": "Data Display/Country",
          "description": "`small` is the default: a 16px flag against `xs` type, where `medium` takes both a\nstep up to 20px and `sm`."
        },
        {
          "name": "FlagOnly",
          "code": "import { Country, CountryFlag } from '@wallarm-org/design-system/Country';\nimport { HStack } from '@wallarm-org/design-system/Stack';\n\nexport const FlagOnly = () => (\n  <HStack gap={8}>\n    <Country code='US'>\n      <CountryFlag />\n    </Country>\n    <Country code='GB'>\n      <CountryFlag />\n    </Country>\n    <Country code='DE'>\n      <CountryFlag />\n    </Country>\n    <Country code='FR'>\n      <CountryFlag />\n    </Country>\n    <Country code='JP'>\n      <CountryFlag />\n    </Country>\n  </HStack>\n);",
          "storyFile": "Country/Country.stories.tsx",
          "storyTitle": "Data Display/Country",
          "description": "The flag on its own, for a cell whose column heading already says these are countries —\nanywhere else, the reader is guessing."
        },
        {
          "name": "NameOnly",
          "code": "import { Country, CountryName } from '@wallarm-org/design-system/Country';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const NameOnly = () => (\n  <VStack gap={4}>\n    <Country code='US'>\n      <CountryName />\n    </Country>\n    <Country code='GB'>\n      <CountryName />\n    </Country>\n    <Country code='DE'>\n      <CountryName />\n    </Country>\n  </VStack>\n);",
          "storyFile": "Country/Country.stories.tsx",
          "storyTitle": "Data Display/Country",
          "description": "The name on its own, for a list being read rather than scanned, where a column of flags\nwould only add colour."
        },
        {
          "name": "Examples",
          "code": "import { Country, CountryFlag, CountryName } from '@wallarm-org/design-system/Country';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Examples = () => (\n  <VStack gap={8}>\n    <Country code='US'>\n      <CountryFlag />\n      <CountryName />\n    </Country>\n    <Country code='GB'>\n      <CountryFlag />\n      <CountryName />\n    </Country>\n    <Country code='DE'>\n      <CountryFlag />\n      <CountryName />\n    </Country>\n    <Country code='FR'>\n      <CountryFlag />\n      <CountryName />\n    </Country>\n    <Country code='JP'>\n      <CountryFlag />\n      <CountryName />\n    </Country>\n    <Country code='RU'>\n      <CountryFlag />\n      <CountryName />\n    </Country>\n    <Country code='CN'>\n      <CountryFlag />\n      <CountryName />\n    </Country>\n    <Country code='BR'>\n      <CountryFlag />\n      <CountryName />\n    </Country>\n    <Country code='AU'>\n      <CountryFlag />\n      <CountryName />\n    </Country>\n    <Country code='CA'>\n      <CountryFlag />\n      <CountryName />\n    </Country>\n  </VStack>\n);",
          "storyFile": "Country/Country.stories.tsx",
          "storyTitle": "Data Display/Country",
          "description": "Ten countries together, which is really a check on consistency: every flag is cropped to\nthe same circle, so wide and tall designs still line up down the column."
        }
      ]
    },
    {
      "name": "DateFormatProvider",
      "description": "Application-level provider for temporal display format.\n\nMount once near the root — DateInput, DateRangeInput, TimeInput, and\nCalendar all pick up the chosen `order` and `hourCycle` via\n`useDateFormat`. If no provider is mounted, DS defaults to `day-first`\norder and locale-driven hour cycle.",
      "importPath": "@wallarm-org/design-system/DateFormatProvider",
      "props": [
        {
          "name": "order",
          "type": "DateOrder",
          "required": true,
          "description": "Order in which date segments render across every DS temporal input and\nthe calendar. Set once at the app root."
        },
        {
          "name": "hourCycle",
          "type": "12 | 24 | undefined",
          "required": false,
          "description": "Hour cycle applied to every DS temporal input with time segments and\nevery time dropdown. `12` (AM/PM) or `24`. When omitted, the browser\nlocale decides. Can be overridden per-input via the `hourCycle` prop."
        }
      ],
      "variants": [],
      "subComponents": [],
      "examples": []
    },
    {
      "name": "DateInput",
      "description": "A date typed segment by segment, for a date the reader knows — pair it with `Calendar` when they need to see the month to choose. It takes React Aria date objects rather than a JavaScript `Date`, and segment order and hour cycle come from `DateFormatProvider` app-wide rather than per input.",
      "importPath": "@wallarm-org/design-system/DateInput",
      "props": [
        {
          "name": "showIcon",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether to show the leading icon. Default: true.",
          "defaultValue": "true"
        },
        {
          "name": "error",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the input has an error state. Sets `aria-invalid` and error styling.",
          "defaultValue": "false"
        },
        {
          "name": "disabled",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the input is disabled. Prevents user interaction.",
          "defaultValue": "false"
        },
        {
          "name": "readOnly",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the input is read-only. Segments are focusable but not editable.",
          "defaultValue": "false"
        },
        {
          "name": "placeholder",
          "type": "string | undefined",
          "required": false,
          "description": "Placeholder shown when no value is selected."
        },
        {
          "name": "size",
          "type": "TemporalInputSize | undefined",
          "required": false,
          "description": "Visual size. Default: 'default' (36px).",
          "defaultValue": "default"
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "value",
          "type": "DateValue | null | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "DateValue | null | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "complex",
          "required": false
        },
        {
          "name": "minValue",
          "type": "DateValue | undefined",
          "required": false
        },
        {
          "name": "maxValue",
          "type": "DateValue | undefined",
          "required": false
        },
        {
          "name": "placeholderValue",
          "type": "DateValue | undefined",
          "required": false
        },
        {
          "name": "name",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "isRequired",
          "type": "boolean | undefined",
          "required": false,
          "description": "Marks the field as required in assistive tech and HTML form validation."
        },
        {
          "name": "granularity",
          "type": "\"day\" | undefined",
          "required": false,
          "defaultValue": "day"
        },
        {
          "name": "showTimeDropdown",
          "type": "undefined",
          "required": false
        },
        {
          "name": "timeStep",
          "type": "undefined",
          "required": false,
          "defaultValue": "30"
        }
      ],
      "variants": [],
      "subComponents": [],
      "examples": [
        {
          "name": "Basic",
          "code": "import { DateInput } from '@wallarm-org/design-system/DateInput';\n\nexport const Basic = () => {\n  return <DateInput />;\n};",
          "storyFile": "DateInput/DateInput.stories.tsx",
          "storyTitle": "Inputs Date/DateInput",
          "description": "The bare field. Each segment is its own target: arrows step a segment, typing fills it and\nmoves on, so the whole date is reachable without a pointer."
        },
        {
          "name": "WithIcon",
          "code": "import { DateInput } from '@wallarm-org/design-system/DateInput';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const WithIcon = () => (\n  <HStack gap={24}>\n    <VStack gap={12}>\n      <DateInput showIcon={false} />\n    </VStack>\n    <VStack gap={12}>\n      <DateInput />\n    </VStack>\n  </HStack>\n);",
          "storyFile": "DateInput/DateInput.stories.tsx",
          "storyTitle": "Inputs Date/DateInput",
          "description": "The calendar icon is decoration here, not a trigger — this field opens nothing. Reach for\n`Calendar` when the icon should open a picker."
        },
        {
          "name": "States",
          "code": "import { DateInput } from '@wallarm-org/design-system/DateInput';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const States = () => (\n  <HStack gap={24}>\n    <VStack gap={12}>\n      <DateInput />\n      <DateInput defaultValue={sampleDate} />\n    </VStack>\n    <VStack gap={12}>\n      <DateInput disabled />\n      <DateInput disabled defaultValue={sampleDate} />\n    </VStack>\n    <VStack gap={12}>\n      <DateInput error />\n      <DateInput error defaultValue={sampleDate} />\n    </VStack>\n  </HStack>\n);",
          "storyFile": "DateInput/DateInput.stories.tsx",
          "storyTitle": "Inputs Date/DateInput",
          "description": "Default, disabled and error side by side. `error` reddens the border and marks the field\ninvalid; the reason belongs in `FieldError`."
        },
        {
          "name": "Sizes",
          "code": "import { DateInput } from '@wallarm-org/design-system/DateInput';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Sizes = () => (\n  <HStack gap={24}>\n    <VStack gap={16}>\n      <VStack gap={4}>\n        <DateInput size='default' />\n      </VStack>\n      <VStack gap={4}>\n        <DateInput size='medium' />\n      </VStack>\n      <VStack gap={4}>\n        <DateInput size='small' />\n      </VStack>\n    </VStack>\n    <VStack gap={16}>\n      <VStack gap={4}>\n        <DateInput size='default' defaultValue={sampleDate} />\n      </VStack>\n      <VStack gap={4}>\n        <DateInput size='medium' defaultValue={sampleDate} />\n      </VStack>\n      <VStack gap={4}>\n        <DateInput size='small' defaultValue={sampleDate} />\n      </VStack>\n    </VStack>\n  </HStack>\n);",
          "storyFile": "DateInput/DateInput.stories.tsx",
          "storyTitle": "Inputs Date/DateInput",
          "description": "The same 36 / 32 / 24px scale as the other fields, so a date sits in a row of inputs without\nbreaking the line."
        },
        {
          "name": "Filled",
          "code": "import { DateFormatProvider } from '@wallarm-org/design-system/DateFormatProvider';\nimport { DateInput } from '@wallarm-org/design-system/DateInput';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Filled = () => (\n  <VStack gap={16}>\n    <VStack gap={4}>\n      <DateInput defaultValue={sampleDate} />\n    </VStack>\n    <DateFormatProvider order='day-first' hourCycle={24}>\n      <VStack gap={4}>\n        <DateInput granularity='minute' defaultValue={sampleDateTime} />\n      </VStack>\n    </DateFormatProvider>\n    <DateFormatProvider order='day-first' hourCycle={12}>\n      <VStack gap={4}>\n        <DateInput granularity='minute' defaultValue={sampleDateTime} />\n      </VStack>\n    </DateFormatProvider>\n    <VStack gap={4}>\n      <DateInput showIcon={false} defaultValue={sampleDate} />\n    </VStack>\n  </VStack>\n);",
          "storyFile": "DateInput/DateInput.stories.tsx",
          "storyTitle": "Inputs Date/DateInput",
          "description": "A field holding a value, next to one holding a placeholder. The clear affordance only appears\nonce there is something to clear."
        },
        {
          "name": "Granularity",
          "code": "import { DateFormatProvider } from '@wallarm-org/design-system/DateFormatProvider';\nimport { DateInput } from '@wallarm-org/design-system/DateInput';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Granularity = () => (\n  <HStack gap={24}>\n    <DateFormatProvider order='day-first' hourCycle={12}>\n      <VStack gap={12}>\n        <DateInput placeholder='day' granularity='day' />\n        <DateInput placeholder='hour' granularity='hour' />\n        <DateInput placeholder='minute' granularity='minute' />\n        <DateInput placeholder='second' granularity='second' />\n      </VStack>\n    </DateFormatProvider>\n    <DateFormatProvider order='day-first' hourCycle={24}>\n      <VStack gap={12}>\n        <DateInput placeholder='day' granularity='day' />\n        <DateInput placeholder='hour' granularity='hour' />\n        <DateInput placeholder='minute' granularity='minute' />\n        <DateInput placeholder='second' granularity='second' />\n      </VStack>\n    </DateFormatProvider>\n  </HStack>\n);",
          "storyFile": "DateInput/DateInput.stories.tsx",
          "storyTitle": "Inputs Date/DateInput",
          "description": "`granularity` decides how many segments there are, from a day down to a second. Ask for the\nsmallest unit you will actually use — every extra segment is another thing to tab through."
        },
        {
          "name": "WithFieldComponents",
          "code": "import { useState } from 'react';\nimport { CalendarDate, getLocalTimeZone, today } from '@wallarm-org/design-system';\nimport { DateInput } from '@wallarm-org/design-system/DateInput';\nimport { Field, FieldAction, FieldDescription, FieldError, FieldLabel } from '@wallarm-org/design-system/Field';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const WithFieldComponents = () => {\n  // With `granularity='day'` the runtime value is always a CalendarDate —\n  // onChange gets cast on the way in so app state stays narrowly typed.\n  const [value, setValue] = useState<CalendarDate | null>(null);\n  const [errorValue, setErrorValue] = useState<CalendarDate | null>(today(getLocalTimeZone()));\n\n  const handleSetNow = () => {\n    setValue(today(getLocalTimeZone()));\n  };\n\n  return (\n    <VStack gap={24}>\n      <Field>\n        <FieldLabel>\n          Label\n          <FieldAction onClick={handleSetNow}>Set now</FieldAction>\n        </FieldLabel>\n        <DateInput\n          placeholder='Select a date'\n          value={value}\n          onChange={v => setValue(v as CalendarDate | null)}\n        />\n        <FieldDescription>This is an input description.</FieldDescription>\n      </Field>\n\n      <Field invalid>\n        <FieldLabel>Label</FieldLabel>\n        <DateInput\n          error\n          value={errorValue}\n          onChange={v => setErrorValue(v as CalendarDate | null)}\n        />\n        <FieldError>An error message.</FieldError>\n      </Field>\n    </VStack>\n  );\n};",
          "storyFile": "DateInput/DateInput.stories.tsx",
          "storyTitle": "Inputs Date/DateInput",
          "description": "Inside `Field`, which supplies the label and description. The field does not read that\ncontext, so check the labelling rather than assuming it wired itself."
        },
        {
          "name": "DateOrderComparison",
          "code": "import { DateFormatProvider } from '@wallarm-org/design-system/DateFormatProvider';\nimport { DateInput } from '@wallarm-org/design-system/DateInput';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const DateOrderComparison = () => (\n  <HStack gap={32}>\n    <DateFormatProvider order='day-first' hourCycle={24}>\n      <VStack gap={12}>\n        <DateInput />\n        <DateInput defaultValue={sampleDate} />\n        <DateInput granularity='minute' defaultValue={sampleDateTime} />\n      </VStack>\n    </DateFormatProvider>\n    <DateFormatProvider order='month-first' hourCycle={24}>\n      <VStack gap={12}>\n        <DateInput />\n        <DateInput defaultValue={sampleDate} />\n        <DateInput granularity='minute' defaultValue={sampleDateTime} />\n      </VStack>\n    </DateFormatProvider>\n  </HStack>\n);",
          "storyFile": "DateInput/DateInput.stories.tsx",
          "storyTitle": "Inputs Date/DateInput",
          "description": "Day-first against month-first, each in its own scoped provider. This is an app-wide decision,\nnot a per-field one — the comparison exists to show what the provider changes."
        },
        {
          "name": "HourCycleByContext",
          "code": "import { DateFormatProvider } from '@wallarm-org/design-system/DateFormatProvider';\nimport { DateInput } from '@wallarm-org/design-system/DateInput';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const HourCycleByContext = () => (\n  <HStack gap={32}>\n    <DateFormatProvider order='day-first' hourCycle={12}>\n      <VStack gap={12}>\n        <DateInput granularity='minute' defaultValue={sampleDateTime} />\n        <DateInput granularity='second' defaultValue={sampleDateTime} />\n      </VStack>\n    </DateFormatProvider>\n    <DateFormatProvider order='day-first' hourCycle={24}>\n      <VStack gap={12}>\n        <DateInput granularity='minute' defaultValue={sampleDateTime} />\n        <DateInput granularity='second' defaultValue={sampleDateTime} />\n      </VStack>\n    </DateFormatProvider>\n  </HStack>\n);",
          "storyFile": "DateInput/DateInput.stories.tsx",
          "storyTitle": "Inputs Date/DateInput",
          "description": "12-hour against 24-hour, again from the provider. There is no per-input escape hatch, which\nis deliberate: a form mixing both would be unreadable."
        },
        {
          "name": "ReadOnly",
          "code": "import { DateInput } from '@wallarm-org/design-system/DateInput';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const ReadOnly = () => (\n  <HStack gap={24}>\n    <VStack gap={12}>\n      <DateInput readOnly defaultValue={sampleDate} data-testid='date-input-read-only' />\n    </VStack>\n    <VStack gap={12}>\n      <DateInput\n        readOnly\n        granularity='minute'\n        defaultValue={sampleDateTime}\n        data-testid='date-input-read-only-datetime'\n      />\n    </VStack>\n  </HStack>\n);",
          "storyFile": "DateInput/DateInput.stories.tsx",
          "storyTitle": "Inputs Date/DateInput",
          "description": "`readOnly` keeps the value legible and removes every edit affordance. Different from\ndisabled, which says the control exists but is unavailable."
        }
      ]
    },
    {
      "name": "DateRangeInput",
      "description": "Two dates in one field, for a period the reader knows — pair it with `Calendar` in range mode when they need to see the months to choose. Same rules as `DateInput`: React Aria date objects, and order and hour cycle from `DateFormatProvider` rather than per input.",
      "importPath": "@wallarm-org/design-system/DateRangeInput",
      "props": [
        {
          "name": "showIcon",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether to show the leading icon. Default: true."
        },
        {
          "name": "error",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the input has an error state. Sets `aria-invalid` and error styling."
        },
        {
          "name": "disabled",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the input is disabled. Prevents user interaction."
        },
        {
          "name": "readOnly",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the input is read-only. Segments are focusable but not editable."
        },
        {
          "name": "placeholder",
          "type": "string | undefined",
          "required": false,
          "description": "Placeholder shown when no value is selected."
        },
        {
          "name": "size",
          "type": "TemporalInputSize | undefined",
          "required": false,
          "description": "Visual size. Default: 'default' (36px)."
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "value",
          "type": "complex",
          "required": false,
          "description": "Controlled value — range with start and end dates."
        },
        {
          "name": "defaultValue",
          "type": "complex",
          "required": false,
          "description": "Default value for uncontrolled mode."
        },
        {
          "name": "onChange",
          "type": "complex",
          "required": false,
          "description": "Callback fired when the range value changes. Receives `null` on clear."
        },
        {
          "name": "granularity",
          "type": "\"day\" | undefined",
          "required": false
        },
        {
          "name": "showTimeDropdown",
          "type": "undefined",
          "required": false
        },
        {
          "name": "timeStep",
          "type": "undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [
        {
          "name": "DateRangeEndValue",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "DateRangeStartValue",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Basic",
          "code": "import { DateRangeInput, type DateRangeInputProps } from '@wallarm-org/design-system/DateRangeInput';\n\nexport const Basic = args => {\n  return <DateRangeInput {...(args as DateRangeInputProps)} />;\n};",
          "storyFile": "DateRangeInput/DateRangeInput.stories.tsx",
          "storyTitle": "Inputs Date/DateRangeInput",
          "description": "Start and end in one control, each segmented. The end cannot precede the start, so the field\ncannot produce a range the system would reject."
        },
        {
          "name": "WithIcon",
          "code": "import { DateRangeInput } from '@wallarm-org/design-system/DateRangeInput';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const WithIcon = () => (\n  <HStack gap={24}>\n    <VStack gap={12}>\n      <DateRangeInput showIcon={false} defaultValue={defaultValue} />\n    </VStack>\n    <VStack gap={12}>\n      <DateRangeInput defaultValue={defaultValue} />\n    </VStack>\n  </HStack>\n);",
          "storyFile": "DateRangeInput/DateRangeInput.stories.tsx",
          "storyTitle": "Inputs Date/DateRangeInput",
          "description": "Decoration again, not a trigger — reach for `Calendar` when the icon should open a picker."
        },
        {
          "name": "States",
          "code": "import { DateRangeInput } from '@wallarm-org/design-system/DateRangeInput';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const States = () => (\n  <HStack gap={24}>\n    <VStack gap={12}>\n      <DateRangeInput />\n      <DateRangeInput defaultValue={sampleRange} />\n    </VStack>\n    <VStack gap={12}>\n      <DateRangeInput disabled />\n      <DateRangeInput disabled defaultValue={sampleRange} />\n    </VStack>\n    <VStack gap={12}>\n      <DateRangeInput error />\n      <DateRangeInput error defaultValue={sampleRange} />\n    </VStack>\n  </HStack>\n);",
          "storyFile": "DateRangeInput/DateRangeInput.stories.tsx",
          "storyTitle": "Inputs Date/DateRangeInput",
          "description": "Default, disabled and error. The error applies to the range as a whole, since a start without\nan end is not yet an answer."
        },
        {
          "name": "Sizes",
          "code": "import { DateRangeInput } from '@wallarm-org/design-system/DateRangeInput';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Sizes = () => (\n  <HStack gap={24}>\n    <VStack gap={16}>\n      <VStack gap={4}>\n        <DateRangeInput size='default' />\n      </VStack>\n      <VStack gap={4}>\n        <DateRangeInput size='medium' />\n      </VStack>\n      <VStack gap={4}>\n        <DateRangeInput size='small' />\n      </VStack>\n    </VStack>\n    <VStack gap={16}>\n      <VStack gap={4}>\n        <DateRangeInput size='default' defaultValue={sampleRange} />\n      </VStack>\n      <VStack gap={4}>\n        <DateRangeInput size='medium' defaultValue={sampleRange} />\n      </VStack>\n      <VStack gap={4}>\n        <DateRangeInput size='small' defaultValue={sampleRange} />\n      </VStack>\n    </VStack>\n  </HStack>\n);",
          "storyFile": "DateRangeInput/DateRangeInput.stories.tsx",
          "storyTitle": "Inputs Date/DateRangeInput",
          "description": "The shared height scale. A range is wider than a single date, so check it against the column\nit lives in."
        },
        {
          "name": "Filled",
          "code": "import { DateFormatProvider } from '@wallarm-org/design-system/DateFormatProvider';\nimport { DateRangeInput } from '@wallarm-org/design-system/DateRangeInput';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Filled = () => (\n  <VStack gap={16}>\n    <VStack gap={4}>\n      <DateRangeInput defaultValue={sampleRange} data-testid='date-range-input-filled' />\n    </VStack>\n    <DateFormatProvider order='day-first' hourCycle={24}>\n      <VStack gap={4}>\n        <DateRangeInput granularity='minute' defaultValue={sampleRangeDateTime} />\n      </VStack>\n    </DateFormatProvider>\n    <VStack gap={4}>\n      <DateRangeInput showIcon={false} defaultValue={sampleRange} />\n    </VStack>\n  </VStack>\n);",
          "storyFile": "DateRangeInput/DateRangeInput.stories.tsx",
          "storyTitle": "Inputs Date/DateRangeInput",
          "description": "A complete range beside an empty one, which is the clearest way to see how much width the\nfilled state needs."
        },
        {
          "name": "Granularity",
          "code": "import { DateFormatProvider } from '@wallarm-org/design-system/DateFormatProvider';\nimport { DateRangeInput } from '@wallarm-org/design-system/DateRangeInput';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Granularity = () => (\n  <HStack gap={24}>\n    <DateFormatProvider order='day-first' hourCycle={12}>\n      <VStack gap={12}>\n        <DateRangeInput placeholder='day' granularity='day' />\n        <DateRangeInput placeholder='hour' granularity='hour' />\n        <DateRangeInput placeholder='minute' granularity='minute' />\n        <DateRangeInput placeholder='second' granularity='second' />\n      </VStack>\n    </DateFormatProvider>\n    <DateFormatProvider order='day-first' hourCycle={24}>\n      <VStack gap={12}>\n        <DateRangeInput placeholder='day' granularity='day' />\n        <DateRangeInput placeholder='hour' granularity='hour' />\n        <DateRangeInput placeholder='minute' granularity='minute' />\n        <DateRangeInput placeholder='second' granularity='second' />\n      </VStack>\n    </DateFormatProvider>\n  </HStack>\n);",
          "storyFile": "DateRangeInput/DateRangeInput.stories.tsx",
          "storyTitle": "Inputs Date/DateRangeInput",
          "description": "Both ends share one granularity. Add time only when the period genuinely turns on it — a\nreport covering part of a day rather than whole days."
        },
        {
          "name": "DateOrderComparison",
          "code": "import { DateFormatProvider } from '@wallarm-org/design-system/DateFormatProvider';\nimport { DateRangeInput } from '@wallarm-org/design-system/DateRangeInput';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const DateOrderComparison = () => (\n  <HStack gap={32}>\n    <DateFormatProvider order='day-first'>\n      <VStack gap={12}>\n        <DateRangeInput />\n        <DateRangeInput defaultValue={sampleRange} />\n        <DateRangeInput granularity='minute' defaultValue={sampleRangeDateTime} />\n      </VStack>\n    </DateFormatProvider>\n    <DateFormatProvider order='month-first'>\n      <VStack gap={12}>\n        <DateRangeInput />\n        <DateRangeInput defaultValue={sampleRange} />\n        <DateRangeInput granularity='minute' defaultValue={sampleRangeDateTime} />\n      </VStack>\n    </DateFormatProvider>\n  </HStack>\n);",
          "storyFile": "DateRangeInput/DateRangeInput.stories.tsx",
          "storyTitle": "Inputs Date/DateRangeInput",
          "description": "Day-first against month-first from the provider, doubly worth seeing here because an\nambiguous range is twice as easy to misread."
        },
        {
          "name": "HourCycleByContext",
          "code": "import { DateFormatProvider } from '@wallarm-org/design-system/DateFormatProvider';\nimport { DateRangeInput } from '@wallarm-org/design-system/DateRangeInput';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const HourCycleByContext = () => (\n  <HStack gap={32}>\n    <DateFormatProvider order='day-first' hourCycle={12}>\n      <VStack gap={12}>\n        <DateRangeInput granularity='minute' defaultValue={sampleRangeDateTime} />\n      </VStack>\n    </DateFormatProvider>\n    <DateFormatProvider order='day-first' hourCycle={24}>\n      <VStack gap={12}>\n        <DateRangeInput granularity='minute' defaultValue={sampleRangeDateTime} />\n      </VStack>\n    </DateFormatProvider>\n  </HStack>\n);",
          "storyFile": "DateRangeInput/DateRangeInput.stories.tsx",
          "storyTitle": "Inputs Date/DateRangeInput",
          "description": "12-hour against 24-hour from the provider, with no per-input override."
        },
        {
          "name": "ReadOnly",
          "code": "import { DateRangeInput } from '@wallarm-org/design-system/DateRangeInput';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const ReadOnly = () => (\n  <HStack gap={24}>\n    <VStack gap={12}>\n      <DateRangeInput\n        readOnly\n        defaultValue={sampleRange}\n        data-testid='date-range-input-read-only'\n      />\n    </VStack>\n    <VStack gap={12}>\n      <DateRangeInput\n        readOnly\n        granularity='minute'\n        defaultValue={sampleRangeDateTime}\n        data-testid='date-range-input-read-only-datetime'\n      />\n    </VStack>\n  </HStack>\n);",
          "storyFile": "DateRangeInput/DateRangeInput.stories.tsx",
          "storyTitle": "Inputs Date/DateRangeInput",
          "description": "Both ends legible, no edit affordances."
        }
      ]
    },
    {
      "name": "Dialog",
      "description": "A panel the reader has to resolve before carrying on — reach for `Drawer` when they should be able to keep it open and keep working, and `Popover` when the content is a detail rather than a task. It is `Drawer` with `kind='dialog'`, which shares the panel but keeps the two families' nesting separate: a dialog only steps back for another dialog.",
      "importPath": "@wallarm-org/design-system/Dialog",
      "props": [
        {
          "name": "kind",
          "type": "DrawerKind | undefined",
          "required": false,
          "description": "Which overlay family this root belongs to. Drives the same-kind nesting\ncounter behind the pushed-back animation: a Drawer only pushes back for\na nested Drawer, a Dialog only for a nested Dialog. Set to 'dialog' by\nthe Dialog component — consumers should not need to touch this."
        },
        {
          "name": "open",
          "type": "boolean | undefined",
          "required": false,
          "description": "Controlled open state"
        },
        {
          "name": "onOpenChange",
          "type": "((open: boolean) => void) | undefined",
          "required": false,
          "description": "Controlled open change handler"
        },
        {
          "name": "closeOnEscape",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether ESC key closes the drawer (default: true)"
        },
        {
          "name": "closeOnOutsideClick",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether clicking outside closes the drawer (default: true)"
        },
        {
          "name": "overlay",
          "type": "boolean | undefined",
          "required": false,
          "description": "Overlay visibility (default: true)"
        },
        {
          "name": "modal",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the drawer is modal — blocks interaction with the rest of the page (default: true)"
        },
        {
          "name": "width",
          "type": "string | number | undefined",
          "required": false,
          "description": "Width - number for pixels, string for percentage (e.g., \"50%\")",
          "defaultValue": "DIALOG_SIZES.medium"
        },
        {
          "name": "minWidth",
          "type": "number | undefined",
          "required": false,
          "description": "Minimum width in pixels",
          "defaultValue": "DIALOG_WIDTH_CONSTRAINTS.min"
        },
        {
          "name": "maxWidth",
          "type": "number | undefined",
          "required": false,
          "description": "Maximum width in pixels",
          "defaultValue": "DIALOG_WIDTH_CONSTRAINTS.max"
        },
        {
          "name": "onInteractOutside",
          "type": "complex",
          "required": false,
          "description": "Fired when the user interacts outside the drawer (e.g. clicks the backdrop)."
        },
        {
          "name": "onEscapeKeyDown",
          "type": "((event: KeyboardEvent) => void) | undefined",
          "required": false,
          "description": "Fired when the user presses the Escape key while the drawer is open."
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Dialog, DialogBody, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@wallarm-org/design-system/Dialog';\n\nexport const Basic = () => {\n  return (\n    <Dialog data-testid='dialog'>\n      <DialogTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Open Dialog\n        </Button>\n      </DialogTrigger>\n\n      <DialogContent>\n        <DialogHeader>\n          <DialogTitle>Dialog Title</DialogTitle>\n        </DialogHeader>\n\n        <DialogBody>\n          <ContentPlaceholder />\n        </DialogBody>\n      </DialogContent>\n    </Dialog>\n  );\n};",
          "storyFile": "Dialog/Dialog.stories.tsx",
          "storyTitle": "Overlay/Dialog",
          "description": "The minimum: trigger, content, and a title. Every dialog needs a title — it is what a screen\nreader announces on open."
        },
        {
          "name": "WithFooter",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Dialog, DialogBody, DialogContent, DialogFooter, DialogFooterControls, DialogHeader, DialogTitle, DialogTrigger } from '@wallarm-org/design-system/Dialog';\n\nexport const WithFooter = () => {\n  return (\n    <Dialog>\n      <DialogTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Open Dialog\n        </Button>\n      </DialogTrigger>\n\n      <DialogContent>\n        <DialogHeader>\n          <DialogTitle>Dialog's title</DialogTitle>\n        </DialogHeader>\n\n        <DialogBody>\n          <ContentPlaceholder />\n        </DialogBody>\n\n        <DialogFooter>\n          <DialogFooterControls>\n            <Button variant='ghost' color='neutral' size='large'>\n              Button\n            </Button>\n            <Button variant='primary' color='brand' size='large'>\n              Button\n            </Button>\n          </DialogFooterControls>\n        </DialogFooter>\n      </DialogContent>\n    </Dialog>\n  );\n};",
          "storyFile": "Dialog/Dialog.stories.tsx",
          "storyTitle": "Overlay/Dialog",
          "description": "`DialogFooter` holds the decision. Put the confirming action last, since that is where the\neye finishes."
        },
        {
          "name": "WithDescription",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Dialog, DialogBody, DialogContent, DialogDescription, DialogFooter, DialogFooterControls, DialogHeader, DialogTitle, DialogTrigger } from '@wallarm-org/design-system/Dialog';\n\nexport const WithDescription = () => {\n  return (\n    <Dialog>\n      <DialogTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Open Dialog\n        </Button>\n      </DialogTrigger>\n\n      <DialogContent>\n        <DialogHeader>\n          <DialogTitle>Dialog's title</DialogTitle>\n          <DialogDescription>Description</DialogDescription>\n        </DialogHeader>\n\n        <DialogBody>\n          <ContentPlaceholder />\n        </DialogBody>\n\n        <DialogFooter>\n          <DialogFooterControls>\n            <Button variant='ghost' color='neutral' size='large'>\n              Button\n            </Button>\n            <Button variant='primary' color='brand' size='large'>\n              Button\n            </Button>\n          </DialogFooterControls>\n        </DialogFooter>\n      </DialogContent>\n    </Dialog>\n  );\n};",
          "storyFile": "Dialog/Dialog.stories.tsx",
          "storyTitle": "Overlay/Dialog",
          "description": "`DialogDescription` states the consequence, which is what turns a confirmation from a speed\nbump into a decision. `DialogHeader` finds the title and description among its children and\nstacks them, so the close button stays right-aligned however many it gets."
        },
        {
          "name": "WithFooterLeftActions",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Dialog, DialogBody, DialogClose, DialogContent, DialogFooter, DialogFooterControls, DialogHeader, DialogTitle, DialogTrigger } from '@wallarm-org/design-system/Dialog';\nimport { Switch, SwitchControl, SwitchLabel } from '@wallarm-org/design-system/Switch';\n\nexport const WithFooterLeftActions = () => (\n  <Dialog>\n    <DialogTrigger asChild>\n      <Button variant='outline' color='neutral'>\n        Open with Footer Actions\n      </Button>\n    </DialogTrigger>\n    <DialogContent>\n      <DialogHeader>\n        <DialogTitle>Footer with Left Actions</DialogTitle>\n      </DialogHeader>\n\n      <DialogBody>\n        <ContentPlaceholder />\n      </DialogBody>\n\n      <DialogFooter>\n        <DialogFooterControls placement='left'>\n          <Switch>\n            <SwitchControl />\n            <SwitchLabel>Remember choice</SwitchLabel>\n          </Switch>\n        </DialogFooterControls>\n\n        <DialogClose asChild>\n          <Button variant='ghost' color='neutral' size='large'>\n            Cancel\n          </Button>\n        </DialogClose>\n        <Button variant='primary' color='brand' size='large'>\n          Apply\n        </Button>\n      </DialogFooter>\n    </DialogContent>\n  </Dialog>\n);",
          "storyFile": "Dialog/Dialog.stories.tsx",
          "storyTitle": "Overlay/Dialog",
          "description": "A left-aligned action for the escape route — cancel, learn more — kept away from the\nconfirming pair on the right."
        },
        {
          "name": "Sizes",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Dialog, DialogBody, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@wallarm-org/design-system/Dialog';\nimport { HStack } from '@wallarm-org/design-system/Stack';\nimport { DIALOG_SIZES } from './constants';\n\nexport const Sizes = () => (\n  <HStack gap={8} justify='center'>\n    <Dialog width={DIALOG_SIZES.small}>\n      <DialogTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Open Small ({DIALOG_SIZES.small}px)\n        </Button>\n      </DialogTrigger>\n      <DialogContent>\n        <DialogHeader>\n          <DialogTitle>Small Dialog ({DIALOG_SIZES.small}px)</DialogTitle>\n        </DialogHeader>\n\n        <DialogBody>\n          <ContentPlaceholder />\n        </DialogBody>\n      </DialogContent>\n    </Dialog>\n\n    <Dialog width={DIALOG_SIZES.medium}>\n      <DialogTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Open Medium ({DIALOG_SIZES.medium}px)\n        </Button>\n      </DialogTrigger>\n      <DialogContent>\n        <DialogHeader>\n          <DialogTitle>Medium Dialog ({DIALOG_SIZES.medium}px)</DialogTitle>\n        </DialogHeader>\n\n        <DialogBody>\n          <ContentPlaceholder />\n        </DialogBody>\n      </DialogContent>\n    </Dialog>\n\n    <Dialog width={DIALOG_SIZES.large}>\n      <DialogTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Open Large ({DIALOG_SIZES.large}px)\n        </Button>\n      </DialogTrigger>\n      <DialogContent>\n        <DialogHeader>\n          <DialogTitle>Large Dialog ({DIALOG_SIZES.large}px)</DialogTitle>\n        </DialogHeader>\n\n        <DialogBody>\n          <ContentPlaceholder />\n        </DialogBody>\n      </DialogContent>\n    </Dialog>\n  </HStack>\n);",
          "storyFile": "Dialog/Dialog.stories.tsx",
          "storyTitle": "Overlay/Dialog",
          "description": "The standard widths. Pick by the content, not the importance: a wide dialog for a short\nquestion reads as a mistake."
        },
        {
          "name": "CustomSizes",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Dialog, DialogBody, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@wallarm-org/design-system/Dialog';\nimport { HStack } from '@wallarm-org/design-system/Stack';\n\nexport const CustomSizes = () => {\n  return (\n    <HStack gap={8} justify='center'>\n      <Dialog width='50%'>\n        <DialogTrigger asChild>\n          <Button variant='outline' color='neutral'>\n            50% Width\n          </Button>\n        </DialogTrigger>\n\n        <DialogContent>\n          <DialogHeader>\n            <DialogTitle>50% Width Dialog</DialogTitle>\n          </DialogHeader>\n\n          <DialogBody>\n            <div className='py-12'>\n              <p>This dialog takes 50% of the viewport width.</p>\n            </div>\n          </DialogBody>\n        </DialogContent>\n      </Dialog>\n\n      <Dialog width={1000}>\n        <DialogTrigger asChild>\n          <Button variant='outline' color='neutral'>\n            1000px Width\n          </Button>\n        </DialogTrigger>\n\n        <DialogContent>\n          <DialogHeader>\n            <DialogTitle>1000px Width Dialog</DialogTitle>\n          </DialogHeader>\n\n          <DialogBody>\n            <div className='py-12'>\n              <p>This dialog has a fixed width of 1000px.</p>\n            </div>\n          </DialogBody>\n        </DialogContent>\n      </Dialog>\n    </HStack>\n  );\n};",
          "storyFile": "Dialog/Dialog.stories.tsx",
          "storyTitle": "Overlay/Dialog",
          "description": "Explicit `width`, `minWidth` and `maxWidth` for content the standard steps do not fit."
        },
        {
          "name": "Scrollable",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Dialog, DialogBody, DialogClose, DialogContent, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from '@wallarm-org/design-system/Dialog';\n\nexport const Scrollable = () => {\n  return (\n    <Dialog>\n      <DialogTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Open Dialog with Scroll\n        </Button>\n      </DialogTrigger>\n\n      <DialogContent>\n        <DialogHeader>\n          <DialogTitle>Scrollable Content</DialogTitle>\n        </DialogHeader>\n\n        <DialogBody>\n          <div className='flex flex-col gap-16'>\n            {Array.from({ length: 20 }).map((_, i) => (\n              <ContentPlaceholder key={i} height={100} />\n            ))}\n          </div>\n        </DialogBody>\n\n        <DialogFooter>\n          <DialogClose asChild>\n            <Button variant='ghost' color='neutral' size='large'>\n              Close\n            </Button>\n          </DialogClose>\n          <Button variant='primary' color='brand' size='large'>\n            Confirm\n          </Button>\n        </DialogFooter>\n      </DialogContent>\n    </Dialog>\n  );\n};",
          "storyFile": "Dialog/Dialog.stories.tsx",
          "storyTitle": "Overlay/Dialog",
          "description": "The body scrolls while header and footer stay put, so the decision never scrolls out of\nreach."
        },
        {
          "name": "WithInputAtEdge",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Dialog, DialogBody, DialogClose, DialogContent, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from '@wallarm-org/design-system/Dialog';\nimport { Input } from '@wallarm-org/design-system/Input';\n\nexport const WithInputAtEdge = () => {\n  return (\n    <Dialog>\n      <DialogTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Open Dialog with Edge Input\n        </Button>\n      </DialogTrigger>\n\n      <DialogContent>\n        <DialogHeader>\n          <DialogTitle>Delete account</DialogTitle>\n        </DialogHeader>\n\n        <DialogBody>\n          <Input placeholder='Type your email to confirm' data-testid='edge-input' />\n        </DialogBody>\n\n        <DialogFooter>\n          <DialogClose asChild>\n            <Button variant='ghost' color='neutral' size='large'>\n              Cancel\n            </Button>\n          </DialogClose>\n          <Button variant='primary' color='destructive' size='large'>\n            Delete\n          </Button>\n        </DialogFooter>\n      </DialogContent>\n    </Dialog>\n  );\n};",
          "storyFile": "Dialog/Dialog.stories.tsx",
          "storyTitle": "Overlay/Dialog",
          "description": "A field against the panel edge, which is where focus rings and shadows get clipped if the\npadding is wrong."
        },
        {
          "name": "WithInputAtEdgeScrollable",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Dialog, DialogBody, DialogClose, DialogContent, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from '@wallarm-org/design-system/Dialog';\nimport { Input } from '@wallarm-org/design-system/Input';\n\nexport const WithInputAtEdgeScrollable = () => {\n  return (\n    <Dialog>\n      <DialogTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Open Scrollable Dialog with Edge Input\n        </Button>\n      </DialogTrigger>\n\n      <DialogContent>\n        <DialogHeader>\n          <DialogTitle>Delete account</DialogTitle>\n        </DialogHeader>\n\n        <DialogBody>\n          <div className='flex flex-col gap-16'>\n            {Array.from({ length: 10 }).map((_, i) => (\n              <ContentPlaceholder key={i} height={100} />\n            ))}\n\n            <Input placeholder='Type your email to confirm' data-testid='edge-input' />\n          </div>\n        </DialogBody>\n\n        <DialogFooter>\n          <DialogClose asChild>\n            <Button variant='ghost' color='neutral' size='large'>\n              Cancel\n            </Button>\n          </DialogClose>\n          <Button variant='primary' color='destructive' size='large'>\n            Delete\n          </Button>\n        </DialogFooter>\n      </DialogContent>\n    </Dialog>\n  );\n};",
          "storyFile": "Dialog/Dialog.stories.tsx",
          "storyTitle": "Overlay/Dialog",
          "description": "The same, with scrolling — the case where a focus ring can be cut by the scroll container\nrather than the panel."
        },
        {
          "name": "WithNestedDrawer",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Dialog, DialogBody, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@wallarm-org/design-system/Dialog';\nimport { Drawer, DrawerBody, DrawerContent, DrawerHeader, DrawerTitle, DrawerTrigger } from '@wallarm-org/design-system/Drawer';\nimport { PanelRight } from '@wallarm-org/design-system/icons';\nimport { VStack } from '@wallarm-org/design-system/Stack';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const WithNestedDrawer = () => {\n  return (\n    <Dialog>\n      <DialogTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Open dialog with drawer inside\n        </Button>\n      </DialogTrigger>\n\n      <DialogContent>\n        <DialogHeader>\n          <DialogTitle>Dialog stays in place</DialogTitle>\n        </DialogHeader>\n\n        <DialogBody>\n          <VStack gap={12} align='start'>\n            <Text>Opening the drawer below must not scale or shift this dialog.</Text>\n\n            <Drawer>\n              <DrawerTrigger asChild>\n                <Button variant='outline' color='neutral'>\n                  <PanelRight />\n                  Open drawer\n                </Button>\n              </DrawerTrigger>\n\n              <DrawerContent>\n                <DrawerHeader>\n                  <DrawerTitle>Drawer over a dialog</DrawerTitle>\n                </DrawerHeader>\n\n                <DrawerBody>\n                  <ContentPlaceholder height={200} />\n                </DrawerBody>\n              </DrawerContent>\n            </Drawer>\n          </VStack>\n        </DialogBody>\n      </DialogContent>\n    </Dialog>\n  );\n};",
          "storyFile": "Dialog/Dialog.stories.tsx",
          "storyTitle": "Overlay/Dialog",
          "description": "A drawer opened from a dialog. Different families, so neither pushes the other back; they\nstack."
        },
        {
          "name": "WithNestedSelect",
          "code": "import { createListCollection } from '@ark-ui/react/collection';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Dialog, DialogBody, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@wallarm-org/design-system/Dialog';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { PanelRight } from '@wallarm-org/design-system/icons';\nimport { Select, SelectButton, SelectContent, SelectOption, SelectOptionIndicator, SelectOptionText, SelectPositioner } from '@wallarm-org/design-system/Select';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const WithNestedSelect = () => {\n  const collection = createListCollection({\n    items: [\n      { label: 'React', value: 'react' },\n      { label: 'Vue', value: 'vue' },\n      { label: 'Angular', value: 'angular' },\n    ],\n  });\n\n  return (\n    <Dialog>\n      <DialogTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Open dialog with nested select\n        </Button>\n      </DialogTrigger>\n\n      <DialogContent>\n        <DialogHeader>\n          <DialogTitle>[Level 1] Main Dialog</DialogTitle>\n\n          <Dialog>\n            <DialogTrigger asChild>\n              <Button variant='ghost' color='neutral' size='small'>\n                <PanelRight />\n                Open nested dialog\n              </Button>\n            </DialogTrigger>\n\n            <DialogContent>\n              <DialogHeader>\n                <DialogTitle>[Level 2] With Select</DialogTitle>\n              </DialogHeader>\n\n              <DialogBody>\n                <VStack gap={12} align='start'>\n                  <Select collection={collection} data-testid='nested-select'>\n                    <SelectButton />\n\n                    <SelectPositioner>\n                      <SelectContent>\n                        {collection.items.map(item => (\n                          <SelectOption key={item.value} item={item}>\n                            <SelectOptionText>{item.label}</SelectOptionText>\n                            <SelectOptionIndicator />\n                          </SelectOption>\n                        ))}\n                      </SelectContent>\n                    </SelectPositioner>\n                  </Select>\n\n                  <DropdownMenu data-testid='nested-dropdown'>\n                    <DropdownMenuTrigger asChild>\n                      <Button variant='outline' color='neutral'>\n                        Open menu\n                      </Button>\n                    </DropdownMenuTrigger>\n                    <DropdownMenuContent>\n                      <DropdownMenuItem>First action</DropdownMenuItem>\n                      <DropdownMenuItem>Second action</DropdownMenuItem>\n                    </DropdownMenuContent>\n                  </DropdownMenu>\n                </VStack>\n              </DialogBody>\n            </DialogContent>\n          </Dialog>\n        </DialogHeader>\n\n        <DialogBody>\n          <ContentPlaceholder height={200} />\n        </DialogBody>\n      </DialogContent>\n    </Dialog>\n  );\n};",
          "storyFile": "Dialog/Dialog.stories.tsx",
          "storyTitle": "Overlay/Dialog",
          "description": "A `Select` inside a dialog, checking that its menu escapes the panel rather than being\nclipped by it."
        },
        {
          "name": "WithNestedCalendar",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Calendar, CalendarBody, CalendarContent, CalendarGrids, CalendarTrigger } from '@wallarm-org/design-system/Calendar';\nimport { Dialog, DialogBody, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@wallarm-org/design-system/Dialog';\nimport { PanelRight } from '@wallarm-org/design-system/icons';\n\nexport const WithNestedCalendar = () => {\n  return (\n    <Dialog>\n      <DialogTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Open dialog with nested calendar\n        </Button>\n      </DialogTrigger>\n\n      <DialogContent>\n        <DialogHeader>\n          <DialogTitle>[Level 1] Main Dialog</DialogTitle>\n\n          <Dialog>\n            <DialogTrigger asChild>\n              <Button variant='ghost' color='neutral' size='small'>\n                <PanelRight />\n                Open nested dialog\n              </Button>\n            </DialogTrigger>\n\n            <DialogContent>\n              <DialogHeader>\n                <DialogTitle>[Level 2] With Calendar</DialogTitle>\n              </DialogHeader>\n\n              <DialogBody>\n                <Calendar type='single'>\n                  <CalendarTrigger asChild>\n                    <Button variant='outline' color='neutral'>\n                      Open calendar\n                    </Button>\n                  </CalendarTrigger>\n                  <CalendarContent>\n                    <CalendarBody>\n                      <CalendarGrids />\n                    </CalendarBody>\n                  </CalendarContent>\n                </Calendar>\n              </DialogBody>\n            </DialogContent>\n          </Dialog>\n        </DialogHeader>\n\n        <DialogBody>\n          <ContentPlaceholder height={200} />\n        </DialogBody>\n      </DialogContent>\n    </Dialog>\n  );\n};",
          "storyFile": "Dialog/Dialog.stories.tsx",
          "storyTitle": "Overlay/Dialog",
          "description": "A `Calendar` inside a dialog, the same check for a popover that is taller than the panel."
        },
        {
          "name": "Controlled",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Dialog, DialogBody, DialogClose, DialogContent, DialogFooter, DialogHeader, DialogTitle } from '@wallarm-org/design-system/Dialog';\n\nexport const Controlled = () => {\n  const [open, setOpen] = useState(false);\n\n  return (\n    <>\n      <Button variant='outline' color='neutral' onClick={() => setOpen(true)}>\n        Open Controlled Dialog\n      </Button>\n\n      <Dialog open={open} onOpenChange={setOpen}>\n        <DialogContent>\n          <DialogHeader>\n            <DialogTitle>Controlled Dialog</DialogTitle>\n          </DialogHeader>\n\n          <DialogBody>\n            <div className='py-12'>\n              <p className='mb-16'>This dialog is controlled externally.</p>\n              <ContentPlaceholder />\n            </div>\n          </DialogBody>\n\n          <DialogFooter>\n            <DialogClose asChild>\n              <Button variant='ghost' color='neutral' size='large'>\n                Cancel\n              </Button>\n            </DialogClose>\n            <Button variant='primary' color='brand' size='large'>\n              Save Changes\n            </Button>\n          </DialogFooter>\n        </DialogContent>\n      </Dialog>\n    </>\n  );\n};",
          "storyFile": "Dialog/Dialog.stories.tsx",
          "storyTitle": "Overlay/Dialog",
          "description": "Owning `open`, which is what you need when something outside the dialog decides it should\nclose."
        },
        {
          "name": "NoClosableOnEsc",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Dialog, DialogBody, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@wallarm-org/design-system/Dialog';\n\nexport const NoClosableOnEsc = () => {\n  return (\n    <Dialog closeOnEscape={false}>\n      <DialogTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Open Dialog\n        </Button>\n      </DialogTrigger>\n\n      <DialogContent>\n        <DialogHeader>\n          <DialogTitle>Dialog Title</DialogTitle>\n        </DialogHeader>\n\n        <DialogBody>\n          <ContentPlaceholder />\n        </DialogBody>\n      </DialogContent>\n    </Dialog>\n  );\n};",
          "storyFile": "Dialog/Dialog.stories.tsx",
          "storyTitle": "Overlay/Dialog",
          "description": "Escape disabled, for a decision that must not be dismissed by reflex. Use it sparingly — it\ntakes away the exit readers expect."
        },
        {
          "name": "NoOverlay",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Dialog, DialogBody, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@wallarm-org/design-system/Dialog';\nimport { VStack } from '@wallarm-org/design-system/Stack';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const NoOverlay = () => {\n  return (\n    <VStack gap={12}>\n      <Text>\n        Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has\n        been the industry's standard dummy text ever since the 1500s, when an unknown printer took a\n        galley of type and scrambled it to make a type specimen book. It has survived not only five\n        centuries, but also the leap into electronic typesetting, remaining essentially unchanged.\n        It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum\n        passages, and more recently with desktop publishing software like Aldus PageMaker including\n        versions of Lorem Ipsum. Why do we use it? It is a long established fact that a reader will\n        be distracted by the readable content of a page when looking at its layout. The point of\n        using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed\n        to using 'Content here, content here', making it look like readable English. Many desktop\n        publishing packages and web page editors now use Lorem Ipsum as their default model text,\n        and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various\n        versions have evolved over the years, sometimes by accident, sometimes on purpose (injected\n        humour and the like).\n      </Text>\n\n      <Dialog overlay={false}>\n        <DialogTrigger asChild>\n          <Button variant='outline' color='neutral'>\n            Open without Overlay\n          </Button>\n        </DialogTrigger>\n\n        <DialogContent>\n          <DialogHeader>\n            <DialogTitle>No Overlay</DialogTitle>\n          </DialogHeader>\n\n          <DialogBody>\n            <div className='py-12'>\n              <p>This dialog has no overlay backdrop.</p>\n            </div>\n          </DialogBody>\n        </DialogContent>\n      </Dialog>\n\n      <Text>\n        Where does it come from? Contrary to popular belief, Lorem Ipsum is not simply random text.\n        It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years\n        old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up\n        one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going\n        through the cites of the word in classical literature, discovered the undoubtable source.\n        Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of \"de Finibus Bonorum et Malorum\" (The\n        Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the\n        theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, \"Lorem\n        ipsum dolor sit amet..\", comes from a line in section 1.10.32. The standard chunk of Lorem\n        Ipsum used since the 1500s is reproduced below for those interested. Sections 1.10.32 and\n        1.10.33 from \"de Finibus Bonorum et Malorum\" by Cicero are also reproduced in their exact\n        original form, accompanied by English versions from the 1914 translation by H. Rackham.\n      </Text>\n    </VStack>\n  );\n};",
          "storyFile": "Dialog/Dialog.stories.tsx",
          "storyTitle": "Overlay/Dialog",
          "description": "Without the backdrop. The panel stops reading as blocking, which is usually the wrong signal\nfor a dialog."
        },
        {
          "name": "WithNested",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Dialog, DialogBody, DialogClose, DialogContent, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from '@wallarm-org/design-system/Dialog';\nimport { PanelRight } from '@wallarm-org/design-system/icons';\nimport { VStack } from '@wallarm-org/design-system/Stack';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const WithNested = () => {\n  return (\n    <Dialog>\n      <DialogTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          1st level dialog\n        </Button>\n      </DialogTrigger>\n\n      <DialogContent>\n        <DialogHeader>\n          <DialogTitle>[Level 1] Main Dialog</DialogTitle>\n\n          {/* Level 2 dialog */}\n          <Dialog>\n            <DialogTrigger asChild>\n              <Button variant='ghost' color='neutral' size='small'>\n                <PanelRight />\n                2nd level dialog\n              </Button>\n            </DialogTrigger>\n\n            <DialogContent>\n              <DialogHeader>\n                <DialogTitle>[Level 2] Detail View</DialogTitle>\n                {/* Level 3 dialog */}\n                <Dialog>\n                  <DialogTrigger asChild>\n                    <Button variant='ghost' color='neutral' size='small'>\n                      <PanelRight />\n                      3nd level dialog\n                    </Button>\n                  </DialogTrigger>\n\n                  <DialogContent>\n                    <DialogHeader>\n                      <DialogTitle>[Level 3] Deep Nested</DialogTitle>\n                    </DialogHeader>\n\n                    <DialogBody>\n                      <VStack gap={12} align='start'>\n                        <Text>Level 3! Unlimited nesting works.</Text>\n                        <ContentPlaceholder height={150} />\n                      </VStack>\n                    </DialogBody>\n\n                    <DialogFooter>\n                      <DialogClose asChild>\n                        <Button size='large' variant='ghost' color='neutral'>\n                          Back\n                        </Button>\n                      </DialogClose>\n                    </DialogFooter>\n                  </DialogContent>\n                </Dialog>\n              </DialogHeader>\n\n              <DialogBody>\n                <VStack gap={12} align='start'>\n                  <Text>This is Level 2 dialog. Main dialog is pushed back.</Text>\n\n                  <ContentPlaceholder height={150} />\n                </VStack>\n              </DialogBody>\n\n              <DialogFooter>\n                <DialogClose asChild>\n                  <Button variant='ghost' color='neutral' size='large'>\n                    Back\n                  </Button>\n                </DialogClose>\n                <Button variant='primary' color='brand' size='large'>\n                  Apply\n                </Button>\n              </DialogFooter>\n            </DialogContent>\n          </Dialog>\n        </DialogHeader>\n\n        <DialogBody>\n          <VStack gap={12} align='start'>\n            <Text>This is Level 1 dialog. Click above to open nested dialogs:</Text>\n\n            <ContentPlaceholder height={150} />\n          </VStack>\n        </DialogBody>\n\n        <DialogFooter>\n          <DialogClose asChild>\n            <Button variant='ghost' color='neutral' size='large'>\n              Cancel\n            </Button>\n          </DialogClose>\n          <Button variant='primary' color='brand' size='large'>\n            Save\n          </Button>\n        </DialogFooter>\n      </DialogContent>\n    </Dialog>\n  );\n};",
          "storyFile": "Dialog/Dialog.stories.tsx",
          "storyTitle": "Overlay/Dialog",
          "description": "A dialog inside a dialog: the outer one steps back so the depth is visible. Two is the most a\nreader can follow."
        },
        {
          "name": "WithTabs",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Dialog, DialogBody, DialogClose, DialogContent, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from '@wallarm-org/design-system/Dialog';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@wallarm-org/design-system/Tabs';\n\nexport const WithTabs = () => {\n  const [activeTab, setActiveTab] = useState('tab1');\n\n  return (\n    <Dialog width={960}>\n      <DialogTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Open Dialog with Tabs\n        </Button>\n      </DialogTrigger>\n\n      <DialogContent>\n        <Tabs value={activeTab} onChange={setActiveTab} asChild>\n          <DialogHeader>\n            <DialogTitle>Tabbed Content</DialogTitle>\n          </DialogHeader>\n\n          <TabsList>\n            <TabsTrigger value='tab1'>General</TabsTrigger>\n            <TabsTrigger value='tab2'>Settings</TabsTrigger>\n            <TabsTrigger value='tab3'>Advanced</TabsTrigger>\n          </TabsList>\n\n          <DialogBody>\n            <div className='pt-12'>\n              <TabsContent value='tab1'>\n                <h3 className='text-lg font-medium mb-8'>General Settings</h3>\n                <ContentPlaceholder height={300} />\n              </TabsContent>\n              <TabsContent value='tab2'>\n                <h3 className='text-lg font-medium mb-8'>Configuration</h3>\n                <ContentPlaceholder height={300} />\n              </TabsContent>\n              <TabsContent value='tab3'>\n                <h3 className='text-lg font-medium mb-8'>Advanced Options</h3>\n                <ContentPlaceholder height={300} />\n              </TabsContent>\n            </div>\n          </DialogBody>\n        </Tabs>\n\n        <DialogFooter>\n          <DialogClose asChild>\n            <Button variant='ghost' color='neutral' size='large'>\n              Cancel\n            </Button>\n          </DialogClose>\n          <Button variant='primary' color='brand' size='large'>\n            Apply Settings\n          </Button>\n        </DialogFooter>\n      </DialogContent>\n    </Dialog>\n  );\n};",
          "storyFile": "Dialog/Dialog.stories.tsx",
          "storyTitle": "Overlay/Dialog",
          "description": "Tabs inside a dialog, for a task with a couple of facets — not as a way to fit a whole form\ninto one panel."
        }
      ]
    },
    {
      "name": "Drawer",
      "description": "A side panel for work the reader does alongside the page — its differentiator is that it can run non-modal, so with `modal={false}` they can keep using what is behind it. Reach for `Dialog` when the panel is a decision to resolve now, since that is the same panel with the exit closed off.",
      "importPath": "@wallarm-org/design-system/Drawer",
      "props": [
        {
          "name": "kind",
          "type": "DrawerKind | undefined",
          "required": false,
          "description": "Which overlay family this root belongs to. Drives the same-kind nesting\ncounter behind the pushed-back animation: a Drawer only pushes back for\na nested Drawer, a Dialog only for a nested Dialog. Set to 'dialog' by\nthe Dialog component — consumers should not need to touch this.",
          "defaultValue": "drawer"
        },
        {
          "name": "open",
          "type": "boolean | undefined",
          "required": false,
          "description": "Controlled open state"
        },
        {
          "name": "onOpenChange",
          "type": "((open: boolean) => void) | undefined",
          "required": false,
          "description": "Controlled open change handler"
        },
        {
          "name": "closeOnEscape",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether ESC key closes the drawer (default: true)",
          "defaultValue": "true"
        },
        {
          "name": "closeOnOutsideClick",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether clicking outside closes the drawer (default: true)",
          "defaultValue": "true"
        },
        {
          "name": "overlay",
          "type": "boolean | undefined",
          "required": false,
          "description": "Overlay visibility (default: true)",
          "defaultValue": "true"
        },
        {
          "name": "modal",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the drawer is modal — blocks interaction with the rest of the page (default: true)",
          "defaultValue": "true"
        },
        {
          "name": "width",
          "type": "string | number | undefined",
          "required": false,
          "description": "Width - number for pixels, string for percentage (e.g., \"50%\")"
        },
        {
          "name": "minWidth",
          "type": "number | undefined",
          "required": false,
          "description": "Minimum width in pixels"
        },
        {
          "name": "maxWidth",
          "type": "number | undefined",
          "required": false,
          "description": "Maximum width in pixels"
        },
        {
          "name": "onInteractOutside",
          "type": "complex",
          "required": false,
          "description": "Fired when the user interacts outside the drawer (e.g. clicks the backdrop)."
        },
        {
          "name": "onEscapeKeyDown",
          "type": "((event: KeyboardEvent) => void) | undefined",
          "required": false,
          "description": "Fired when the user presses the Escape key while the drawer is open."
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "isResizing",
          "options": [
            "true"
          ]
        }
      ],
      "subComponents": [
        {
          "name": "DrawerBody",
          "props": []
        },
        {
          "name": "DrawerClose",
          "props": [
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "description": "Render as child component",
              "defaultValue": "false"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "DrawerContent",
          "props": [
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "DrawerDescription",
          "props": []
        },
        {
          "name": "DrawerFooter",
          "props": []
        },
        {
          "name": "DrawerFooterControls",
          "props": [
            {
              "name": "placement",
              "type": "{ left: string; right: string; }",
              "required": false,
              "defaultValue": "right"
            }
          ]
        },
        {
          "name": "DrawerHeader",
          "props": []
        },
        {
          "name": "DrawerPositioner",
          "props": [
            {
              "name": "isResizing",
              "type": "boolean",
              "required": true
            }
          ]
        },
        {
          "name": "DrawerTitle",
          "props": []
        },
        {
          "name": "DrawerTrigger",
          "props": [
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "description": "Render as child component",
              "defaultValue": "false"
            },
            {
              "name": "value",
              "type": "string | undefined",
              "required": false,
              "description": "Native button value attribute (string only, matching Ark UI's Dialog.Trigger)"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Drawer, DrawerBody, DrawerContent, DrawerHeader, DrawerTitle, DrawerTrigger } from '@wallarm-org/design-system/Drawer';\n\nexport const Basic = () => {\n  return (\n    <Drawer data-testid='drawer'>\n      <DrawerTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Open Drawer\n        </Button>\n      </DrawerTrigger>\n\n      <DrawerContent>\n        <DrawerHeader>\n          <DrawerTitle>Drawer Title</DrawerTitle>\n        </DrawerHeader>\n\n        <DrawerBody>\n          <ContentPlaceholder fillHeight />\n        </DrawerBody>\n      </DrawerContent>\n    </Drawer>\n  );\n};",
          "storyFile": "Drawer/Drawer.stories.tsx",
          "storyTitle": "Overlay/Drawer",
          "description": "Trigger, content, title. The title is what a screen reader announces, so it is never\noptional."
        },
        {
          "name": "WithFooter",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Drawer, DrawerBody, DrawerContent, DrawerFooter, DrawerFooterControls, DrawerHeader, DrawerTitle, DrawerTrigger } from '@wallarm-org/design-system/Drawer';\n\nexport const WithFooter = () => {\n  return (\n    <Drawer>\n      <DrawerTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Open Drawer\n        </Button>\n      </DrawerTrigger>\n\n      <DrawerContent>\n        <DrawerHeader>\n          <DrawerTitle>Drawer's title</DrawerTitle>\n        </DrawerHeader>\n        <DrawerBody>\n          <ContentPlaceholder fillHeight />\n        </DrawerBody>\n        <DrawerFooter>\n          <DrawerFooterControls>\n            <Button variant='ghost' color='neutral' size='large'>\n              Button\n            </Button>\n            <Button variant='primary' color='brand' size='large'>\n              Button\n            </Button>\n          </DrawerFooterControls>\n        </DrawerFooter>\n      </DrawerContent>\n    </Drawer>\n  );\n};",
          "storyFile": "Drawer/Drawer.stories.tsx",
          "storyTitle": "Overlay/Drawer",
          "description": "`DrawerFooter` for the actions that commit the work. It stays put while the body scrolls."
        },
        {
          "name": "WithDescription",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Drawer, DrawerBody, DrawerContent, DrawerDescription, DrawerFooter, DrawerFooterControls, DrawerHeader, DrawerTitle, DrawerTrigger } from '@wallarm-org/design-system/Drawer';\n\nexport const WithDescription = () => {\n  return (\n    <Drawer>\n      <DrawerTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Open Drawer\n        </Button>\n      </DrawerTrigger>\n\n      <DrawerContent>\n        <DrawerHeader>\n          <DrawerTitle>Drawer's title</DrawerTitle>\n          <DrawerDescription>Description TBD</DrawerDescription>\n        </DrawerHeader>\n        <DrawerBody>\n          <ContentPlaceholder fillHeight />\n        </DrawerBody>\n        <DrawerFooter>\n          <DrawerFooterControls>\n            <Button variant='ghost' color='neutral' size='large'>\n              Button\n            </Button>\n            <Button variant='primary' color='brand' size='large'>\n              Button\n            </Button>\n          </DrawerFooterControls>\n        </DrawerFooter>\n      </DrawerContent>\n    </Drawer>\n  );\n};",
          "storyFile": "Drawer/Drawer.stories.tsx",
          "storyTitle": "Overlay/Drawer",
          "description": "`DrawerDescription` under the title, wired to `aria-describedby` so it is read with the panel\nrather than after it. `DrawerHeader` stacks the two, keeping the close button right-aligned."
        },
        {
          "name": "WithFooterLeftActions",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Drawer, DrawerBody, DrawerClose, DrawerContent, DrawerFooter, DrawerFooterControls, DrawerHeader, DrawerTitle, DrawerTrigger } from '@wallarm-org/design-system/Drawer';\nimport { Switch, SwitchControl, SwitchLabel } from '@wallarm-org/design-system/Switch';\n\nexport const WithFooterLeftActions = () => (\n  <Drawer>\n    <DrawerTrigger asChild>\n      <Button variant='outline' color='neutral'>\n        Open with Footer Actions\n      </Button>\n    </DrawerTrigger>\n    <DrawerContent>\n      <DrawerHeader>\n        <DrawerTitle>Footer with Left Actions</DrawerTitle>\n      </DrawerHeader>\n\n      <DrawerBody>\n        <ContentPlaceholder fillHeight />\n      </DrawerBody>\n\n      <DrawerFooter>\n        <DrawerFooterControls placement='left'>\n          <Switch>\n            <SwitchControl />\n            <SwitchLabel>Remember choice</SwitchLabel>\n          </Switch>\n        </DrawerFooterControls>\n\n        <DrawerClose asChild>\n          <Button variant='ghost' color='neutral' size='large'>\n            Cancel\n          </Button>\n        </DrawerClose>\n        <Button variant='primary' color='brand' size='large'>\n          Apply\n        </Button>\n      </DrawerFooter>\n    </DrawerContent>\n  </Drawer>\n);",
          "storyFile": "Drawer/Drawer.stories.tsx",
          "storyTitle": "Overlay/Drawer",
          "description": "A left-aligned secondary action, separated from the committing pair on the right."
        },
        {
          "name": "Sizes",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Drawer, DrawerBody, DrawerContent, DrawerHeader, DrawerTitle, DrawerTrigger } from '@wallarm-org/design-system/Drawer';\nimport { HStack } from '@wallarm-org/design-system/Stack';\nimport { DRAWER_SIZES } from './constants';\n\nexport const Sizes = () => (\n  <HStack gap={8} justify='center'>\n    <Drawer width={DRAWER_SIZES.small}>\n      <DrawerTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Open Small ({DRAWER_SIZES.small}px)\n        </Button>\n      </DrawerTrigger>\n      <DrawerContent>\n        <DrawerHeader>\n          <DrawerTitle>Small Drawer ({DRAWER_SIZES.small}px)</DrawerTitle>\n        </DrawerHeader>\n\n        <DrawerBody>\n          <ContentPlaceholder fillHeight />\n        </DrawerBody>\n      </DrawerContent>\n    </Drawer>\n\n    <Drawer width={DRAWER_SIZES.medium}>\n      <DrawerTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Open Medium ({DRAWER_SIZES.medium}px)\n        </Button>\n      </DrawerTrigger>\n      <DrawerContent>\n        <DrawerHeader>\n          <DrawerTitle>Medium Drawer ({DRAWER_SIZES.medium}px)</DrawerTitle>\n        </DrawerHeader>\n\n        <DrawerBody>\n          <ContentPlaceholder fillHeight />\n        </DrawerBody>\n      </DrawerContent>\n    </Drawer>\n\n    <Drawer width={DRAWER_SIZES.large}>\n      <DrawerTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Open Large ({DRAWER_SIZES.large}px)\n        </Button>\n      </DrawerTrigger>\n      <DrawerContent>\n        <DrawerHeader>\n          <DrawerTitle>Large Drawer ({DRAWER_SIZES.large}px)</DrawerTitle>\n        </DrawerHeader>\n\n        <DrawerBody>\n          <ContentPlaceholder fillHeight />\n        </DrawerBody>\n      </DrawerContent>\n    </Drawer>\n  </HStack>\n);",
          "storyFile": "Drawer/Drawer.stories.tsx",
          "storyTitle": "Overlay/Drawer",
          "description": "The standard widths. A drawer earns more width than a dialog because the reader is working in\nit rather than answering it."
        },
        {
          "name": "CustomSizes",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Drawer, DrawerBody, DrawerContent, DrawerHeader, DrawerTitle, DrawerTrigger } from '@wallarm-org/design-system/Drawer';\nimport { HStack } from '@wallarm-org/design-system/Stack';\n\nexport const CustomSizes = () => {\n  return (\n    <HStack gap={8} justify='center'>\n      <Drawer width='50%'>\n        <DrawerTrigger asChild>\n          <Button variant='outline' color='neutral'>\n            50% Width\n          </Button>\n        </DrawerTrigger>\n\n        <DrawerContent>\n          <DrawerHeader>\n            <DrawerTitle>50% Width Drawer</DrawerTitle>\n          </DrawerHeader>\n\n          <DrawerBody>\n            <div className='py-12'>\n              <p>This drawer takes 50% of the viewport width.</p>\n            </div>\n          </DrawerBody>\n        </DrawerContent>\n      </Drawer>\n\n      <Drawer width={1000}>\n        <DrawerTrigger asChild>\n          <Button variant='outline' color='neutral'>\n            1000px Width\n          </Button>\n        </DrawerTrigger>\n\n        <DrawerContent>\n          <DrawerHeader>\n            <DrawerTitle>1000px Width Drawer</DrawerTitle>\n          </DrawerHeader>\n\n          <DrawerBody>\n            <div className='py-12'>\n              <p>This drawer has a fixed width of 1000px.</p>\n            </div>\n          </DrawerBody>\n        </DrawerContent>\n      </Drawer>\n    </HStack>\n  );\n};",
          "storyFile": "Drawer/Drawer.stories.tsx",
          "storyTitle": "Overlay/Drawer",
          "description": "Explicit width bounds for content the standard steps do not fit."
        },
        {
          "name": "Resizable",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Drawer, DrawerBody, DrawerContent, DrawerHeader, DrawerResizeHandle, DrawerTitle, DrawerTrigger } from '@wallarm-org/design-system/Drawer';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Resizable = () => {\n  return (\n    <VStack gap={12}>\n      <Drawer width={800}>\n        <DrawerTrigger asChild>\n          <Button variant='outline' color='neutral'>\n            Open Resizable Drawer (as number)\n          </Button>\n        </DrawerTrigger>\n\n        <DrawerContent>\n          <DrawerResizeHandle />\n          <DrawerHeader>\n            <DrawerTitle>Resizable Drawer</DrawerTitle>\n          </DrawerHeader>\n\n          <DrawerBody>\n            <div className='py-12'>\n              <p className='mb-16'>Drag the left edge to resize this drawer.</p>\n              <ContentPlaceholder height={300} />\n            </div>\n          </DrawerBody>\n        </DrawerContent>\n      </Drawer>\n\n      <Drawer width='900px'>\n        <DrawerTrigger asChild>\n          <Button variant='outline' color='neutral'>\n            Open Resizable Drawer (900px)\n          </Button>\n        </DrawerTrigger>\n\n        <DrawerContent>\n          <DrawerResizeHandle />\n          <DrawerHeader>\n            <DrawerTitle>Resizable Drawer with \"900px\" width</DrawerTitle>\n          </DrawerHeader>\n\n          <DrawerBody>\n            <div className='py-12'>\n              <p className='mb-16'>Width is set as \"900px\" string. Drag the left edge to resize.</p>\n              <ContentPlaceholder height={300} />\n            </div>\n          </DrawerBody>\n        </DrawerContent>\n      </Drawer>\n\n      <Drawer width='50%'>\n        <DrawerTrigger asChild>\n          <Button variant='outline' color='neutral'>\n            Open Resizable Drawer (50%)\n          </Button>\n        </DrawerTrigger>\n\n        <DrawerContent>\n          <DrawerResizeHandle />\n          <DrawerHeader>\n            <DrawerTitle>Resizable Drawer with 50% width</DrawerTitle>\n          </DrawerHeader>\n\n          <DrawerBody>\n            <div className='py-12'>\n              <p className='mb-16'>\n                Width is set as \"50%\". Drag the left edge to resize - it will convert to pixels.\n              </p>\n              <ContentPlaceholder height={300} />\n            </div>\n          </DrawerBody>\n        </DrawerContent>\n      </Drawer>\n    </VStack>\n  );\n};",
          "storyFile": "Drawer/Drawer.stories.tsx",
          "storyTitle": "Overlay/Drawer",
          "description": "`DrawerResizeHandle` lets the reader set the width themselves — the part `Dialog`\ndeliberately does not export, because a decision does not need resizing."
        },
        {
          "name": "ResizableWithOverflowList",
          "code": "import { useState } from 'react';\nimport { Attribute, AttributeLabel, AttributeValue } from '@wallarm-org/design-system/Attribute';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Drawer, DrawerBody, DrawerContent, DrawerHeader, DrawerResizeHandle, DrawerTitle, DrawerTrigger } from '@wallarm-org/design-system/Drawer';\nimport { OverflowList } from '@wallarm-org/design-system/OverflowList';\nimport { Tag } from '@wallarm-org/design-system/Tag';\n\nexport const ResizableWithOverflowList = () => {\n  const [open, setOpen] = useState(false);\n\n  return (\n    <Drawer data-testid='drawer' width={480} open={open} onOpenChange={setOpen}>\n      <DrawerTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Open Resizable Drawer with OverflowList\n        </Button>\n      </DrawerTrigger>\n      <DrawerContent>\n        <DrawerResizeHandle />\n        <DrawerHeader>\n          <DrawerTitle>Resizable Drawer with OverflowList</DrawerTitle>\n        </DrawerHeader>\n        <DrawerBody>\n          <p className='mb-16'>Drag the left edge — the tag list reflows live.</p>\n          <Attribute>\n            <AttributeLabel>Attack types</AttributeLabel>\n            <AttributeValue>\n              <OverflowList\n                data-testid='tags-overflow-list'\n                className='gap-4'\n                items={DRAWER_TAGS}\n                itemRenderer={item => (\n                  <Tag key={item} data-testid='tag'>\n                    {item}\n                  </Tag>\n                )}\n              />\n            </AttributeValue>\n          </Attribute>\n        </DrawerBody>\n      </DrawerContent>\n    </Drawer>\n  );\n};",
          "storyFile": "Drawer/Drawer.stories.tsx",
          "storyTitle": "Overlay/Drawer",
          "description": "Resizing with content that reflows, which is the case worth testing: the panel is only useful\nat its new width if what is inside adapts."
        },
        {
          "name": "Scrollable",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Drawer, DrawerBody, DrawerClose, DrawerContent, DrawerFooter, DrawerHeader, DrawerTitle, DrawerTrigger } from '@wallarm-org/design-system/Drawer';\n\nexport const Scrollable = () => {\n  return (\n    <Drawer>\n      <DrawerTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Open Drawer with Scroll\n        </Button>\n      </DrawerTrigger>\n\n      <DrawerContent>\n        <DrawerHeader>\n          <DrawerTitle>Scrollable Content</DrawerTitle>\n        </DrawerHeader>\n\n        <DrawerBody>\n          <div className='flex flex-col gap-16 py-12'>\n            {Array.from({ length: 20 }).map((_, i) => (\n              <ContentPlaceholder key={i} height={100} />\n            ))}\n          </div>\n        </DrawerBody>\n\n        <DrawerFooter>\n          <DrawerClose asChild>\n            <Button variant='ghost' color='neutral' size='large'>\n              Close\n            </Button>\n          </DrawerClose>\n          <Button variant='primary' color='brand' size='large'>\n            Confirm\n          </Button>\n        </DrawerFooter>\n      </DrawerContent>\n    </Drawer>\n  );\n};",
          "storyFile": "Drawer/Drawer.stories.tsx",
          "storyTitle": "Overlay/Drawer",
          "description": "The body scrolls between a fixed header and footer, so the actions never scroll away from the\nwork."
        },
        {
          "name": "Controlled",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Drawer, DrawerBody, DrawerClose, DrawerContent, DrawerFooter, DrawerHeader, DrawerTitle } from '@wallarm-org/design-system/Drawer';\n\nexport const Controlled = () => {\n  const [open, setOpen] = useState(false);\n\n  return (\n    <>\n      <Button variant='outline' color='neutral' onClick={() => setOpen(true)}>\n        Open Controlled Drawer\n      </Button>\n\n      <Drawer open={open} onOpenChange={setOpen}>\n        <DrawerContent>\n          <DrawerHeader>\n            <DrawerTitle>Controlled Drawer</DrawerTitle>\n          </DrawerHeader>\n\n          <DrawerBody>\n            <div className='py-12'>\n              <p className='mb-16'>This drawer is controlled externally.</p>\n              <ContentPlaceholder />\n            </div>\n          </DrawerBody>\n\n          <DrawerFooter>\n            <DrawerClose asChild>\n              <Button variant='ghost' color='neutral' size='large'>\n                Cancel\n              </Button>\n            </DrawerClose>\n            <Button variant='primary' color='brand' size='large'>\n              Save Changes\n            </Button>\n          </DrawerFooter>\n        </DrawerContent>\n      </Drawer>\n    </>\n  );\n};",
          "storyFile": "Drawer/Drawer.stories.tsx",
          "storyTitle": "Overlay/Drawer",
          "description": "Owning `open`, for a panel something outside it opens or closes."
        },
        {
          "name": "NoClosableOnEsc",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Drawer, DrawerBody, DrawerContent, DrawerHeader, DrawerTitle, DrawerTrigger } from '@wallarm-org/design-system/Drawer';\n\nexport const NoClosableOnEsc = () => {\n  return (\n    <Drawer closeOnEscape={false}>\n      <DrawerTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Open Drawer\n        </Button>\n      </DrawerTrigger>\n\n      <DrawerContent>\n        <DrawerHeader>\n          <DrawerTitle>Drawer Title</DrawerTitle>\n        </DrawerHeader>\n\n        <DrawerBody>\n          <ContentPlaceholder fillHeight />\n        </DrawerBody>\n      </DrawerContent>\n    </Drawer>\n  );\n};",
          "storyFile": "Drawer/Drawer.stories.tsx",
          "storyTitle": "Overlay/Drawer",
          "description": "Escape disabled, for a panel holding unsaved work where a reflex keystroke would lose it."
        },
        {
          "name": "NoOverlay",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Drawer, DrawerBody, DrawerContent, DrawerHeader, DrawerTitle, DrawerTrigger } from '@wallarm-org/design-system/Drawer';\n\nexport const NoOverlay = () => {\n  return (\n    <Drawer overlay={false}>\n      <DrawerTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Open without Overlay\n        </Button>\n      </DrawerTrigger>\n\n      <DrawerContent>\n        <DrawerHeader>\n          <DrawerTitle>No Overlay</DrawerTitle>\n        </DrawerHeader>\n\n        <DrawerBody>\n          <div className='py-12'>\n            <p>This drawer has no overlay backdrop.</p>\n          </div>\n        </DrawerBody>\n      </DrawerContent>\n    </Drawer>\n  );\n};",
          "storyFile": "Drawer/Drawer.stories.tsx",
          "storyTitle": "Overlay/Drawer",
          "description": "Without the backdrop, which is how a drawer reads as non-blocking. Pair it with\n`modal={false}` if the page behind should also stay usable."
        },
        {
          "name": "WithNested",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Drawer, DrawerBody, DrawerClose, DrawerContent, DrawerFooter, DrawerHeader, DrawerTitle, DrawerTrigger } from '@wallarm-org/design-system/Drawer';\nimport { PanelRight } from '@wallarm-org/design-system/icons';\nimport { VStack } from '@wallarm-org/design-system/Stack';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const WithNested = () => {\n  return (\n    <Drawer>\n      <DrawerTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          1st level drawer\n        </Button>\n      </DrawerTrigger>\n\n      <DrawerContent>\n        <DrawerHeader>\n          <DrawerTitle>[Level 1] Main Drawer</DrawerTitle>\n\n          {/* Level 2 drawer */}\n          <Drawer>\n            <DrawerTrigger asChild>\n              <Button variant='ghost' color='neutral' size='small'>\n                <PanelRight />\n                2nd level drawer\n              </Button>\n            </DrawerTrigger>\n\n            <DrawerContent>\n              <DrawerHeader>\n                <DrawerTitle>[Level 2] Detail View</DrawerTitle>\n                {/* Level 3 drawer */}\n                <Drawer>\n                  <DrawerTrigger asChild>\n                    <Button variant='ghost' color='neutral' size='small'>\n                      <PanelRight />\n                      3nd level drawer\n                    </Button>\n                  </DrawerTrigger>\n\n                  <DrawerContent>\n                    <DrawerHeader>\n                      <DrawerTitle>[Level 3] Deep Nested</DrawerTitle>\n                    </DrawerHeader>\n\n                    <DrawerBody>\n                      <VStack gap={12} align='start'>\n                        <Text>Level 3! Unlimited nesting works.</Text>\n                        <ContentPlaceholder height={150} />\n                      </VStack>\n                    </DrawerBody>\n\n                    <DrawerFooter>\n                      <DrawerClose asChild>\n                        <Button size='large' variant='ghost' color='neutral'>\n                          Back\n                        </Button>\n                      </DrawerClose>\n                    </DrawerFooter>\n                  </DrawerContent>\n                </Drawer>\n              </DrawerHeader>\n\n              <DrawerBody>\n                <VStack gap={12} align='start'>\n                  <Text>\n                    This is Level 2 drawer. Main drawer is pushed back. You can go deeper:\n                  </Text>\n\n                  <ContentPlaceholder height={150} />\n                </VStack>\n              </DrawerBody>\n\n              <DrawerFooter>\n                <DrawerClose asChild>\n                  <Button variant='ghost' color='neutral' size='large'>\n                    Back\n                  </Button>\n                </DrawerClose>\n                <Button variant='primary' color='brand' size='large'>\n                  Apply\n                </Button>\n              </DrawerFooter>\n            </DrawerContent>\n          </Drawer>\n        </DrawerHeader>\n\n        <DrawerBody>\n          <VStack gap={12} align='start'>\n            <Text>This is Level 1 drawer. Click below to open nested drawers:</Text>\n\n            <ContentPlaceholder height={300} />\n          </VStack>\n        </DrawerBody>\n\n        <DrawerFooter>\n          <DrawerClose asChild>\n            <Button variant='ghost' color='neutral' size='large'>\n              Cancel\n            </Button>\n          </DrawerClose>\n          <Button variant='primary' color='brand' size='large'>\n            Save\n          </Button>\n        </DrawerFooter>\n      </DrawerContent>\n    </Drawer>\n  );\n};",
          "storyFile": "Drawer/Drawer.stories.tsx",
          "storyTitle": "Overlay/Drawer",
          "description": "A drawer from a drawer: same family, so the outer one steps back and the depth is legible."
        },
        {
          "name": "WithNestedDialog",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Dialog, DialogBody, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@wallarm-org/design-system/Dialog';\nimport { Drawer, DrawerBody, DrawerContent, DrawerHeader, DrawerTitle, DrawerTrigger } from '@wallarm-org/design-system/Drawer';\nimport { VStack } from '@wallarm-org/design-system/Stack';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const WithNestedDialog = () => {\n  return (\n    <Drawer>\n      <DrawerTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Open drawer with dialog inside\n        </Button>\n      </DrawerTrigger>\n\n      <DrawerContent>\n        <DrawerHeader>\n          <DrawerTitle>Drawer stays in place</DrawerTitle>\n        </DrawerHeader>\n\n        <DrawerBody>\n          <VStack gap={12} align='start'>\n            <Text>Opening the dialog below must not scale or shift this drawer.</Text>\n\n            <Dialog>\n              <DialogTrigger asChild>\n                <Button variant='outline' color='neutral'>\n                  Open dialog\n                </Button>\n              </DialogTrigger>\n\n              <DialogContent>\n                <DialogHeader>\n                  <DialogTitle>Dialog over a drawer</DialogTitle>\n                </DialogHeader>\n\n                <DialogBody>\n                  <ContentPlaceholder height={150} />\n                </DialogBody>\n              </DialogContent>\n            </Dialog>\n          </VStack>\n        </DrawerBody>\n      </DrawerContent>\n    </Drawer>\n  );\n};",
          "storyFile": "Drawer/Drawer.stories.tsx",
          "storyTitle": "Overlay/Drawer",
          "description": "A dialog opened from a drawer — different family, so the drawer stays put rather than\nscaling. That separation is what `kind` exists for."
        },
        {
          "name": "WithNestedSelect",
          "code": "import { createListCollection } from '@ark-ui/react/collection';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Drawer, DrawerBody, DrawerContent, DrawerHeader, DrawerTitle, DrawerTrigger } from '@wallarm-org/design-system/Drawer';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { PanelRight } from '@wallarm-org/design-system/icons';\nimport { Select, SelectButton, SelectContent, SelectOption, SelectOptionIndicator, SelectOptionText, SelectPositioner } from '@wallarm-org/design-system/Select';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const WithNestedSelect = () => {\n  const collection = createListCollection({\n    items: [\n      { label: 'React', value: 'react' },\n      { label: 'Vue', value: 'vue' },\n      { label: 'Angular', value: 'angular' },\n    ],\n  });\n\n  return (\n    <Drawer>\n      <DrawerTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Open drawer with nested select\n        </Button>\n      </DrawerTrigger>\n\n      <DrawerContent>\n        <DrawerHeader>\n          <DrawerTitle>[Level 1] Main Drawer</DrawerTitle>\n\n          <Drawer>\n            <DrawerTrigger asChild>\n              <Button variant='ghost' color='neutral' size='small'>\n                <PanelRight />\n                Open nested drawer\n              </Button>\n            </DrawerTrigger>\n\n            <DrawerContent>\n              <DrawerHeader>\n                <DrawerTitle>[Level 2] With Select</DrawerTitle>\n              </DrawerHeader>\n\n              <DrawerBody>\n                <VStack gap={12} align='start'>\n                  <Select collection={collection} data-testid='nested-select'>\n                    <SelectButton />\n\n                    <SelectPositioner>\n                      <SelectContent>\n                        {collection.items.map(item => (\n                          <SelectOption key={item.value} item={item}>\n                            <SelectOptionText>{item.label}</SelectOptionText>\n                            <SelectOptionIndicator />\n                          </SelectOption>\n                        ))}\n                      </SelectContent>\n                    </SelectPositioner>\n                  </Select>\n\n                  <DropdownMenu data-testid='nested-dropdown'>\n                    <DropdownMenuTrigger asChild>\n                      <Button variant='outline' color='neutral'>\n                        Open menu\n                      </Button>\n                    </DropdownMenuTrigger>\n                    <DropdownMenuContent>\n                      <DropdownMenuItem>First action</DropdownMenuItem>\n                      <DropdownMenuItem>Second action</DropdownMenuItem>\n                    </DropdownMenuContent>\n                  </DropdownMenu>\n                </VStack>\n              </DrawerBody>\n            </DrawerContent>\n          </Drawer>\n        </DrawerHeader>\n\n        <DrawerBody>\n          <ContentPlaceholder height={200} />\n        </DrawerBody>\n      </DrawerContent>\n    </Drawer>\n  );\n};",
          "storyFile": "Drawer/Drawer.stories.tsx",
          "storyTitle": "Overlay/Drawer",
          "description": "A `Select` inside a drawer, checking its menu escapes the panel instead of being clipped."
        },
        {
          "name": "WithTabs",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Drawer, DrawerBody, DrawerClose, DrawerContent, DrawerFooter, DrawerHeader, DrawerTitle, DrawerTrigger } from '@wallarm-org/design-system/Drawer';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@wallarm-org/design-system/Tabs';\n\nexport const WithTabs = () => {\n  const [activeTab, setActiveTab] = useState('tab1');\n\n  return (\n    <Drawer width={960}>\n      <DrawerTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Open Drawer with Tabs\n        </Button>\n      </DrawerTrigger>\n\n      <DrawerContent>\n        <Tabs value={activeTab} onChange={setActiveTab} asChild>\n          <DrawerHeader>\n            <DrawerTitle>Tabbed Content</DrawerTitle>\n          </DrawerHeader>\n\n          <TabsList>\n            <TabsTrigger value='tab1'>General</TabsTrigger>\n            <TabsTrigger value='tab2'>Settings</TabsTrigger>\n            <TabsTrigger value='tab3'>Advanced</TabsTrigger>\n          </TabsList>\n\n          <DrawerBody>\n            <div className='pt-12'>\n              <TabsContent value='tab1'>\n                <h3 className='text-lg font-medium mb-8'>General Settings</h3>\n                <ContentPlaceholder height={300} />\n              </TabsContent>\n              <TabsContent value='tab2'>\n                <h3 className='text-lg font-medium mb-8'>Configuration</h3>\n                <ContentPlaceholder height={300} />\n              </TabsContent>\n              <TabsContent value='tab3'>\n                <h3 className='text-lg font-medium mb-8'>Advanced Options</h3>\n                <ContentPlaceholder height={300} />\n              </TabsContent>\n            </div>\n          </DrawerBody>\n\n          <DrawerFooter>\n            <DrawerClose asChild>\n              <Button variant='ghost' color='neutral' size='large'>\n                Cancel\n              </Button>\n            </DrawerClose>\n            <Button variant='primary' color='brand' size='large'>\n              Apply Settings\n            </Button>\n          </DrawerFooter>\n        </Tabs>\n      </DrawerContent>\n    </Drawer>\n  );\n};",
          "storyFile": "Drawer/Drawer.stories.tsx",
          "storyTitle": "Overlay/Drawer",
          "description": "Tabs inside a drawer, which suits a panel with several facets of one subject."
        }
      ]
    },
    {
      "name": "DropdownMenu",
      "description": "A menu of actions hanging off a trigger — reach for `Select` when the reader is choosing a value for a form, since a menu runs commands rather than holding an answer. Leave the primary action visible as a `Button` and put only the secondary ones in here; past roughly ten items, group them or move them somewhere with room.",
      "importPath": "@wallarm-org/design-system/DropdownMenu",
      "props": [
        {
          "name": "open",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultOpen",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "onOpenChange",
          "type": "((open: boolean) => void) | undefined",
          "required": false
        },
        {
          "name": "modal",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "anchorPoint",
          "type": "{ x: number; y: number; } | undefined",
          "required": false,
          "description": "Virtual anchor point for positioning without a trigger element"
        },
        {
          "name": "positioning",
          "type": "PositioningOptions | undefined",
          "required": false,
          "description": "Override default positioning config"
        },
        {
          "name": "highlightedValue",
          "type": "string | null | undefined",
          "required": false,
          "description": "Programmatically control which item is highlighted"
        },
        {
          "name": "onHighlightChange",
          "type": "((details: HighlightChangeDetails) => void) | undefined",
          "required": false,
          "description": "Callback when the highlighted item changes (e.g. on mouse hover)"
        },
        {
          "name": "closeOnSelect",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether selecting an item closes the menu (default true)"
        },
        {
          "name": "onRequestDismiss",
          "type": "((event: LayerDismissEvent) => void) | undefined",
          "required": false,
          "description": "Called when another layer asks this menu to dismiss — e.g. a layer below it in the stack is\nremoved. Call `event.preventDefault()` to keep the menu open."
        },
        {
          "name": "ids",
          "type": "ElementIds | undefined",
          "required": false,
          "description": "Override the trigger element's id. Pass the same id to another\ncompound component's `ids.trigger` (e.g. `Tooltip`, `Popover`) to\ncompose their triggers on one element via nested `asChild` without an\nextra wrapper node — otherwise the outer trigger's id wins and the\nother component can't find its own anchor."
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "variant",
          "options": [
            "default",
            "brand",
            "destructive"
          ]
        },
        {
          "name": "inset",
          "options": [
            "true"
          ]
        },
        {
          "name": "sticky",
          "options": [
            "true"
          ]
        }
      ],
      "subComponents": [
        {
          "name": "DropdownMenuCheckboxItem",
          "props": [
            {
              "name": "checked",
              "type": "boolean",
              "required": true
            },
            {
              "name": "onCheckedChange",
              "type": "((checked: boolean) => void) | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | undefined",
              "required": false,
              "description": "Optional — auto-generated via useId() if omitted"
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "closeOnSelect",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "variant",
              "type": "{ default: string; brand: string; destructive: string; }",
              "required": false,
              "defaultValue": "default"
            },
            {
              "name": "inset",
              "type": "{ true: string; }",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "DropdownMenuContextTrigger",
          "props": [
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "DropdownMenuItem",
          "props": [
            {
              "name": "inset",
              "type": "boolean | undefined",
              "required": false,
              "defaultValue": "false"
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "onSelect",
              "type": "(() => void) | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | undefined",
              "required": false,
              "description": "Explicit value for programmatic highlighting via highlightedValue"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "variant",
              "type": "{ default: string; brand: string; destructive: string; }",
              "required": false,
              "defaultValue": "default"
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "DropdownMenuRadioGroup",
          "props": [
            {
              "name": "value",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onValueChange",
              "type": "((details: { value: string; }) => void) | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "DropdownMenuRadioItem",
          "props": [
            {
              "name": "value",
              "type": "string",
              "required": true,
              "description": "Required — identifies this radio within the group"
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "closeOnSelect",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "variant",
              "type": "{ default: string; brand: string; destructive: string; }",
              "required": false,
              "defaultValue": "default"
            },
            {
              "name": "inset",
              "type": "{ true: string; }",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "DropdownMenuTrigger",
          "props": [
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | undefined",
              "required": false,
              "description": "A real `<button>`'s `value` DOM property is always a string at runtime.\nNarrowed from the native `ButtonHTMLAttributes['value']`\n(`string | number | readonly string[] | undefined`) to match Ark UI's\n`Menu.Trigger`, which also uses `value` to identify this trigger\n(see `onTriggerValueChange`). The prop still forwards to the real DOM node."
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "DropdownMenuTriggerItem",
          "props": [
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "inset",
              "type": "boolean | undefined",
              "required": false,
              "defaultValue": "false"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "variant",
              "type": "{ default: string; brand: string; destructive: string; }",
              "required": false,
              "defaultValue": "default"
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuTrigger, DropdownMenuTriggerItem } from '@wallarm-org/design-system/DropdownMenu';\nimport { Kbd, KbdGroup } from '@wallarm-org/design-system/Kbd';\n\nexport const Basic = () => (\n  <DropdownMenu data-testid='dropdown-menu'>\n    <DropdownMenuTrigger asChild>\n      <Button variant='outline' color='neutral'>\n        Open\n      </Button>\n    </DropdownMenuTrigger>\n    <DropdownMenuContent>\n      <DropdownMenuLabel>My Account</DropdownMenuLabel>\n      <DropdownMenuGroup>\n        <DropdownMenuItem>\n          Profile\n          <DropdownMenuShortcut>\n            <KbdGroup>\n              <Kbd>⌘</Kbd>\n              <Kbd>P</Kbd>\n            </KbdGroup>\n          </DropdownMenuShortcut>\n        </DropdownMenuItem>\n        <DropdownMenuItem>\n          Billing\n          <DropdownMenuShortcut>\n            <KbdGroup>\n              <Kbd>⌘</Kbd>\n              <Kbd>B</Kbd>\n            </KbdGroup>\n          </DropdownMenuShortcut>\n        </DropdownMenuItem>\n        <DropdownMenuItem>\n          Settings\n          <DropdownMenuShortcut>\n            <KbdGroup>\n              <Kbd>⌘</Kbd>\n              <Kbd>S</Kbd>\n            </KbdGroup>\n          </DropdownMenuShortcut>\n        </DropdownMenuItem>\n        <DropdownMenuItem>\n          Keyboard shortcuts super\n          <DropdownMenuShortcut>\n            <KbdGroup>\n              <Kbd>⌘</Kbd>\n              <Kbd>K</Kbd>\n            </KbdGroup>\n          </DropdownMenuShortcut>\n        </DropdownMenuItem>\n      </DropdownMenuGroup>\n\n      <DropdownMenuSeparator />\n\n      <DropdownMenuGroup>\n        <DropdownMenuItem>Team</DropdownMenuItem>\n        <DropdownMenu>\n          <DropdownMenuTriggerItem>Invite users</DropdownMenuTriggerItem>\n          <DropdownMenuContent>\n            <DropdownMenuItem>Email</DropdownMenuItem>\n            <DropdownMenuItem>Message</DropdownMenuItem>\n            <DropdownMenuSeparator />\n            <DropdownMenuItem>More...</DropdownMenuItem>\n          </DropdownMenuContent>\n        </DropdownMenu>\n        <DropdownMenuItem>\n          New Team\n          <DropdownMenuShortcut>\n            <KbdGroup>\n              <Kbd>⌘</Kbd>\n              <Kbd>T</Kbd>\n            </KbdGroup>\n          </DropdownMenuShortcut>\n        </DropdownMenuItem>\n      </DropdownMenuGroup>\n\n      <DropdownMenuSeparator />\n\n      <DropdownMenuItem>GitHub</DropdownMenuItem>\n      <DropdownMenuItem>Support</DropdownMenuItem>\n      <DropdownMenuItem disabled>API</DropdownMenuItem>\n      <DropdownMenuSeparator />\n      <DropdownMenuItem variant='destructive'>\n        Log out\n        <DropdownMenuShortcut>\n          <KbdGroup>\n            <Kbd>⌘</Kbd>\n            <Kbd>Q</Kbd>\n          </KbdGroup>\n        </DropdownMenuShortcut>\n      </DropdownMenuItem>\n    </DropdownMenuContent>\n  </DropdownMenu>\n);",
          "storyFile": "DropdownMenu/DropdownMenu.stories.tsx",
          "storyTitle": "Actions/DropdownMenu",
          "description": "The smallest composition — `DropdownMenuTrigger` with `asChild`, so your own `Button`\nbecomes the trigger rather than being wrapped in one."
        },
        {
          "name": "Context",
          "code": "import { DropdownMenu, DropdownMenuContent, DropdownMenuContextTrigger, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuTriggerItem } from '@wallarm-org/design-system/DropdownMenu';\nimport { Kbd, KbdGroup } from '@wallarm-org/design-system/Kbd';\n\nexport const Context = () => (\n  <DropdownMenu>\n    <DropdownMenuContextTrigger asChild>\n      <div className='flex items-center justify-center w-300 h-192 border border-border-primary border-dashed rounded-8'>\n        Right click here\n      </div>\n    </DropdownMenuContextTrigger>\n    <DropdownMenuContent>\n      <DropdownMenuLabel>My Account</DropdownMenuLabel>\n      <DropdownMenuGroup>\n        <DropdownMenuItem>\n          Profile\n          <DropdownMenuShortcut>\n            <KbdGroup>\n              <Kbd>⌘</Kbd>\n              <Kbd>P</Kbd>\n            </KbdGroup>\n          </DropdownMenuShortcut>\n        </DropdownMenuItem>\n        <DropdownMenuItem>\n          Billing\n          <DropdownMenuShortcut>\n            <KbdGroup>\n              <Kbd>⌘</Kbd>\n              <Kbd>B</Kbd>\n            </KbdGroup>\n          </DropdownMenuShortcut>\n        </DropdownMenuItem>\n        <DropdownMenuItem>\n          Settings\n          <DropdownMenuShortcut>\n            <KbdGroup>\n              <Kbd>⌘</Kbd>\n              <Kbd>S</Kbd>\n            </KbdGroup>\n          </DropdownMenuShortcut>\n        </DropdownMenuItem>\n        <DropdownMenuItem>\n          Keyboard shortcuts super\n          <DropdownMenuShortcut>\n            <KbdGroup>\n              <Kbd>⌘</Kbd>\n              <Kbd>K</Kbd>\n            </KbdGroup>\n          </DropdownMenuShortcut>\n        </DropdownMenuItem>\n      </DropdownMenuGroup>\n\n      <DropdownMenuSeparator />\n\n      <DropdownMenuGroup>\n        <DropdownMenuItem>Team</DropdownMenuItem>\n        <DropdownMenu>\n          <DropdownMenuTriggerItem>Invite users</DropdownMenuTriggerItem>\n          <DropdownMenuContent>\n            <DropdownMenuItem>Email</DropdownMenuItem>\n            <DropdownMenuItem>Message</DropdownMenuItem>\n            <DropdownMenuSeparator />\n            <DropdownMenuItem>More...</DropdownMenuItem>\n          </DropdownMenuContent>\n        </DropdownMenu>\n        <DropdownMenuItem>\n          New Team\n          <DropdownMenuShortcut>\n            <KbdGroup>\n              <Kbd>⌘</Kbd>\n              <Kbd>T</Kbd>\n            </KbdGroup>\n          </DropdownMenuShortcut>\n        </DropdownMenuItem>\n      </DropdownMenuGroup>\n\n      <DropdownMenuSeparator />\n\n      <DropdownMenuItem>GitHub</DropdownMenuItem>\n      <DropdownMenuItem>Support</DropdownMenuItem>\n      <DropdownMenuItem disabled>API</DropdownMenuItem>\n      <DropdownMenuSeparator />\n      <DropdownMenuItem variant='destructive'>\n        Log out\n        <DropdownMenuShortcut>\n          <KbdGroup>\n            <Kbd>⌘</Kbd>\n            <Kbd>Q</Kbd>\n          </KbdGroup>\n        </DropdownMenuShortcut>\n      </DropdownMenuItem>\n    </DropdownMenuContent>\n  </DropdownMenu>\n);",
          "storyFile": "DropdownMenu/DropdownMenu.stories.tsx",
          "storyTitle": "Actions/DropdownMenu",
          "description": "`DropdownMenuContextTrigger` opens the same menu on right-click, and\n`DropdownMenuTriggerItem` nests a submenu inside it. Always leave a left-click route to the same\nactions — a right-click-only affordance is undiscoverable."
        },
        {
          "name": "WithDescriptions",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuItemContent, DropdownMenuItemDescription, DropdownMenuItemText, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { CirclePlus, Plus } from '@wallarm-org/design-system/icons';\nimport { Kbd, KbdGroup } from '@wallarm-org/design-system/Kbd';\n\nexport const WithDescriptions = () => (\n  <DropdownMenu>\n    <DropdownMenuTrigger asChild>\n      <Button variant='outline' color='neutral'>\n        <Plus />\n        Add Widget\n      </Button>\n    </DropdownMenuTrigger>\n    <DropdownMenuContent>\n      <DropdownMenuItem>\n        <DropdownMenuItemContent>\n          <DropdownMenuItemText>Bar-volume chart</DropdownMenuItemText>\n          <DropdownMenuItemDescription>Description</DropdownMenuItemDescription>\n        </DropdownMenuItemContent>\n      </DropdownMenuItem>\n      <DropdownMenuItem>\n        <DropdownMenuItemContent>\n          <DropdownMenuItemText>Canvas</DropdownMenuItemText>\n          <DropdownMenuItemDescription>Description</DropdownMenuItemDescription>\n        </DropdownMenuItemContent>\n      </DropdownMenuItem>\n      <DropdownMenuItem>\n        <DropdownMenuItemContent>\n          <DropdownMenuItemText>Attacks heat-map</DropdownMenuItemText>\n          <DropdownMenuItemDescription>Description</DropdownMenuItemDescription>\n        </DropdownMenuItemContent>\n        <DropdownMenuShortcut>\n          <KbdGroup>\n            <Kbd>⌘</Kbd>\n            <Kbd>Q</Kbd>\n          </KbdGroup>\n        </DropdownMenuShortcut>\n      </DropdownMenuItem>\n      <DropdownMenuSeparator />\n\n      <DropdownMenuItem variant='brand'>\n        <CirclePlus />\n        <DropdownMenuItemText>Request custom widget</DropdownMenuItemText>\n      </DropdownMenuItem>\n    </DropdownMenuContent>\n  </DropdownMenu>\n);",
          "storyFile": "DropdownMenu/DropdownMenu.stories.tsx",
          "storyTitle": "Actions/DropdownMenu",
          "description": "`DropdownMenuItemContent` pairs `DropdownMenuItemText` with\n`DropdownMenuItemDescription` for a second line. Descriptions make a menu tall quickly, which is\nwhen separators start doing real work."
        },
        {
          "name": "WithIcons",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuItemContent, DropdownMenuItemIcon, DropdownMenuItemText, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { CirclePlus, Earth, LayoutTemplate, Maximize, Plus } from '@wallarm-org/design-system/icons';\nimport { Kbd, KbdGroup } from '@wallarm-org/design-system/Kbd';\n\nexport const WithIcons = () => (\n  <DropdownMenu>\n    <DropdownMenuTrigger asChild>\n      <Button variant='outline' color='neutral'>\n        <Plus />\n        Add Widget\n      </Button>\n    </DropdownMenuTrigger>\n    <DropdownMenuContent>\n      <DropdownMenuItem>\n        <DropdownMenuItemIcon>\n          <LayoutTemplate />\n        </DropdownMenuItemIcon>\n        <DropdownMenuItemContent>\n          <DropdownMenuItemText>Bar-volume chart</DropdownMenuItemText>\n        </DropdownMenuItemContent>\n      </DropdownMenuItem>\n      <DropdownMenuItem>\n        <DropdownMenuItemIcon>\n          <Maximize />\n        </DropdownMenuItemIcon>\n        <DropdownMenuItemContent>\n          <DropdownMenuItemText>Canvas</DropdownMenuItemText>\n        </DropdownMenuItemContent>\n      </DropdownMenuItem>\n      <DropdownMenuItem>\n        <DropdownMenuItemIcon>\n          <Earth />\n        </DropdownMenuItemIcon>\n        <DropdownMenuItemText>Attacks heat-map</DropdownMenuItemText>\n        <DropdownMenuShortcut>\n          <KbdGroup>\n            <Kbd>⌘</Kbd>\n            <Kbd>Q</Kbd>\n          </KbdGroup>\n        </DropdownMenuShortcut>\n      </DropdownMenuItem>\n      <DropdownMenuSeparator />\n\n      <DropdownMenuItem variant='brand'>\n        <CirclePlus />\n        <DropdownMenuItemText>Request custom widget</DropdownMenuItemText>\n      </DropdownMenuItem>\n    </DropdownMenuContent>\n  </DropdownMenu>\n);",
          "storyFile": "DropdownMenu/DropdownMenu.stories.tsx",
          "storyTitle": "Actions/DropdownMenu",
          "description": "`DropdownMenuItemIcon` sits before the label. Icon every item in a group or none of\nthem — a half-iconned list reads as though some items are missing theirs."
        },
        {
          "name": "WithFooter",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuFooter, DropdownMenuItem, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { Kbd, KbdGroup } from '@wallarm-org/design-system/Kbd';\n\nexport const WithFooter = () => (\n  <DropdownMenu>\n    <DropdownMenuTrigger asChild>\n      <Button variant='outline' color='neutral'>\n        Open\n      </Button>\n    </DropdownMenuTrigger>\n    <DropdownMenuContent>\n      <DropdownMenuItem>Profile</DropdownMenuItem>\n      <DropdownMenuItem>Billing</DropdownMenuItem>\n      <DropdownMenuItem>Settings</DropdownMenuItem>\n      <DropdownMenuItem>Notifications</DropdownMenuItem>\n      <DropdownMenuItem>Integrations</DropdownMenuItem>\n      <DropdownMenuItem>Security</DropdownMenuItem>\n      <DropdownMenuItem>API Keys</DropdownMenuItem>\n      <DropdownMenuItem>Webhooks</DropdownMenuItem>\n      <DropdownMenuItem>Audit Log</DropdownMenuItem>\n      <DropdownMenuItem>Team Members</DropdownMenuItem>\n      <DropdownMenuItem>Permissions</DropdownMenuItem>\n      <DropdownMenuItem>Usage</DropdownMenuItem>\n      <DropdownMenuFooter>\n        <span className='flex items-center gap-4'>\n          <KbdGroup>\n            <Kbd>↑</Kbd>\n            <Kbd>↓</Kbd>\n          </KbdGroup>\n          to navigate\n        </span>\n        <span className='flex items-center gap-4'>\n          <KbdGroup>\n            <Kbd>↵</Kbd>\n          </KbdGroup>\n          to select\n        </span>\n      </DropdownMenuFooter>\n    </DropdownMenuContent>\n  </DropdownMenu>\n);",
          "storyFile": "DropdownMenu/DropdownMenu.stories.tsx",
          "storyTitle": "Actions/DropdownMenu",
          "description": "`DropdownMenuFooter` bleeds to the panel edge under a divider and renders at secondary\nemphasis, so it suits a persistent link or count rather than an action competing with the items."
        },
        {
          "name": "WithDescriptionAndIcons",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuItemContent, DropdownMenuItemDescription, DropdownMenuItemIcon, DropdownMenuItemText, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { CirclePlus, Earth, LayoutTemplate, Maximize, Plus } from '@wallarm-org/design-system/icons';\nimport { Kbd, KbdGroup } from '@wallarm-org/design-system/Kbd';\n\nexport const WithDescriptionAndIcons = () => (\n  <DropdownMenu>\n    <DropdownMenuTrigger asChild>\n      <Button variant='outline' color='neutral'>\n        <Plus />\n        Add Widget\n      </Button>\n    </DropdownMenuTrigger>\n    <DropdownMenuContent>\n      <DropdownMenuItem>\n        <DropdownMenuItemIcon>\n          <LayoutTemplate />\n        </DropdownMenuItemIcon>\n        <DropdownMenuItemContent>\n          <DropdownMenuItemText>Bar-volume chart</DropdownMenuItemText>\n          <DropdownMenuItemDescription>Description</DropdownMenuItemDescription>\n        </DropdownMenuItemContent>\n      </DropdownMenuItem>\n      <DropdownMenuItem>\n        <DropdownMenuItemIcon>\n          <Maximize />\n        </DropdownMenuItemIcon>\n        <DropdownMenuItemContent>\n          <DropdownMenuItemText>Canvas</DropdownMenuItemText>\n          <DropdownMenuItemDescription>Description</DropdownMenuItemDescription>\n        </DropdownMenuItemContent>\n      </DropdownMenuItem>\n      <DropdownMenuItem>\n        <DropdownMenuItemIcon>\n          <Earth />\n        </DropdownMenuItemIcon>\n        <DropdownMenuItemContent>\n          <DropdownMenuItemText>Attacks heat-map</DropdownMenuItemText>\n          <DropdownMenuItemDescription>Description</DropdownMenuItemDescription>\n        </DropdownMenuItemContent>\n        <DropdownMenuShortcut>\n          <KbdGroup>\n            <Kbd>⌘</Kbd>\n            <Kbd>Q</Kbd>\n          </KbdGroup>\n        </DropdownMenuShortcut>\n      </DropdownMenuItem>\n      <DropdownMenuSeparator />\n\n      <DropdownMenuItem variant='brand'>\n        <CirclePlus />\n        <DropdownMenuItemText>Request custom widget</DropdownMenuItemText>\n      </DropdownMenuItem>\n    </DropdownMenuContent>\n  </DropdownMenu>\n);",
          "storyFile": "DropdownMenu/DropdownMenu.stories.tsx",
          "storyTitle": "Actions/DropdownMenu",
          "description": "Icons and descriptions together, which is the widest an item gets. Past this the\nmenu is doing a panel's job — reach for a `Popover`."
        },
        {
          "name": "WithCheckboxItems",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuLabel, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\n\nexport const WithCheckboxItems = () => {\n  const [bold, setBold] = useState(true);\n  const [italic, setItalic] = useState(false);\n  const [underline, setUnderline] = useState(true);\n\n  return (\n    <DropdownMenu data-testid='dropdown-menu'>\n      <DropdownMenuTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Text style\n        </Button>\n      </DropdownMenuTrigger>\n      <DropdownMenuContent>\n        <DropdownMenuLabel>Text style</DropdownMenuLabel>\n        <DropdownMenuCheckboxItem checked={bold} onCheckedChange={setBold}>\n          Bold\n        </DropdownMenuCheckboxItem>\n        <DropdownMenuCheckboxItem checked={italic} onCheckedChange={setItalic}>\n          Italic\n        </DropdownMenuCheckboxItem>\n        <DropdownMenuCheckboxItem checked={underline} onCheckedChange={setUnderline}>\n          Underline\n        </DropdownMenuCheckboxItem>\n        <DropdownMenuCheckboxItem checked={false} disabled>\n          Strikethrough\n        </DropdownMenuCheckboxItem>\n      </DropdownMenuContent>\n    </DropdownMenu>\n  );\n};",
          "storyFile": "DropdownMenu/DropdownMenu.stories.tsx",
          "storyTitle": "Actions/DropdownMenu",
          "description": "`DropdownMenuCheckboxItem` for options that aren't mutually exclusive. Selecting one\nleaves the menu open, so several can be toggled in a single visit."
        },
        {
          "name": "WithRadioGroup",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\n\nexport const WithRadioGroup = () => {\n  const [view, setView] = useState('list');\n\n  const handleViewChange = (details: { value: string }) => {\n    setView(details.value);\n  };\n\n  return (\n    <DropdownMenu data-testid='dropdown-menu'>\n      <DropdownMenuTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          View mode\n        </Button>\n      </DropdownMenuTrigger>\n      <DropdownMenuContent>\n        <DropdownMenuLabel>View mode</DropdownMenuLabel>\n        <DropdownMenuRadioGroup value={view} onValueChange={handleViewChange}>\n          <DropdownMenuRadioItem value='list'>List</DropdownMenuRadioItem>\n          <DropdownMenuRadioItem value='grid'>Grid</DropdownMenuRadioItem>\n          <DropdownMenuRadioItem value='compact' disabled>\n            Compact\n          </DropdownMenuRadioItem>\n        </DropdownMenuRadioGroup>\n      </DropdownMenuContent>\n    </DropdownMenu>\n  );\n};",
          "storyFile": "DropdownMenu/DropdownMenu.stories.tsx",
          "storyTitle": "Actions/DropdownMenu",
          "description": "`DropdownMenuRadioGroup` for one-of-many. It also stays open on select, so the reader\nsees the indicator move before dismissing it themselves."
        },
        {
          "name": "WithMixedSelectionItems",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\n\nexport const WithMixedSelectionItems = () => {\n  const [bold, setBold] = useState(true);\n  const [italic, setItalic] = useState(false);\n  const [view, setView] = useState('list');\n\n  const handleViewChange = (details: { value: string }) => {\n    setView(details.value);\n  };\n\n  return (\n    <DropdownMenu data-testid='dropdown-menu'>\n      <DropdownMenuTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Editor settings\n        </Button>\n      </DropdownMenuTrigger>\n      <DropdownMenuContent>\n        <DropdownMenuLabel>Text style</DropdownMenuLabel>\n        <DropdownMenuCheckboxItem checked={bold} onCheckedChange={setBold}>\n          Bold\n        </DropdownMenuCheckboxItem>\n        <DropdownMenuCheckboxItem checked={italic} onCheckedChange={setItalic}>\n          Italic\n        </DropdownMenuCheckboxItem>\n\n        <DropdownMenuSeparator />\n\n        <DropdownMenuLabel>View mode</DropdownMenuLabel>\n        <DropdownMenuRadioGroup value={view} onValueChange={handleViewChange}>\n          <DropdownMenuRadioItem value='list'>List</DropdownMenuRadioItem>\n          <DropdownMenuRadioItem value='grid'>Grid</DropdownMenuRadioItem>\n        </DropdownMenuRadioGroup>\n\n        <DropdownMenuSeparator />\n\n        <DropdownMenuItem variant='destructive'>Reset to defaults</DropdownMenuItem>\n      </DropdownMenuContent>\n    </DropdownMenu>\n  );\n};",
          "storyFile": "DropdownMenu/DropdownMenu.stories.tsx",
          "storyTitle": "Actions/DropdownMenu",
          "description": "Commands, checkboxes and a radio group in one menu. `DropdownMenuLabel` and\n`DropdownMenuSeparator` are what keep the three kinds from reading as one flat list."
        }
      ]
    },
    {
      "name": "EmptyState",
      "description": "EmptyState communicates that a space has no content — whether because a collection is empty, a search returned no matches, or a filter is too narrow. Use compound components: EmptyStateIllustration, EmptyStateMessage, EmptyStateTitle, EmptyStateDescription, EmptyStateActions, EmptyStateLink.\n\n`type` picks the scale, and every slot follows it from context — no need to restate it on children. `collection-empty` is the page-level treatment: a medallion (a 36px raised tile holding a 20px icon), a pixel title, and room for actions plus a link. `no-results` is the compact inline treatment for a card, dropdown or select menu: 240px wide, with a 14px secondary title. An illustration always carries the medallion — there is no bare glyph.\n\nScale is not the same question as cause. A page-level \"no filter matches\" state still uses `collection-empty` — it just drops the create CTA and offers a neutral one instead.",
      "importPath": "@wallarm-org/design-system/EmptyState",
      "props": [
        {
          "name": "type",
          "type": "\"collection-empty\" | \"no-results\" | undefined",
          "required": false,
          "defaultValue": "collection-empty"
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "type",
          "options": [
            "collection-empty",
            "no-results"
          ],
          "defaultValue": "collection-empty"
        }
      ],
      "subComponents": [
        {
          "name": "EmptyStateActions",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "EmptyStateDescription",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "EmptyStateIllustration",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "EmptyStateLink",
          "props": [
            {
              "name": "download",
              "type": "any",
              "required": false
            },
            {
              "name": "href",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "hrefLang",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "target",
              "type": "HTMLAttributeAnchorTarget | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "{ true: string; }",
              "required": false
            },
            {
              "name": "size",
              "type": "{ xs: string; sm: string; md: string; lg: string; xl: string; }",
              "required": false,
              "defaultValue": "md"
            },
            {
              "name": "weight",
              "type": "{ regular: string; medium: string; }",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "EmptyStateMessage",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "EmptyStateTitle",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "CollectionEmpty",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { EmptyState, EmptyStateActions, EmptyStateDescription, EmptyStateIllustration, EmptyStateLink, EmptyStateMessage, EmptyStateTitle } from '@wallarm-org/design-system/EmptyState';\nimport { Shapes } from '@wallarm-org/design-system/icons';\n\nexport const CollectionEmpty = () => (\n  <EmptyState>\n    <EmptyStateIllustration>\n      <Shapes />\n    </EmptyStateIllustration>\n    <EmptyStateMessage>\n      <EmptyStateTitle>Title text goes here</EmptyStateTitle>\n      <EmptyStateDescription>\n        Description text explains what happened and what the user can do next.\n        <br />\n        One to two sentences maximum.\n      </EmptyStateDescription>\n    </EmptyStateMessage>\n    <EmptyStateActions>\n      <Button size='medium'>Reset filters</Button>\n      <Button size='medium' variant='outline' color='neutral'>\n        Refresh\n      </Button>\n    </EmptyStateActions>\n    <EmptyStateLink href='#'>Link</EmptyStateLink>\n  </EmptyState>\n);",
          "storyFile": "EmptyState/EmptyState.stories.tsx",
          "storyTitle": "Pages/EmptyState",
          "description": "The full form, 256–560px wide: illustration, title, description, actions, and a learn-more `EmptyStateLink`. Titles read as an invitation rather than an accusation — 'Explore your APIs', not 'You have no APIs'."
        },
        {
          "name": "NoFilterResults",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { EmptyState, EmptyStateActions, EmptyStateDescription, EmptyStateIllustration, EmptyStateMessage, EmptyStateTitle } from '@wallarm-org/design-system/EmptyState';\nimport { Zap } from '@wallarm-org/design-system/icons';\n\nexport const NoFilterResults = () => (\n  <EmptyState>\n    <EmptyStateIllustration>\n      <Zap />\n    </EmptyStateIllustration>\n    <EmptyStateMessage>\n      <EmptyStateTitle>No attacks found</EmptyStateTitle>\n      <EmptyStateDescription>Try to apply different filter or reset it.</EmptyStateDescription>\n    </EmptyStateMessage>\n    <EmptyStateActions>\n      <Button size='medium' variant='outline' color='neutral'>\n        Refresh\n      </Button>\n    </EmptyStateActions>\n  </EmptyState>\n);",
          "storyFile": "EmptyState/EmptyState.stories.tsx",
          "storyTitle": "Pages/EmptyState",
          "description": "The page-level state for a search or filter that matched nothing. Same\n`collection-empty` scale as an untouched collection — the difference is the\nCTA: a neutral \"get back to something\" action, never a create action, because\nthe data exists and the query is what needs changing."
        },
        {
          "name": "Minimal",
          "code": "import { EmptyState, EmptyStateDescription, EmptyStateMessage, EmptyStateTitle } from '@wallarm-org/design-system/EmptyState';\n\nexport const Minimal = () => (\n  <EmptyState>\n    <EmptyStateMessage>\n      <EmptyStateTitle>No results</EmptyStateTitle>\n      <EmptyStateDescription>Short description</EmptyStateDescription>\n    </EmptyStateMessage>\n  </EmptyState>\n);",
          "storyFile": "EmptyState/EmptyState.stories.tsx",
          "storyTitle": "Pages/EmptyState",
          "description": "The compact state at its spec default: no icon, no actions — just the title\nand subtitle. This is the shape most in-app empty states take."
        },
        {
          "name": "NoResultsExamples",
          "code": "import { Card, CardContent, CardHeader, CardTitle } from '@wallarm-org/design-system/Card';\nimport { EmptyState, EmptyStateDescription, EmptyStateMessage } from '@wallarm-org/design-system/EmptyState';\nimport { Field, FieldLabel } from '@wallarm-org/design-system/Field';\nimport { Select, SelectButton, SelectContent, SelectPositioner } from '@wallarm-org/design-system/Select';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const NoResultsExamples = () => (\n  <HStack gap={32} align='start'>\n    {/* In a chart card */}\n    <Card className='w-[340px]'>\n      <CardHeader>\n        <CardTitle>Bar chart</CardTitle>\n      </CardHeader>\n      <CardContent className='flex items-center justify-center py-48'>\n        <EmptyState type='no-results'>\n          <EmptyStateMessage>\n            <EmptyStateDescription>No data found for selected period</EmptyStateDescription>\n          </EmptyStateMessage>\n        </EmptyState>\n      </CardContent>\n    </Card>\n\n    {/* In a select dropdown */}\n    <VStack gap={4} className='w-[260px]'>\n      <Field>\n        <FieldLabel>Label</FieldLabel>\n        <Select collection={emptyCollection}>\n          <SelectButton placeholder='Select' />\n          <SelectPositioner className='w-[260px]'>\n            <SelectContent />\n          </SelectPositioner>\n        </Select>\n      </Field>\n    </VStack>\n  </HStack>\n);",
          "storyFile": "EmptyState/EmptyState.stories.tsx",
          "storyTitle": "Pages/EmptyState",
          "description": "The compact form in its real homes — a chart card with no data, and a `Select` whose option list came back empty. An empty inside a container stays action-light however it got that way."
        },
        {
          "name": "Medallion",
          "code": "import { EmptyStateIllustration } from '@wallarm-org/design-system/EmptyState';\nimport { ScanLine } from '@wallarm-org/design-system/icons';\nimport { HStack } from '@wallarm-org/design-system/Stack';\nimport { cn } from '@wallarm-org/design-system/utils/cn';\n\nexport const Medallion = () => (\n  <HStack gap={0} className='w-[330px] overflow-hidden rounded-16 border border-border-primary'>\n    {(['bg-bg-surface-1', 'bg-bg-light-primary'] as const).map(surface => (\n      <div key={surface} className={cn('flex flex-1 justify-center py-28', surface)}>\n        <EmptyStateIllustration>\n          <ScanLine />\n        </EmptyStateIllustration>\n      </div>\n    ))}\n  </HStack>\n);",
          "storyFile": "EmptyState/EmptyState.stories.tsx",
          "storyTitle": "Pages/EmptyState",
          "description": "The medallion reads as a lit surface: a top-down gradient, a hairline border,\na soft drop shadow and an inner top highlight. Every layer resolves through\n`--color-component-empty-state-medallion-*` and\n`--shadow-empty-state-medallion`, so it holds up on both the card surface and\nthe slightly darker page surface it sits on — shown here side by side. Use the\ntoolbar theme switcher to check it in dark."
        }
      ]
    },
    {
      "name": "FeedbackPulse",
      "description": "Asks one question in place, for measuring how a change landed without sending the reader to a survey. It is deliberately small and skippable: one question, an optional comment, and a timeout that dismisses it if the reader ignores it.",
      "importPath": "@wallarm-org/design-system/FeedbackPulse",
      "props": [
        {
          "name": "open",
          "type": "boolean",
          "required": true
        },
        {
          "name": "onOpenChange",
          "type": "(open: boolean, reason?: FeedbackPulseCloseReason | undefined) => void",
          "required": true
        },
        {
          "name": "onSubmit",
          "type": "(result: { score: number; comment?: string | undefined; }) => void",
          "required": true
        },
        {
          "name": "question",
          "type": "string | undefined",
          "required": false,
          "defaultValue": "DEFAULT_QUESTION"
        },
        {
          "name": "scaleLabels",
          "type": "readonly [string, string] | undefined",
          "required": false,
          "defaultValue": "DEFAULT_LABELS"
        },
        {
          "name": "showComment",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "true"
        },
        {
          "name": "dismissDuration",
          "type": "number | undefined",
          "required": false,
          "defaultValue": "DEFAULT_DISMISS_MS"
        },
        {
          "name": "confirmationText",
          "type": "string | undefined",
          "required": false,
          "defaultValue": "DEFAULT_CONFIRMATION"
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [],
      "examples": [
        {
          "name": "Playground",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { FeedbackPulse } from '@wallarm-org/design-system/FeedbackPulse';\n\nexport const Playground = () => {\n  // Open on load: the e2e test for the confirmation phase goes straight to this story and clicks\n  // a score, so it depends on the card already being up.\n  const [open, setOpen] = useState(true);\n  return (\n    <div\n      style={{\n        // The card is fixed to the viewport corner, not to this box, so the frame only has to\n        // hold the trigger — a full viewport height here leaves the docs page mostly empty.\n        display: 'flex',\n        minHeight: 120,\n        alignItems: 'center',\n        justifyContent: 'center',\n      }}\n    >\n      <Button variant='outline' color='neutral' onClick={() => setOpen(true)}>\n        Show FeedbackPulse\n      </Button>\n      <FeedbackPulse\n        open={open}\n        onOpenChange={next => setOpen(next)}\n        onSubmit={onSubmit}\n        data-testid='feedback-pulse'\n      />\n    </div>\n  );\n};",
          "storyFile": "FeedbackPulse/FeedbackPulse.stories.tsx",
          "storyTitle": "Overlay/FeedbackPulse",
          "description": "The whole flow end to end — question, rating, optional comment, and the confirmation it shows\nbefore dismissing itself. The card portals to the document rather than sitting in this frame, so\nit appears pinned to the corner of the page and opens as soon as the page loads."
        },
        {
          "name": "Rating",
          "code": "import { FeedbackPulse } from '@wallarm-org/design-system/FeedbackPulse';\n\nexport const Rating = () => (\n  <div style={{ minHeight: '100vh' }}>\n    <FeedbackPulse\n      open\n      onOpenChange={onOpenChange}\n      onSubmit={onSubmit}\n      data-testid='feedback-pulse'\n    />\n  </div>\n);",
          "storyFile": "FeedbackPulse/FeedbackPulse.stories.tsx",
          "storyTitle": "Overlay/FeedbackPulse",
          "tags": [
            "!autodocs"
          ],
          "description": "The rating scale on its own. Keep the question to something a single scale can honestly\nanswer."
        }
      ]
    },
    {
      "name": "Field",
      "description": "The scaffolding around a control — label, description, error and the required marker — so the control itself only has to be the control. Only `Input`, `Textarea` and `Slider` read this context automatically; wrap anything else and you get the layout, but the labelling still has to be wired by hand.",
      "importPath": "@wallarm-org/design-system/Field",
      "props": [
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "disabled",
          "type": "boolean | undefined",
          "required": false,
          "description": "Indicates whether the field is disabled."
        },
        {
          "name": "asChild",
          "type": "boolean | undefined",
          "required": false,
          "description": "Use the provided child element as the default rendered element, combining their props and behavior."
        },
        {
          "name": "target",
          "type": "string | undefined",
          "required": false,
          "description": "The target field item value the label should point to."
        },
        {
          "name": "ids",
          "type": "complex",
          "required": false,
          "description": "The ids of the field parts."
        },
        {
          "name": "readOnly",
          "type": "boolean | undefined",
          "required": false,
          "description": "Indicates whether the field is read-only."
        },
        {
          "name": "required",
          "type": "boolean | undefined",
          "required": false,
          "description": "Indicates whether the field is required."
        },
        {
          "name": "invalid",
          "type": "boolean | undefined",
          "required": false,
          "description": "Indicates whether the field is invalid."
        },
        {
          "name": "orientation",
          "type": "{ vertical: string[]; horizontal: string[]; responsive: string[]; }",
          "required": false,
          "defaultValue": "vertical"
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "orientation",
          "options": [
            "vertical",
            "horizontal",
            "responsive"
          ],
          "defaultValue": "vertical"
        }
      ],
      "subComponents": [],
      "examples": [
        {
          "name": "Basic",
          "code": "import { createListCollection } from '@ark-ui/react/collection';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Checkbox, CheckboxIndicator, CheckboxLabel } from '@wallarm-org/design-system/Checkbox';\nimport { Field, FieldDescription, FieldGroup, FieldLabel, FieldLegend, FieldSeparator, FieldSet } from '@wallarm-org/design-system/Field';\nimport { Input } from '@wallarm-org/design-system/Input';\nimport { NumberInput } from '@wallarm-org/design-system/NumberInput';\nimport { Radio, RadioGroup, RadioIndicator, RadioLabel } from '@wallarm-org/design-system/Radio';\nimport { Select, SelectButton, SelectContent, SelectOption, SelectOptionText, SelectPositioner } from '@wallarm-org/design-system/Select';\nimport { HStack } from '@wallarm-org/design-system/Stack';\nimport { Switch, SwitchControl, SwitchLabel } from '@wallarm-org/design-system/Switch';\nimport { Textarea } from '@wallarm-org/design-system/Textarea';\n\nexport const Basic = () => {\n  const monthsCollection = createListCollection({\n    items: ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'],\n  });\n\n  const yearsCollection = createListCollection({\n    items: ['2025', '2026', '2027', '2028', '2029'],\n  });\n\n  return (\n    <div className='min-w-320'>\n      <form>\n        <FieldGroup>\n          <FieldSet>\n            <FieldLegend>Payment Method</FieldLegend>\n\n            <FieldDescription>All transactions are secure and encrypted</FieldDescription>\n\n            <FieldGroup>\n              <Field>\n                <FieldLabel>Name on Card</FieldLabel>\n                <Input placeholder='Evil Rabbit' />\n              </Field>\n              <Field>\n                <FieldLabel htmlFor='checkout-7j9-card-number-uw1'>Card Number</FieldLabel>\n                <Input\n                  id='checkout-7j9-card-number-uw1'\n                  placeholder='1234 5678 9012 3456'\n                  required\n                />\n                <FieldDescription>Enter your 16-digit card number</FieldDescription>\n              </Field>\n\n              <HStack>\n                <Field>\n                  <FieldLabel>Month</FieldLabel>\n                  <Select collection={monthsCollection}>\n                    <SelectButton placeholder='Month' />\n                    <SelectPositioner>\n                      <SelectContent>\n                        {monthsCollection.items.map(month => (\n                          <SelectOption key={month} item={month}>\n                            <SelectOptionText>{month}</SelectOptionText>\n                          </SelectOption>\n                        ))}\n                      </SelectContent>\n                    </SelectPositioner>\n                  </Select>\n                </Field>\n\n                <Field>\n                  <FieldLabel>Year</FieldLabel>\n\n                  <Select collection={yearsCollection}>\n                    <SelectButton placeholder='Year' />\n\n                    <SelectPositioner>\n                      <SelectContent>\n                        {yearsCollection.items.map(year => (\n                          <SelectOption key={year} item={year}>\n                            <SelectOptionText>{year}</SelectOptionText>\n                          </SelectOption>\n                        ))}\n                      </SelectContent>\n                    </SelectPositioner>\n                  </Select>\n                </Field>\n\n                <Field>\n                  <FieldLabel>CVV</FieldLabel>\n                  <Input placeholder='123' required />\n                </Field>\n              </HStack>\n\n              <Field>\n                <FieldLabel>Amount</FieldLabel>\n                <NumberInput defaultValue='1000' />\n              </Field>\n            </FieldGroup>\n          </FieldSet>\n\n          <FieldSeparator />\n\n          <FieldSet>\n            <FieldLegend>Billing Address</FieldLegend>\n\n            <FieldDescription>\n              The billing address associated with your payment method\n            </FieldDescription>\n\n            <FieldGroup>\n              <Field orientation='horizontal'>\n                <Checkbox defaultChecked>\n                  <CheckboxIndicator />\n                  <CheckboxLabel>Same as shipping address</CheckboxLabel>\n                </Checkbox>\n              </Field>\n            </FieldGroup>\n          </FieldSet>\n\n          <FieldSeparator />\n\n          <FieldSet>\n            <FieldLegend>Subscription Plan</FieldLegend>\n\n            <FieldDescription>\n              Yearly and lifetime plans offer significant savings.\n            </FieldDescription>\n\n            <Field>\n              <RadioGroup defaultValue='monthly'>\n                <Radio value='monthly'>\n                  <RadioIndicator />\n                  <RadioLabel>Monthly ($9.99/month)</RadioLabel>\n                </Radio>\n                <Radio value='yearly'>\n                  <RadioIndicator />\n                  <RadioLabel>Yearly ($99.99/year)</RadioLabel>\n                </Radio>\n                <Radio value='lifetime'>\n                  <RadioIndicator />\n                  <RadioLabel>Lifetime ($299.99)</RadioLabel>\n                </Radio>\n              </RadioGroup>\n            </Field>\n          </FieldSet>\n\n          <FieldSeparator />\n\n          <FieldSet>\n            <FieldGroup>\n              <Field orientation='horizontal'>\n                <Switch>\n                  <SwitchControl />\n                  <SwitchLabel>Notice when delivered</SwitchLabel>\n                </Switch>\n              </Field>\n            </FieldGroup>\n          </FieldSet>\n\n          <FieldSet>\n            <FieldGroup>\n              <Field>\n                <FieldLabel>Comments</FieldLabel>\n                <Textarea placeholder='Add any additional comments' />\n              </Field>\n            </FieldGroup>\n          </FieldSet>\n\n          <Field orientation='horizontal'>\n            <Button type='submit'>Submit</Button>\n\n            <Button variant='outline' color='neutral' type='button'>\n              Cancel\n            </Button>\n          </Field>\n        </FieldGroup>\n      </form>\n    </div>\n  );\n};",
          "storyFile": "Field/Field.stories.tsx",
          "storyTitle": "Inputs/Field",
          "description": "The parts in order: `FieldLabel`, `FieldDescription`, the control, then `FieldError`.\n`FieldIndicator` reads `required` from the field and renders either an asterisk or `(Optional)`,\nso the two cases share one component and one wording."
        },
        {
          "name": "Inputs",
          "code": "import { Field, FieldDescription, FieldGroup, FieldLabel, FieldSet } from '@wallarm-org/design-system/Field';\nimport { Input } from '@wallarm-org/design-system/Input';\n\nexport const Inputs = () => (\n  <div className='min-w-320'>\n    <FieldSet>\n      <FieldGroup>\n        <Field>\n          <FieldLabel>Username</FieldLabel>\n          <Input type='text' placeholder='Max Leiter' />\n          <FieldDescription>Choose a unique username for your account.</FieldDescription>\n        </Field>\n        <Field>\n          <FieldLabel>Password</FieldLabel>\n          <FieldDescription>Must be at least 8 characters long.</FieldDescription>\n          <Input type='password' placeholder='********' />\n        </Field>\n      </FieldGroup>\n    </FieldSet>\n  </div>\n);",
          "storyFile": "Field/Field.stories.tsx",
          "storyTitle": "Inputs/Field",
          "description": "`Input` inside a `Field` is the case that works end to end — it reads the context, so the\nlabel points at it and the error sets `aria-invalid` without being passed anything."
        },
        {
          "name": "Textareas",
          "code": "import { Field, FieldDescription, FieldGroup, FieldLabel, FieldSet } from '@wallarm-org/design-system/Field';\nimport { Textarea } from '@wallarm-org/design-system/Textarea';\n\nexport const Textareas = () => (\n  <div className='min-w-320'>\n    <FieldSet>\n      <FieldGroup>\n        <Field>\n          <FieldLabel>Feedback</FieldLabel>\n          <Textarea placeholder='Your feedback helps us improve...' rows={4} />\n          <FieldDescription>Share your thoughts about our service.</FieldDescription>\n        </Field>\n      </FieldGroup>\n    </FieldSet>\n  </div>\n);",
          "storyFile": "Field/Field.stories.tsx",
          "storyTitle": "Inputs/Field",
          "description": "Same wiring as `Input`, since `Textarea` reads the context too. The description sits above\nthe box rather than below, so it is read before the reader starts typing."
        },
        {
          "name": "Fieldset",
          "code": "import { Field, FieldAction, FieldDescription, FieldError, FieldGroup, FieldIndicator, FieldLabel, FieldLegend, FieldSet } from '@wallarm-org/design-system/Field';\nimport { Info } from '@wallarm-org/design-system/icons';\nimport { Input } from '@wallarm-org/design-system/Input';\nimport { Textarea } from '@wallarm-org/design-system/Textarea';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@wallarm-org/design-system/Tooltip';\n\nexport const Fieldset = () => (\n  <div className='min-w-320'>\n    <FieldSet>\n      <FieldLegend>Profile</FieldLegend>\n      <FieldDescription>This appears on invoices and emails.</FieldDescription>\n\n      <FieldGroup>\n        <Field>\n          <FieldLabel>\n            Full name\n            <FieldAction>Generate new</FieldAction>\n          </FieldLabel>\n          <Input autoComplete='off' placeholder='Evil Rabbit' />\n          <FieldDescription>This appears on invoices and emails.</FieldDescription>\n        </Field>\n        <Field required>\n          <FieldLabel>\n            Username\n            <FieldIndicator />\n          </FieldLabel>\n          <Input placeholder='@paveldurov' autoComplete='off' error />\n          <FieldError>Choose another username.</FieldError>\n        </Field>\n        <Field>\n          <FieldLabel>\n            Message\n            <Tooltip>\n              <TooltipTrigger>\n                <Info />\n              </TooltipTrigger>\n              <TooltipContent>Additional information</TooltipContent>\n            </Tooltip>\n          </FieldLabel>\n          <Textarea placeholder='Your message...' />\n          <FieldDescription>Enter your message.</FieldDescription>\n        </Field>\n      </FieldGroup>\n    </FieldSet>\n  </div>\n);",
          "storyFile": "Field/Field.stories.tsx",
          "storyTitle": "Inputs/Field",
          "description": "`FieldSet` with `FieldLegend` for a question with several controls under it. This is the\ngrouping that assistive technology announces, so use it rather than a heading."
        },
        {
          "name": "Switches",
          "code": "import { Field, FieldDescription, FieldGroup, FieldLegend, FieldSet } from '@wallarm-org/design-system/Field';\nimport { Switch, SwitchControl, SwitchDescription, SwitchLabel } from '@wallarm-org/design-system/Switch';\n\nexport const Switches = () => (\n  <div className='min-w-320'>\n    <FieldSet>\n      <FieldLegend>Notification Settings</FieldLegend>\n      <FieldDescription>Manage your notification preferences.</FieldDescription>\n\n      <FieldGroup>\n        <Field orientation='horizontal'>\n          <Switch defaultChecked>\n            <SwitchControl />\n            <SwitchLabel>Email notifications</SwitchLabel>\n            <SwitchDescription>Receive email alerts for important updates.</SwitchDescription>\n          </Switch>\n        </Field>\n\n        <Field orientation='horizontal'>\n          <Switch>\n            <SwitchControl />\n            <SwitchLabel>Push notifications</SwitchLabel>\n            <SwitchDescription>Get push notifications on your device.</SwitchDescription>\n          </Switch>\n        </Field>\n\n        <Field orientation='horizontal'>\n          <Switch defaultChecked>\n            <SwitchControl />\n            <SwitchLabel>SMS notifications</SwitchLabel>\n            <SwitchDescription>Receive text messages for critical alerts.</SwitchDescription>\n          </Switch>\n        </Field>\n      </FieldGroup>\n    </FieldSet>\n  </div>\n);",
          "storyFile": "Field/Field.stories.tsx",
          "storyTitle": "Inputs/Field",
          "description": "A field around switches. Note that the layout is all you get here — `Switch` doesn't read\nfield context, so the label and description are visual, not wired."
        },
        {
          "name": "Radios",
          "code": "import { Field, FieldDescription, FieldLegend, FieldSet } from '@wallarm-org/design-system/Field';\nimport { Radio, RadioGroup, RadioIndicator, RadioLabel } from '@wallarm-org/design-system/Radio';\n\nexport const Radios = () => (\n  <div className='min-w-320'>\n    <FieldSet>\n      <FieldLegend>Delivery Method</FieldLegend>\n      <FieldDescription>Choose how you want to receive your order.</FieldDescription>\n\n      <Field>\n        <RadioGroup defaultValue='standard'>\n          <Radio value='standard'>\n            <RadioIndicator />\n            <RadioLabel>Standard Shipping (5-7 days)</RadioLabel>\n          </Radio>\n          <Radio value='express'>\n            <RadioIndicator />\n            <RadioLabel>Express Shipping (2-3 days)</RadioLabel>\n          </Radio>\n          <Radio value='overnight'>\n            <RadioIndicator />\n            <RadioLabel>Overnight Shipping (1 day)</RadioLabel>\n          </Radio>\n          <Radio value='pickup'>\n            <RadioIndicator />\n            <RadioLabel>In-store Pickup</RadioLabel>\n          </Radio>\n        </RadioGroup>\n\n        <FieldDescription>Shipping costs will be calculated at checkout.</FieldDescription>\n      </Field>\n    </FieldSet>\n  </div>\n);",
          "storyFile": "Field/Field.stories.tsx",
          "storyTitle": "Inputs/Field",
          "description": "A field around a radio group, where the group's own `name` does the binding and the field\nsupplies the question above it."
        },
        {
          "name": "Checkboxes",
          "code": "import { Checkbox, CheckboxDescription, CheckboxIndicator, CheckboxLabel } from '@wallarm-org/design-system/Checkbox';\nimport { Field, FieldDescription, FieldGroup, FieldLegend, FieldSet } from '@wallarm-org/design-system/Field';\nimport { Select } from '@wallarm-org/design-system/Select';\n\nexport const Checkboxes = () => (\n  <div className='min-w-320'>\n    <FieldSet>\n      <FieldLegend>Terms and Preferences</FieldLegend>\n      <FieldDescription>Select which terms you agree to.</FieldDescription>\n\n      <FieldGroup>\n        <Field orientation='horizontal'>\n          <Checkbox defaultChecked>\n            <CheckboxIndicator />\n            <CheckboxLabel>I accept the terms and conditions</CheckboxLabel>\n            <CheckboxDescription>You must agree to our terms to continue.</CheckboxDescription>\n          </Checkbox>\n        </Field>\n        <Field orientation='horizontal'>\n          <Checkbox>\n            <CheckboxIndicator />\n            <CheckboxLabel>Subscribe to newsletter</CheckboxLabel>\n            <CheckboxDescription>Get weekly updates and exclusive offers.</CheckboxDescription>\n          </Checkbox>\n        </Field>\n        <Field orientation='horizontal'>\n          <Checkbox defaultChecked>\n            <CheckboxIndicator />\n            <CheckboxLabel>Share usage data</CheckboxLabel>\n            <CheckboxDescription>Help us improve our services.</CheckboxDescription>\n          </Checkbox>\n        </Field>\n      </FieldGroup>\n    </FieldSet>\n  </div>\n);",
          "storyFile": "Field/Field.stories.tsx",
          "storyTitle": "Inputs/Field",
          "description": "A field around checkboxes. `FieldLegend` is the right home for the question, since each\ncheckbox already carries its own label."
        },
        {
          "name": "NumberInputs",
          "code": "import { Field, FieldDescription, FieldGroup, FieldLabel, FieldLegend, FieldSet } from '@wallarm-org/design-system/Field';\nimport { NumberInput } from '@wallarm-org/design-system/NumberInput';\n\nexport const NumberInputs = () => (\n  <div className='min-w-320'>\n    <FieldSet>\n      <FieldLegend>Product Details</FieldLegend>\n      <FieldDescription>Configure your product quantity and pricing.</FieldDescription>\n\n      <FieldGroup>\n        <Field>\n          <FieldLabel>Quantity</FieldLabel>\n          <NumberInput defaultValue='1' min={1} max={100} />\n          <FieldDescription>Choose between 1 and 100 items.</FieldDescription>\n        </Field>\n        <Field>\n          <FieldLabel>Price per unit</FieldLabel>\n          <NumberInput\n            defaultValue='99.99'\n            step={0.01}\n            formatOptions={{ style: 'currency', currency: 'USD' }}\n          />\n          <FieldDescription>Set the price for each unit.</FieldDescription>\n        </Field>\n        <Field>\n          <FieldLabel>Discount percentage</FieldLabel>\n          <NumberInput defaultValue='10' min={0} max={100} formatOptions={{ style: 'percent' }} />\n          <FieldDescription>Apply a discount from 0% to 100%.</FieldDescription>\n        </Field>\n      </FieldGroup>\n    </FieldSet>\n  </div>\n);",
          "storyFile": "Field/Field.stories.tsx",
          "storyTitle": "Inputs/Field",
          "description": "A field around `NumberInput`, which composes its own label rather than reading the field's\n— check the labelling in the rendered markup rather than assuming."
        },
        {
          "name": "Selects",
          "code": "import { createListCollection } from '@ark-ui/react/collection';\nimport { Field, FieldDescription, FieldGroup, FieldLabel, FieldLegend, FieldSet } from '@wallarm-org/design-system/Field';\nimport { Select, SelectButton, SelectContent, SelectOption, SelectOptionText, SelectPositioner } from '@wallarm-org/design-system/Select';\n\nexport const Selects = () => {\n  const countriesCollection = createListCollection({\n    items: [\n      { value: 'us', label: 'United States' },\n      { value: 'uk', label: 'United Kingdom' },\n      { value: 'ca', label: 'Canada' },\n      { value: 'au', label: 'Australia' },\n      { value: 'fr', label: 'France' },\n      { value: 'de', label: 'Germany' },\n      { value: 'jp', label: 'Japan' },\n    ],\n  });\n\n  const languagesCollection = createListCollection({\n    items: [\n      { value: 'en', label: 'English' },\n      { value: 'es', label: 'Spanish' },\n      { value: 'fr', label: 'French' },\n      { value: 'de', label: 'German' },\n      { value: 'it', label: 'Italian' },\n      { value: 'pt', label: 'Portuguese' },\n      { value: 'ru', label: 'Russian' },\n      { value: 'zh', label: 'Chinese' },\n      { value: 'ja', label: 'Japanese' },\n    ],\n  });\n\n  const timezonesCollection = createListCollection({\n    items: [\n      { value: 'utc-8', label: 'Pacific Time (UTC-8)' },\n      { value: 'utc-5', label: 'Eastern Time (UTC-5)' },\n      { value: 'utc', label: 'UTC' },\n      { value: 'utc+1', label: 'Central European Time (UTC+1)' },\n      { value: 'utc+8', label: 'China Standard Time (UTC+8)' },\n      { value: 'utc+9', label: 'Japan Standard Time (UTC+9)' },\n    ],\n  });\n\n  return (\n    <div className='min-w-320'>\n      <FieldSet>\n        <FieldLegend>Regional Settings</FieldLegend>\n        <FieldDescription>Configure your location and language preferences.</FieldDescription>\n\n        <FieldGroup>\n          <Field>\n            <FieldLabel>Country</FieldLabel>\n            <Select collection={countriesCollection}>\n              <SelectButton placeholder='Select a country' />\n              <SelectPositioner>\n                <SelectContent>\n                  {countriesCollection.items.map(country => (\n                    <SelectOption key={country.value} item={country}>\n                      <SelectOptionText>{country.label}</SelectOptionText>\n                    </SelectOption>\n                  ))}\n                </SelectContent>\n              </SelectPositioner>\n            </Select>\n            <FieldDescription>Your country determines available features.</FieldDescription>\n          </Field>\n          <Field>\n            <FieldLabel>Language</FieldLabel>\n            <Select collection={languagesCollection}>\n              <SelectButton placeholder='Select a language' />\n              <SelectPositioner>\n                <SelectContent>\n                  {languagesCollection.items.map(language => (\n                    <SelectOption key={language.value} item={language}>\n                      <SelectOptionText>{language.label}</SelectOptionText>\n                    </SelectOption>\n                  ))}\n                </SelectContent>\n              </SelectPositioner>\n            </Select>\n            <FieldDescription>Choose your preferred language.</FieldDescription>\n          </Field>\n          <Field>\n            <FieldLabel>Timezone</FieldLabel>\n            <Select collection={timezonesCollection}>\n              <SelectButton placeholder='Select a timezone' />\n              <SelectPositioner>\n                <SelectContent>\n                  {timezonesCollection.items.map(timezone => (\n                    <SelectOption key={timezone.value} item={timezone}>\n                      <SelectOptionText>{timezone.label}</SelectOptionText>\n                    </SelectOption>\n                  ))}\n                </SelectContent>\n              </SelectPositioner>\n            </Select>\n            <FieldDescription>All times will be displayed in this timezone.</FieldDescription>\n          </Field>\n        </FieldGroup>\n      </FieldSet>\n    </div>\n  );\n};",
          "storyFile": "Field/Field.stories.tsx",
          "storyTitle": "Inputs/Field",
          "description": "A field around `Select`. The trigger is a button, so the label needs to point at it\nexplicitly for the pairing to survive a screen reader."
        }
      ]
    },
    {
      "name": "FileUpload",
      "description": "Attaches files to a form and checks their type, size and count before accepting them — the drop Area when attaching is the main task on the screen, the \"Select file\" button when space is tight. Picking never uploads: files travel with the form when it is saved, and the product marks a row `loading` while it sends one. To pick a photo by clicking an avatar, see Data Display/Avatar → Click To Upload.",
      "importPath": "@wallarm-org/design-system/FileUpload",
      "props": [
        {
          "name": "value",
          "type": "File[] | undefined",
          "required": false,
          "description": "Controlled accepted files."
        },
        {
          "name": "defaultValue",
          "type": "File[] | undefined",
          "required": false,
          "description": "Uncontrolled initial files."
        },
        {
          "name": "onValueChange",
          "type": "((files: File[]) => void) | undefined",
          "required": false,
          "description": "Every change to the accepted list — pick, drop, replace, delete (then `[]`)."
        },
        {
          "name": "onFileReject",
          "type": "((rejections: FileUploadRejection[]) => void) | undefined",
          "required": false,
          "description": "Files that failed validation (for consumers that also want a toast)."
        },
        {
          "name": "accept",
          "type": "string | string[] | undefined",
          "required": false,
          "description": "Extensions and/or MIME types: `'.so,.dylib'`, `'image/png'`, `['.lua']`."
        },
        {
          "name": "maxFiles",
          "type": "number | undefined",
          "required": false,
          "description": "Default `1`: a new pick replaces the file, and the picker stays visible, with the chosen file shown below it.",
          "defaultValue": "1"
        },
        {
          "name": "maxFileSize",
          "type": "number | undefined",
          "required": false,
          "description": "Bytes. Checked on pick, drop and replace."
        },
        {
          "name": "minFileSize",
          "type": "number | undefined",
          "required": false,
          "description": "Bytes."
        },
        {
          "name": "validate",
          "type": "((file: File) => string[] | null) | undefined",
          "required": false,
          "description": "Custom rules; returned strings are shown verbatim as rejection messages."
        },
        {
          "name": "name",
          "type": "string | undefined",
          "required": false,
          "description": "Hidden input name — the files submit with a native form under it."
        },
        {
          "name": "required",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "disabled",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "readOnly",
          "type": "boolean | undefined",
          "required": false,
          "description": "Hides the picker, Delete and Replace; `FileUploadItemAction` (e.g. Download) stays."
        },
        {
          "name": "error",
          "type": "boolean | undefined",
          "required": false,
          "description": "Error state (maps to Ark `invalid`); also read from a wrapping `Field`.",
          "defaultValue": "false"
        },
        {
          "name": "allowDrop",
          "type": "boolean | undefined",
          "required": false,
          "description": "Default `true`.",
          "defaultValue": "true"
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [
        {
          "name": "FileUploadDropzone",
          "props": [
            {
              "name": "icon",
              "type": "ReactNode",
              "required": false,
              "description": "Replaces the default upload icon."
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "FileUploadError",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "FileUploadItem",
          "props": [
            {
              "name": "file",
              "type": "FileUploadItemFile",
              "required": true,
              "description": "A picked `File`, or a stored file described by `{ name, size? }`."
            },
            {
              "name": "description",
              "type": "ReactNode",
              "required": false,
              "description": "Second line, e.g. \"32 KB · uploads when you save\"."
            },
            {
              "name": "loading",
              "type": "boolean | undefined",
              "required": false,
              "description": "Uploading: dims the row, shows a spinner and locks the picker until it clears.",
              "defaultValue": "false"
            },
            {
              "name": "icon",
              "type": "ReactNode",
              "required": false,
              "description": "Replaces the default file icon."
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "FileUploadItemAction",
          "props": [
            {
              "name": "size",
              "type": "{ small: string; medium: string; large: string; 'inline-edit': string; }",
              "required": false
            },
            {
              "name": "loading",
              "type": "{ true: string; }",
              "required": false
            },
            {
              "name": "fullWidth",
              "type": "{ true: string; false: string; }",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "as",
              "type": "C | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "color",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "variant",
              "type": "{ primary: string; outline: string; ghost: string; secondary: string; }",
              "required": false
            }
          ]
        },
        {
          "name": "FileUploadItemDeleteTrigger",
          "props": [
            {
              "name": "size",
              "type": "{ small: string; medium: string; large: string; 'inline-edit': string; }",
              "required": false
            },
            {
              "name": "loading",
              "type": "{ true: string; }",
              "required": false
            },
            {
              "name": "fullWidth",
              "type": "{ true: string; false: string; }",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "as",
              "type": "C | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "color",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "variant",
              "type": "{ primary: string; outline: string; ghost: string; secondary: string; }",
              "required": false
            }
          ]
        },
        {
          "name": "FileUploadItemGroup",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "FileUploadItemReplaceTrigger",
          "props": [
            {
              "name": "size",
              "type": "{ small: string; medium: string; large: string; 'inline-edit': string; }",
              "required": false
            },
            {
              "name": "loading",
              "type": "{ true: string; }",
              "required": false
            },
            {
              "name": "fullWidth",
              "type": "{ true: string; false: string; }",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "as",
              "type": "C | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "color",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "variant",
              "type": "{ primary: string; outline: string; ghost: string; secondary: string; }",
              "required": false
            }
          ]
        },
        {
          "name": "FileUploadTrigger",
          "props": [
            {
              "name": "size",
              "type": "{ small: string; medium: string; large: string; 'inline-edit': string; }",
              "required": false
            },
            {
              "name": "loading",
              "type": "{ true: string; }",
              "required": false
            },
            {
              "name": "fullWidth",
              "type": "{ true: string; false: string; }",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "defaultValue": "false"
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "as",
              "type": "C | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "color",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "variant",
              "type": "{ primary: string; outline: string; ghost: string; secondary: string; }",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Basic",
          "code": "import { FileUpload, FileUploadDropzone, FileUploadError } from '@wallarm-org/design-system/FileUpload';\n\nexport const Basic = () => (\n  <FileUpload data-testid='file-upload'>\n    <FileUploadDropzone data-analytics-id='FILE_UPLOAD_DROPZONE' />\n    <FileUploadError />\n    <Rows />\n  </FileUpload>\n);",
          "storyFile": "FileUpload/FileUpload.stories.tsx",
          "storyTitle": "Inputs/FileUpload",
          "description": "The drop Area: click anywhere on it or drop files onto it, and from the keyboard Tab reaches it and Enter opens the file dialog."
        },
        {
          "name": "ButtonTrigger",
          "code": "import { FileUpload, FileUploadError, FileUploadTrigger } from '@wallarm-org/design-system/FileUpload';\n\nexport const ButtonTrigger = () => (\n  <FileUpload data-testid='file-upload'>\n    <FileUploadTrigger />\n    <FileUploadError />\n    <Rows />\n  </FileUpload>\n);",
          "storyFile": "FileUpload/FileUpload.stories.tsx",
          "storyTitle": "Inputs/FileUpload",
          "description": "The same picking and checks behind a \"Select file\" button that hugs its label, for when a 96px Area would crowd the form."
        },
        {
          "name": "InField",
          "code": "import { Field, FieldDescription, FieldIndicator, FieldLabel } from '@wallarm-org/design-system/Field';\nimport { FileUpload, FileUploadDropzone, FileUploadError } from '@wallarm-org/design-system/FileUpload';\n\nexport const InField = () => (\n  <Field required data-testid='field'>\n    <FieldLabel>\n      WASM module\n      <FieldIndicator />\n    </FieldLabel>\n    <FieldDescription>\n      Exports memory, spe_alloc, spe_free, spe_init, spe_on_phase · up to 32 MB\n    </FieldDescription>\n    <FileUpload data-testid='file-upload' accept='.wasm' maxFileSize={32 * MB}>\n      <FileUploadDropzone>Choose a .wasm module or drop it here</FileUploadDropzone>\n      <FileUploadError />\n      <Rows />\n    </FileUpload>\n  </Field>\n);",
          "storyFile": "FileUpload/FileUpload.stories.tsx",
          "storyTitle": "Inputs/FileUpload",
          "description": "Inside `Field`: the label names the Area, and the description carries the format and the limit."
        },
        {
          "name": "Multiple",
          "code": "import { FileUpload, FileUploadDropzone, FileUploadError } from '@wallarm-org/design-system/FileUpload';\n\nexport const Multiple = () => (\n  <FileUpload\n    data-testid='file-upload'\n    maxFiles={5}\n    defaultValue={[sample('rules.lua'), sample('headers.lua')]}\n  >\n    <FileUploadDropzone />\n    <FileUploadError />\n    <Rows />\n  </FileUpload>\n);",
          "storyFile": "FileUpload/FileUpload.stories.tsx",
          "storyTitle": "Inputs/FileUpload",
          "description": "With `maxFiles` above one the picker stays and disables once the limit is reached, while each file stacks below it as its own row."
        },
        {
          "name": "SingleFileChosen",
          "code": "import { FileUpload, FileUploadDropzone, FileUploadError } from '@wallarm-org/design-system/FileUpload';\n\nexport const SingleFileChosen = () => (\n  <FileUpload data-testid='file-upload' defaultValue={[sample('policy.wasm')]}>\n    <FileUploadDropzone />\n    <FileUploadError />\n    <Rows />\n  </FileUpload>\n);",
          "storyFile": "FileUpload/FileUpload.stories.tsx",
          "storyTitle": "Inputs/FileUpload",
          "description": "One file allowed and chosen: the file shows below the picker, and a new pick, or Replace in the row, swaps it."
        },
        {
          "name": "WithDescription",
          "code": "import { FileUpload, FileUploadDropzone, FileUploadItem, FileUploadItemDeleteTrigger, FileUploadItemGroup, FileUploadItemReplaceTrigger } from '@wallarm-org/design-system/FileUpload';\nimport { formatFileSize } from './lib';\n\nexport const WithDescription = () => (\n  <FileUpload data-testid='file-upload' defaultValue={[sample('policy.wasm')]}>\n    <FileUploadDropzone />\n    <FileUploadItemGroup>\n      {file => (\n        <FileUploadItem\n          file={file}\n          description={`${formatFileSize(file.size)} · uploads when you save`}\n        >\n          <FileUploadItemReplaceTrigger />\n          <FileUploadItemDeleteTrigger />\n        </FileUploadItem>\n      )}\n    </FileUploadItemGroup>\n  </FileUpload>\n);",
          "storyFile": "FileUpload/FileUpload.stories.tsx",
          "storyTitle": "Inputs/FileUpload",
          "description": "`description` adds a second line to the row for size or status — here, that the file goes with the form."
        },
        {
          "name": "Uploading",
          "code": "import { FileUpload, FileUploadDropzone, FileUploadItem, FileUploadItemDeleteTrigger, FileUploadItemGroup, FileUploadItemReplaceTrigger } from '@wallarm-org/design-system/FileUpload';\n\nexport const Uploading = () => (\n  <FileUpload data-testid='file-upload' maxFiles={5} defaultValue={[sample('rules.lua')]}>\n    <FileUploadDropzone />\n    <FileUploadItemGroup>\n      {file => (\n        <FileUploadItem file={file}>\n          <FileUploadItemReplaceTrigger />\n          <FileUploadItemDeleteTrigger />\n        </FileUploadItem>\n      )}\n    </FileUploadItemGroup>\n    <FileUploadItemGroup>\n      <FileUploadItem file={{ name: 'headers.lua' }} loading>\n        <FileUploadItemDeleteTrigger />\n      </FileUploadItem>\n    </FileUploadItemGroup>\n  </FileUpload>\n);",
          "storyFile": "FileUpload/FileUpload.stories.tsx",
          "storyTitle": "Inputs/FileUpload",
          "description": "A row marked `loading` dims and shows a spinner, and the picker locks until no row is loading; its X becomes \"Cancel upload\", and stopping the request is up to the product."
        },
        {
          "name": "Validation",
          "code": "import { FileUpload, FileUploadDropzone, FileUploadError } from '@wallarm-org/design-system/FileUpload';\n\nexport const Validation = () => (\n  <FileUpload data-testid='file-upload' accept='.so,.dylib' maxFileSize={32 * 1024}>\n    <FileUploadDropzone />\n    <FileUploadError />\n    <Rows />\n  </FileUpload>\n);",
          "storyFile": "FileUpload/FileUpload.stories.tsx",
          "storyTitle": "Inputs/FileUpload",
          "description": "Only `.so` / `.dylib` up to 32 KB: anything else is refused inline, naming the file and the rule."
        },
        {
          "name": "Disabled",
          "code": "import { FileUpload, FileUploadDropzone } from '@wallarm-org/design-system/FileUpload';\n\nexport const Disabled = () => (\n  <div className='flex flex-col gap-16'>\n    <FileUpload data-testid='file-upload' disabled>\n      <FileUploadDropzone />\n    </FileUpload>\n    <FileUpload disabled defaultValue={[sample('policy.wasm')]}>\n      <Rows />\n    </FileUpload>\n  </div>\n);",
          "storyFile": "FileUpload/FileUpload.stories.tsx",
          "storyTitle": "Inputs/FileUpload",
          "description": "Disabled: nothing responds, and the Area and the row actions dim."
        },
        {
          "name": "ReadOnly",
          "code": "import { FileUpload, FileUploadDropzone, FileUploadItem, FileUploadItemAction, FileUploadItemDeleteTrigger, FileUploadItemGroup, FileUploadItemReplaceTrigger } from '@wallarm-org/design-system/FileUpload';\nimport { Download } from '@wallarm-org/design-system/icons';\n\nexport const ReadOnly = () => (\n  <FileUpload data-testid='file-upload' readOnly defaultValue={[sample('policy.wasm')]}>\n    <FileUploadDropzone />\n    <FileUploadItemGroup>\n      {file => (\n        <FileUploadItem file={file}>\n          <FileUploadItemReplaceTrigger />\n          <FileUploadItemAction aria-label={`Download ${file.name}`}>\n            <Download />\n          </FileUploadItemAction>\n          <FileUploadItemDeleteTrigger />\n        </FileUploadItem>\n      )}\n    </FileUploadItemGroup>\n  </FileUpload>\n);",
          "storyFile": "FileUpload/FileUpload.stories.tsx",
          "storyTitle": "Inputs/FileUpload",
          "description": "Read-only removes the picker, Replace and Delete, while a custom `FileUploadItemAction` such as Download stays."
        },
        {
          "name": "StoredFile",
          "code": "import { FileUploadItem, FileUploadItemAction, FileUploadItemDeleteTrigger, FileUploadItemGroup } from '@wallarm-org/design-system/FileUpload';\nimport { Download } from '@wallarm-org/design-system/icons';\n\nexport const StoredFile = () => (\n  <FileUploadItemGroup data-testid='stored'>\n    <FileUploadItem file={{ name: 'policy.wasm', size: 48 * 1024 }} description='48 KB · attached'>\n      <FileUploadItemAction aria-label='Download policy.wasm'>\n        <Download />\n      </FileUploadItemAction>\n      <FileUploadItemDeleteTrigger aria-label='Detach artifact' />\n    </FileUploadItem>\n  </FileUploadItemGroup>\n);",
          "storyFile": "FileUpload/FileUpload.stories.tsx",
          "storyTitle": "Inputs/FileUpload",
          "description": "A file already on the server is a row too: `FileUploadItem` works outside `FileUpload` from a name and size, and its actions only run your `onClick`."
        },
        {
          "name": "LongFileName",
          "code": "import { FileUpload } from '@wallarm-org/design-system/FileUpload';\n\nexport const LongFileName = () => (\n  <FileUpload\n    data-testid='file-upload'\n    defaultValue={[\n      sample('flow-policy-artifact-for-the-production-edge-cluster-eu-central-1.wasm'),\n    ]}\n  >\n    <Rows />\n  </FileUpload>\n);",
          "storyFile": "FileUpload/FileUpload.stories.tsx",
          "storyTitle": "Inputs/FileUpload",
          "description": "Long names truncate; hover shows the full name."
        },
        {
          "name": "FormSubmission",
          "code": "import { type FormEvent, useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Field, FieldError, FieldIndicator, FieldLabel } from '@wallarm-org/design-system/Field';\nimport { FileUpload, FileUploadTrigger } from '@wallarm-org/design-system/FileUpload';\nimport { formatFileSize } from './lib';\n\nexport const FormSubmission = () => {\n  const [submitted, setSubmitted] = useState<string>('');\n  const onSubmit = (event: FormEvent<HTMLFormElement>) => {\n    event.preventDefault();\n    const file = new FormData(event.currentTarget).get('artifact');\n    setSubmitted(\n      file instanceof File && file.name ? `${file.name} (${formatFileSize(file.size)})` : 'nothing',\n    );\n  };\n  return (\n    <form onSubmit={onSubmit} noValidate className='flex flex-col gap-12'>\n      <Field required invalid={submitted === 'nothing'}>\n        <FieldLabel>\n          Artifact\n          <FieldIndicator />\n        </FieldLabel>\n        <FileUpload\n          data-testid='file-upload'\n          name='artifact'\n          onValueChange={() => setSubmitted('')}\n        >\n          <FileUploadTrigger />\n          <Rows />\n        </FileUpload>\n        {submitted === 'nothing' ? <FieldError>Attach a file</FieldError> : null}\n      </Field>\n      <Button type='submit' variant='outline' color='neutral' data-testid='submit'>\n        Save\n      </Button>\n      {submitted && submitted !== 'nothing' ? (\n        <p className='sb-annotation' data-testid='submitted'>\n          Submitted: {submitted}\n        </p>\n      ) : null}\n    </form>\n  );\n};",
          "storyFile": "FileUpload/FileUpload.stories.tsx",
          "storyTitle": "Inputs/FileUpload",
          "description": "Nothing uploads on pick: the file travels in the form's `FormData` under `name`, and an empty submit of a required Field shows its error."
        }
      ]
    },
    {
      "name": "FilterCascade",
      "description": "A filter over a hierarchy — organization › deployment › application, region › zone. The same 36px pill as `FilterDropdown`; each level opens as its own panel beside the option that opened it, and an item at any depth can be picked. The trigger reads the path: «Scope ● a › ● b», the tooltip carries it whole. Items are the consumer’s own objects, read through accessors; a level can load when it is first opened (`loadChildren`), and `parentLabel` adds the option that picks the level’s parent — «Deployment level». The search finds items at every depth. Compose the panels with `FilterCascadeLevels` to add group labels and options set apart; with no children, `FilterCascadeContent` renders the levels by itself. Reach for `FilterDropdown` when the values are flat.",
      "importPath": "@wallarm-org/design-system/FilterCascade",
      "props": [
        {
          "name": "label",
          "type": "string",
          "required": true,
          "description": "Attribute name: the trigger text, its aria-label, «Clear {label}», «Search {label}»."
        },
        {
          "name": "collection",
          "type": "FilterCascadeCollection<T>",
          "required": true,
          "description": "From `createFilterCascadeCollection`."
        },
        {
          "name": "value",
          "type": "string[] | undefined",
          "required": false,
          "description": "Controlled path, top level first; `[]` = unset."
        },
        {
          "name": "defaultValue",
          "type": "string[] | undefined",
          "required": false
        },
        {
          "name": "onValueChange",
          "type": "((details: FilterCascadeValueChangeDetails<T>) => void) | undefined",
          "required": false
        },
        {
          "name": "open",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultOpen",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "onOpenChange",
          "type": "((open: boolean) => void) | undefined",
          "required": false
        },
        {
          "name": "loadChildren",
          "type": "((item: T, path: string[]) => Promise<T[]>) | undefined",
          "required": false,
          "description": "Loads the next level of an item the collection marks with `hasChildren` — when the item is\nfirst highlighted, or when it is on the picked path."
        },
        {
          "name": "parentLabel",
          "type": "string | ((item: T) => string) | undefined",
          "required": false,
          "description": "Puts an option at the top of every next level that picks the item which opened it —\n«Deployment level». With it, a row that opens a level only opens it; without it, the row\nitself is picked."
        },
        {
          "name": "searchIn",
          "type": "\"all\" | \"top\" | undefined",
          "required": false,
          "description": "What the search matches: every loaded level, as one list with each match's path (`'all'`),\nor the top level only, its levels still opening beside it (`'top'`).",
          "defaultValue": "all"
        },
        {
          "name": "searchThreshold",
          "type": "number | undefined",
          "required": false,
          "description": "Top-level option count from which `FilterCascadeSearch` renders.",
          "defaultValue": "DEFAULT_SEARCH_THRESHOLD"
        },
        {
          "name": "disabled",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [
        {
          "name": "FilterCascadeClear",
          "props": [
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "FilterCascadeContent",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "FilterCascadeItem",
          "props": [
            {
              "name": "item",
              "type": "FilterCascadeEntry<unknown>",
              "required": true,
              "description": "An entry of a level's `items` (or its `parentItem`) from `useFilterCascade`."
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "FilterCascadeEmpty",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "FilterCascadeGroupLabel",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "FilterCascadeItems",
          "props": [
            {
              "name": "filter",
              "type": "((item: FilterCascadeEntry<unknown>) => boolean) | undefined",
              "required": false,
              "description": "Which of the level's options to render; all of them by default."
            }
          ]
        },
        {
          "name": "FilterCascadeLevel",
          "props": [
            {
              "name": "level",
              "type": "FilterCascadeLevelData<unknown>",
              "required": true,
              "description": "An entry of `levels` from `useFilterCascade`."
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "FilterCascadeLevels",
          "props": []
        },
        {
          "name": "FilterCascadeParentItem",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "FilterCascadeSearch",
          "props": [
            {
              "name": "onChange",
              "type": "((query: string) => void) | undefined",
              "required": false,
              "description": "Called after the query changes; the root owns the query itself."
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "pattern",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "alt",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "height",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "src",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "width",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "autoComplete",
              "type": "HTMLInputAutoCompleteAttribute | undefined",
              "required": false
            },
            {
              "name": "maxLength",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "minLength",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "placeholder",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "readOnly",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "required",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "checked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "step",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "accept",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "max",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "min",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "multiple",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "onClear",
              "type": "(() => void) | undefined",
              "required": false,
              "description": "Called when the built-in clear button empties the field, before `onChange('')`."
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "FilterCascadeCheckboxItem",
          "props": [
            {
              "name": "checked",
              "type": "boolean",
              "required": true
            },
            {
              "name": "onCheckedChange",
              "type": "((checked: boolean) => void) | undefined",
              "required": false
            },
            {
              "name": "icon",
              "type": "ReactNode",
              "required": false,
              "description": "Before the label, in the options' 16px icon slot — a status dot."
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "FilterCascadeSection",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "FilterCascadeTrigger",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Default",
          "code": "import { FilterCascade, FilterCascadeContent, FilterCascadeTrigger } from '@wallarm-org/design-system/FilterCascade';\n\nexport const Default = () => (\n  <FilterCascade label='Region' collection={regions} data-testid='filter-cascade'>\n    <FilterCascadeTrigger />\n    <FilterCascadeContent />\n  </FilterCascade>\n);",
          "storyFile": "FilterCascade/FilterCascade.stories.tsx",
          "storyTitle": "Patterns/FilterCascade",
          "description": "The minimal form: plain items, every level rendered by `FilterCascadeContent`."
        },
        {
          "name": "ScopeFilter",
          "code": "import { useState } from 'react';\nimport { FilterCascade, FilterCascadeClear, FilterCascadeTrigger } from '@wallarm-org/design-system/FilterCascade';\n\nexport const ScopeFilter = () => {\n  const [value, setValue] = useState<string[]>([]);\n  return (\n    <div className='flex flex-col gap-12'>\n      <FilterCascade\n        label='Scope'\n        collection={scopes}\n        loadChildren={loadApplications}\n        parentLabel='Deployment level'\n        value={value}\n        onValueChange={details => setValue(details.value)}\n        data-testid='filter-cascade-scope'\n      >\n        <FilterCascadeTrigger>\n          <FilterCascadeClear data-analytics-id='SCOPE_CLEAR' />\n        </FilterCascadeTrigger>\n        <ScopeMenu />\n      </FilterCascade>\n      <code className='text-xs text-text-secondary'>value: {JSON.stringify(value)}</code>\n    </div>\n  );\n};",
          "storyFile": "FilterCascade/FilterCascade.stories.tsx",
          "storyTitle": "Patterns/FilterCascade",
          "description": "The Scope filter of Flow management: lazy applications, «Deployment level», search, toggle."
        },
        {
          "name": "Picked",
          "code": "import { FilterCascade, FilterCascadeContent, FilterCascadeTrigger } from '@wallarm-org/design-system/FilterCascade';\n\nexport const Picked = () => (\n  <FilterCascade\n    label='Scope'\n    collection={longCollection}\n    loadChildren={async (): Promise<Scope[]> => [\n      { kind: 'application', uid: 'checkout', name: 'checkout-api' },\n    ]}\n    defaultValue={['eu1', 'checkout']}\n    data-testid='filter-cascade-picked'\n  >\n    <FilterCascadeTrigger />\n    <FilterCascadeContent />\n  </FilterCascade>\n);",
          "storyFile": "FilterCascade/FilterCascade.stories.tsx",
          "storyTitle": "Patterns/FilterCascade",
          "description": "A picked application: the trigger reads the path; only the deployment segment truncates."
        },
        {
          "name": "ParentPicked",
          "code": "import { FilterCascade, FilterCascadeTrigger } from '@wallarm-org/design-system/FilterCascade';\n\nexport const ParentPicked = () => (\n  <FilterCascade\n    label='Scope'\n    collection={scopes}\n    loadChildren={loadApplications}\n    parentLabel='Deployment level'\n    defaultValue={['staging-us']}\n    data-testid='filter-cascade-parent'\n  >\n    <FilterCascadeTrigger />\n    <ScopeMenu withToggle={false} />\n  </FilterCascade>\n);",
          "storyFile": "FilterCascade/FilterCascade.stories.tsx",
          "storyTitle": "Patterns/FilterCascade",
          "description": "The deployment itself, picked through «Deployment level»."
        },
        {
          "name": "LoadError",
          "code": "import { FilterCascade, FilterCascadeTrigger } from '@wallarm-org/design-system/FilterCascade';\n\nexport const LoadError = () => (\n  <FilterCascade\n    label='Scope'\n    collection={scopes}\n    loadChildren={() => Promise.reject(new Error('Unavailable'))}\n    parentLabel='Deployment level'\n    data-testid='filter-cascade-error'\n  >\n    <FilterCascadeTrigger />\n    <ScopeMenu withToggle={false} />\n  </FilterCascade>\n);",
          "storyFile": "FilterCascade/FilterCascade.stories.tsx",
          "storyTitle": "Patterns/FilterCascade",
          "description": "A level that fails to load offers a retry."
        },
        {
          "name": "Disabled",
          "code": "import { FilterCascade, FilterCascadeContent, FilterCascadeTrigger } from '@wallarm-org/design-system/FilterCascade';\n\nexport const Disabled = () => (\n  <FilterCascade\n    label='Region'\n    collection={regions}\n    defaultValue={['eu', 'fra']}\n    disabled\n    data-testid='filter-cascade-disabled'\n  >\n    <FilterCascadeTrigger />\n    <FilterCascadeContent />\n  </FilterCascade>\n);",
          "storyFile": "FilterCascade/FilterCascade.stories.tsx",
          "storyTitle": "Patterns/FilterCascade"
        }
      ]
    },
    {
      "name": "FilterDropdown",
      "description": "A lightweight filter for a list or table toolbar: a 36px trigger that opens a menu and narrows the list by one attribute. Picks apply at once — there is no Apply step. Single mode is for exclusive values and starts with «All …», which is also the reset; multi mode ticks several values that are OR-ed and clears with the ✕. From eight options the menu gains a search, and in multi mode a \"Selected\" section on top. Reach for `Select` inside forms, and for `FilterInput` when the query combines several attributes and operators.",
      "importPath": "@wallarm-org/design-system/FilterDropdown",
      "props": [
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string",
          "required": false,
          "description": "The unique identifier of the machine."
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "disabled",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the select is disabled",
          "defaultValue": "false"
        },
        {
          "name": "asChild",
          "type": "boolean | undefined",
          "required": false,
          "description": "Use the provided child element as the default rendered element, combining their props and behavior."
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "positioning",
          "type": "PositioningOptions | undefined",
          "required": false,
          "description": "Override default floating positioning (merged with DS defaults)."
        },
        {
          "name": "ids",
          "type": "ElementIds | undefined",
          "required": false,
          "description": "The ids of the elements in the select. Useful for composition."
        },
        {
          "name": "loopFocus",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether to loop the keyboard navigation through the options"
        },
        {
          "name": "closeOnSelect",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the select should close after an item is selected"
        },
        {
          "name": "open",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the select menu is open"
        },
        {
          "name": "defaultOpen",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the select's open state is controlled by the user"
        },
        {
          "name": "composite",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the select is a composed with other composite widgets like tabs or combobox"
        },
        {
          "name": "onPointerDownOutside",
          "type": "complex",
          "required": false,
          "description": "Function called when the pointer is pressed down outside the component"
        },
        {
          "name": "onFocusOutside",
          "type": "complex",
          "required": false,
          "description": "Function called when the focus is moved outside the component"
        },
        {
          "name": "onInteractOutside",
          "type": "complex",
          "required": false,
          "description": "Function called when an interaction happens outside the component"
        },
        {
          "name": "present",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the node is present (controlled by the user)"
        },
        {
          "name": "onExitComplete",
          "type": "VoidFunction | undefined",
          "required": false,
          "description": "Function called when the animation ends in the closed state"
        },
        {
          "name": "onEnterComplete",
          "type": "VoidFunction | undefined",
          "required": false,
          "description": "Function called when the animation ends in the open state"
        },
        {
          "name": "immediate",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether to synchronize the present change immediately or defer it to the next frame"
        },
        {
          "name": "autoComplete",
          "type": "string | undefined",
          "required": false,
          "description": "The autocomplete attribute for the hidden select. Enables browser autofill (e.g. \"address-level1\" for state)."
        },
        {
          "name": "readOnly",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the select is read-only"
        },
        {
          "name": "required",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the select is required"
        },
        {
          "name": "invalid",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the select is invalid"
        },
        {
          "name": "translations",
          "type": "IntlTranslations | undefined",
          "required": false,
          "description": "Specifies the localized strings that identifies the accessibility elements and their states"
        },
        {
          "name": "scrollToIndexFn",
          "type": "((details: ScrollToIndexDetails) => void) | undefined",
          "required": false,
          "description": "Function to scroll to a specific index"
        },
        {
          "name": "skipAnimationOnMount",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether to allow the initial presence animation."
        },
        {
          "name": "hideMode",
          "type": "\"display-none\" | \"activity\"",
          "required": false,
          "description": "How to hide content when mounted but not present.\n- `'display-none'`: HTML `hidden` attribute. Effects stay alive.\n- `'activity'`: React 19 `<Activity mode=\"hidden\">`. Effects pause. Requires React 19+."
        },
        {
          "name": "label",
          "type": "string",
          "required": true,
          "description": "Attribute name: trigger text in multi mode, the trigger's aria-label, «Clear {label}»."
        },
        {
          "name": "allLabel",
          "type": "string | undefined",
          "required": false,
          "description": "Single mode: trigger text while unset and the default text of `FilterDropdownAllOption`.",
          "defaultValue": "All"
        },
        {
          "name": "collection",
          "type": "ListCollection<T>",
          "required": true,
          "description": "Items to pick from. `groupBy` is supported."
        },
        {
          "name": "multiple",
          "type": "boolean | undefined",
          "required": false,
          "description": "Checkbox mode: several values, OR-ed, the menu stays open.",
          "defaultValue": "false"
        },
        {
          "name": "value",
          "type": "string[] | undefined",
          "required": false,
          "description": "Controlled picked values; `[]` = unset."
        },
        {
          "name": "defaultValue",
          "type": "string[] | undefined",
          "required": false
        },
        {
          "name": "onValueChange",
          "type": "((details: FilterDropdownValueChangeDetails<T>) => void) | undefined",
          "required": false
        },
        {
          "name": "onOpenChange",
          "type": "((details: FilterDropdownOpenChangeDetails) => void) | undefined",
          "required": false
        },
        {
          "name": "searchThreshold",
          "type": "number | undefined",
          "required": false,
          "description": "Item count from which the search field and (multi) the \"Selected\" section appear. Counts\nthe collection's own items only.",
          "defaultValue": "DEFAULT_SEARCH_THRESHOLD"
        },
        {
          "name": "filterFn",
          "type": "((itemString: string, item: T, query: string) => boolean) | undefined",
          "required": false,
          "description": "Overrides the default case-insensitive match on the item label."
        },
        {
          "name": "selectedOnTop",
          "type": "boolean | undefined",
          "required": false,
          "description": "Multi mode: pin the picked values under «Selected» on top of the list (from\n`searchThreshold` items, hidden while searching). Render `FilterDropdownSelected` for it.",
          "defaultValue": "true"
        }
      ],
      "variants": [
        {
          "name": "applied",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        },
        {
          "name": "clearable",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        },
        {
          "name": "emphasis",
          "options": [
            "value",
            "name"
          ],
          "defaultValue": "name"
        }
      ],
      "subComponents": [
        {
          "name": "FilterDropdownAllOption",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "description": "Use the provided child element as the default rendered element, combining their props and behavior."
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "variant",
              "type": "{ default: string; brand: string; destructive: string; }",
              "required": false
            },
            {
              "name": "inset",
              "type": "{ true: string; }",
              "required": false
            },
            {
              "name": "persistFocus",
              "type": "boolean | undefined",
              "required": false,
              "description": "Whether hovering outside should clear the highlighted state"
            }
          ]
        },
        {
          "name": "FilterDropdownClear",
          "props": [
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "FilterDropdownContent",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "FilterDropdownEmpty",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "FilterDropdownFooter",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "FilterDropdownFooterClear",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "loading",
              "type": "{ true: string; }",
              "required": false
            },
            {
              "name": "fullWidth",
              "type": "{ true: string; false: string; }",
              "required": false
            }
          ]
        },
        {
          "name": "FilterDropdownGroup",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "description": "Use the provided child element as the default rendered element, combining their props and behavior."
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "FilterDropdownGroupLabel",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "description": "Use the provided child element as the default rendered element, combining their props and behavior."
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "FilterDropdownOption",
          "props": [
            {
              "name": "item",
              "type": "T",
              "required": true
            },
            {
              "name": "hint",
              "type": "ReactNode",
              "required": false,
              "description": "Secondary text at the right end of the row, such as a count."
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "description": "Use the provided child element as the default rendered element, combining their props and behavior."
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "variant",
              "type": "{ default: string; brand: string; destructive: string; }",
              "required": false
            },
            {
              "name": "inset",
              "type": "{ true: string; }",
              "required": false
            },
            {
              "name": "persistFocus",
              "type": "boolean | undefined",
              "required": false,
              "description": "Whether hovering outside should clear the highlighted state"
            }
          ]
        },
        {
          "name": "FilterDropdownSearch",
          "props": [
            {
              "name": "onChange",
              "type": "((query: string) => void) | undefined",
              "required": false,
              "description": "Called after the query changes; the root owns the query itself."
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "pattern",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "alt",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "height",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "src",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "width",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "autoComplete",
              "type": "HTMLInputAutoCompleteAttribute | undefined",
              "required": false
            },
            {
              "name": "maxLength",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "minLength",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "placeholder",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "readOnly",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "required",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "checked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "step",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "accept",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "max",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "min",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "multiple",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "onClear",
              "type": "(() => void) | undefined",
              "required": false,
              "description": "Called when the built-in clear button empties the field, before `onChange('')`."
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "FilterDropdownSelected",
          "props": [
            {
              "name": "label",
              "type": "ReactNode",
              "required": false,
              "description": "@default 'Selected'",
              "defaultValue": "Selected"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "description": "Use the provided child element as the default rendered element, combining their props and behavior."
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "FilterDropdownTrigger",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Default",
          "code": "import { createListCollection } from '@ark-ui/react/collection';\nimport { FilterDropdown, FilterDropdownTrigger } from '@wallarm-org/design-system/FilterDropdown';\n\nexport const Default = () => (\n  <FilterDropdown\n    label='Environment'\n    allLabel='All environments'\n    collection={createListCollection({ items: environments })}\n    data-testid='filter-dropdown'\n  >\n    <FilterDropdownTrigger data-analytics-id='ENV_FILTER' />\n    <Menu />\n  </FilterDropdown>\n);",
          "storyFile": "FilterDropdown/FilterDropdown.stories.tsx",
          "storyTitle": "Patterns/FilterDropdown",
          "description": "Single mode: the trigger reads «All …» while unset and the picked value once set; picking closes\nthe menu. Analytics ids go on the parts that render the real targets — here the trigger."
        },
        {
          "name": "Multi",
          "code": "import { createListCollection } from '@ark-ui/react/collection';\nimport { FilterDropdown, FilterDropdownClear, FilterDropdownTrigger } from '@wallarm-org/design-system/FilterDropdown';\n\nexport const Multi = () => (\n  <FilterDropdown\n    label='Type'\n    multiple\n    collection={createListCollection({ items: types })}\n    defaultValue={['lua']}\n    data-testid='filter-dropdown'\n  >\n    <FilterDropdownTrigger data-analytics-id='TYPE_FILTER'>\n      <FilterDropdownClear data-analytics-id='TYPE_FILTER_CLEAR' />\n    </FilterDropdownTrigger>\n    <Menu />\n  </FilterDropdown>\n);",
          "storyFile": "FilterDropdown/FilterDropdown.stories.tsx",
          "storyTitle": "Patterns/FilterDropdown",
          "description": "Multi mode: checkboxes, OR-ed, the menu stays open. The trigger shows the name with the value or\na count, and the ✕ (or Backspace on the trigger) clears. Pass your own `FilterDropdownClear` as\nthe trigger's child to put an analytics id on the ✕."
        },
        {
          "name": "LabelForms",
          "code": "export const LabelForms = () => (\n  <div className='flex flex-col gap-12'>\n    <LabelFormRow caption='single, unset' value={[]} testId='single-unset' />\n    <LabelFormRow caption='single, set' value={['wasm']} testId='single-set' />\n    <LabelFormRow caption='multi, unset' multiple value={[]} testId='multi-unset' />\n    <LabelFormRow caption='multi, one value' multiple value={['lua']} testId='multi-one' />\n    <LabelFormRow\n      caption='multi, several values'\n      multiple\n      value={['lua', 'wasm', 'plugin']}\n      testId='multi-many'\n    />\n  </div>\n);",
          "storyFile": "FilterDropdown/FilterDropdown.stories.tsx",
          "storyTitle": "Patterns/FilterDropdown",
          "description": "Every form the trigger takes: dashed while unset, solid with a shadow once set."
        },
        {
          "name": "States",
          "code": "import { createListCollection } from '@ark-ui/react/collection';\nimport { FilterDropdown, FilterDropdownTrigger } from '@wallarm-org/design-system/FilterDropdown';\n\nexport const States = () => (\n  <div className='flex flex-col gap-12'>\n    {(\n      [\n        ['disabled, unset', false, []],\n        ['disabled, single set', false, ['wasm']],\n        ['disabled, multi set', true, ['lua', 'wasm']],\n      ] as const\n    ).map(([caption, multiple, value]) => (\n      <div key={caption} className='flex items-center gap-16'>\n        <FilterDropdown\n          label='Type'\n          allLabel='All types'\n          multiple={multiple}\n          disabled\n          collection={createListCollection({ items: types })}\n          defaultValue={[...value]}\n          data-testid={`disabled-${caption.replace(/\\W+/g, '-')}`}\n        >\n          <FilterDropdownTrigger />\n          <Menu />\n        </FilterDropdown>\n      </div>\n    ))}\n  </div>\n);",
          "storyFile": "FilterDropdown/FilterDropdown.stories.tsx",
          "storyTitle": "Patterns/FilterDropdown",
          "description": "Disabled keeps the value readable — the ✕ and the count stay visible, just inert."
        },
        {
          "name": "WithSearch",
          "code": "import { createListCollection } from '@ark-ui/react/collection';\nimport { FilterDropdown, FilterDropdownTrigger } from '@wallarm-org/design-system/FilterDropdown';\n\nexport const WithSearch = () => (\n  <div className='flex gap-8'>\n    <FilterDropdown\n      label='Scope'\n      multiple\n      collection={createListCollection({ items: letters })}\n      defaultValue={['f', 'c']}\n      data-testid='filter-dropdown-multi'\n    >\n      <FilterDropdownTrigger />\n      <Menu />\n    </FilterDropdown>\n    <FilterDropdown\n      label='Scope'\n      allLabel='All scopes'\n      collection={createListCollection({ items: letters })}\n      data-testid='filter-dropdown-single'\n    >\n      <FilterDropdownTrigger />\n      <Menu />\n    </FilterDropdown>\n  </div>\n);",
          "storyFile": "FilterDropdown/FilterDropdown.stories.tsx",
          "storyTitle": "Patterns/FilterDropdown",
          "description": "From `searchThreshold` options (8 by default) the menu gains a search that takes focus on open,\nand multi mode repeats what was picked in a \"Selected\" section on top. It is a snapshot: rows\nstay put while you tick, and it hides while a query is active."
        },
        {
          "name": "Groups",
          "code": "import { createListCollection } from '@ark-ui/react/collection';\nimport { FilterDropdown, FilterDropdownTrigger } from '@wallarm-org/design-system/FilterDropdown';\n\nexport const Groups = () => (\n  <FilterDropdown\n    label='Scope'\n    multiple\n    collection={createListCollection({ items: letters, groupBy: item => item.category ?? '' })}\n    data-testid='filter-dropdown'\n  >\n    <FilterDropdownTrigger />\n    <Menu />\n  </FilterDropdown>\n);",
          "storyFile": "FilterDropdown/FilterDropdown.stories.tsx",
          "storyTitle": "Patterns/FilterDropdown",
          "description": "A `groupBy` collection renders one labelled group per entry of `useFilterDropdown().groups`."
        },
        {
          "name": "Hint",
          "code": "import { createListCollection } from '@ark-ui/react/collection';\nimport { FilterDropdown, FilterDropdownTrigger } from '@wallarm-org/design-system/FilterDropdown';\n\nexport const Hint = () => (\n  <FilterDropdown\n    label='Type'\n    multiple\n    collection={createListCollection({ items: types })}\n    data-testid='filter-dropdown'\n  >\n    <FilterDropdownTrigger />\n    <Menu withHint />\n  </FilterDropdown>\n);",
          "storyFile": "FilterDropdown/FilterDropdown.stories.tsx",
          "storyTitle": "Patterns/FilterDropdown",
          "description": "`hint` puts secondary text, such as a count, at the right end of a row, before the check."
        },
        {
          "name": "LongLabels",
          "code": "import { createListCollection } from '@ark-ui/react/collection';\nimport { FilterDropdown, FilterDropdownTrigger } from '@wallarm-org/design-system/FilterDropdown';\n\nexport const LongLabels = () => (\n  <div className='flex gap-8'>\n    <FilterDropdown\n      label='Region'\n      allLabel='All regions'\n      collection={createListCollection({ items: longLabels })}\n      defaultValue={['us']}\n      data-testid='filter-dropdown-single'\n    >\n      <FilterDropdownTrigger />\n      <Menu />\n    </FilterDropdown>\n    <FilterDropdown\n      label='Deployment region'\n      multiple\n      collection={createListCollection({ items: longLabels })}\n      defaultValue={['eu']}\n      data-testid='filter-dropdown-multi'\n    >\n      <FilterDropdownTrigger />\n      <Menu />\n    </FilterDropdown>\n  </div>\n);",
          "storyFile": "FilterDropdown/FilterDropdown.stories.tsx",
          "storyTitle": "Patterns/FilterDropdown",
          "description": "The trigger stops at 180px and ellipsises, with the full value on hover; the menu hugs its\noptions up to 360px and wraps longer ones."
        },
        {
          "name": "FilterRow",
          "code": "import { useState } from 'react';\nimport { createListCollection } from '@ark-ui/react/collection';\nimport { FilterDropdown, FilterDropdownTrigger } from '@wallarm-org/design-system/FilterDropdown';\nimport { SearchInput } from '@wallarm-org/design-system/SearchInput';\nimport { SegmentedTabs, SegmentedTabsList, SegmentedTabsTrigger } from '@wallarm-org/design-system/SegmentedTabs';\n\nexport const FilterRow = () => {\n  const [query, setQuery] = useState('');\n\n  return (\n    <div className='flex flex-wrap items-center gap-8'>\n      <div className='w-240'>\n        <SearchInput value={query} onChange={setQuery} placeholder='Search rules' />\n      </div>\n      <SegmentedTabs defaultValue='all'>\n        <SegmentedTabsList>\n          <SegmentedTabsTrigger value='all'>All</SegmentedTabsTrigger>\n          <SegmentedTabsTrigger value='active'>Active</SegmentedTabsTrigger>\n          <SegmentedTabsTrigger value='blocked'>Blocked</SegmentedTabsTrigger>\n        </SegmentedTabsList>\n      </SegmentedTabs>\n      <FilterDropdown\n        label='Environment'\n        allLabel='All environments'\n        collection={createListCollection({ items: environments })}\n        data-testid='filter-environment'\n      >\n        <FilterDropdownTrigger data-analytics-id='RULES_ENV_FILTER' />\n        <Menu />\n      </FilterDropdown>\n      <FilterDropdown\n        label='Type'\n        multiple\n        collection={createListCollection({ items: types })}\n        data-testid='filter-type'\n      >\n        <FilterDropdownTrigger data-analytics-id='RULES_TYPE_FILTER' />\n        <Menu withHint />\n      </FilterDropdown>\n      <FilterDropdown\n        label='Scope'\n        multiple\n        collection={createListCollection({ items: letters })}\n        data-testid='filter-scope'\n      >\n        <FilterDropdownTrigger data-analytics-id='RULES_SCOPE_FILTER' />\n        <Menu />\n      </FilterDropdown>\n    </div>\n  );\n};",
          "storyFile": "FilterDropdown/FilterDropdown.stories.tsx",
          "storyTitle": "Patterns/FilterDropdown",
          "description": "The toolbar it is made for: a search, scoped views, then one filter per attribute."
        },
        {
          "name": "Controlled",
          "code": "import { useState } from 'react';\nimport { createListCollection } from '@ark-ui/react/collection';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { FilterDropdown, FilterDropdownTrigger } from '@wallarm-org/design-system/FilterDropdown';\n\nexport const Controlled = () => {\n  const [value, setValue] = useState<string[]>(['pre-production']);\n  const collection = createListCollection({ items: environments });\n  return (\n    <div className='flex flex-col items-start gap-12'>\n      <FilterDropdown\n        label='Environment'\n        allLabel='All environments'\n        collection={collection}\n        value={value}\n        onValueChange={details => setValue(details.value)}\n        data-testid='filter-dropdown'\n      >\n        <FilterDropdownTrigger />\n        <Menu />\n      </FilterDropdown>\n      <Button variant='outline' color='neutral' size='small' onClick={() => setValue([])}>\n        Reset\n      </Button>\n    </div>\n  );\n};",
          "storyFile": "FilterDropdown/FilterDropdown.stories.tsx",
          "storyTitle": "Patterns/FilterDropdown",
          "description": "Controlled with `value` / `onValueChange`. The handler only ever receives your own values —\n`[]` for unset — never the internal «All» or \"Selected\" ones."
        }
      ]
    },
    {
      "name": "FilterInput",
      "description": "A config-driven query builder — `fields` metadata in, an `ExprNode` tree out of `onChange` — for filtering a data-dense resource. Reach for a row of `Select`s instead when three or four facets picked by equality would do; reach for this when the attribute count is high, or the query needs AND/OR, grouping, or operators like `between` and `like`. The menus, chips and connectors are internal, so what you own is the field config.",
      "importPath": "@wallarm-org/design-system/FilterInput",
      "props": [
        {
          "name": "fields",
          "type": "FieldMetadata[] | undefined",
          "required": false,
          "description": "Filter-field configurations driving the autocomplete. A few names are\n**reserved** and auto-wired with design-system helpers — DS-supplied\ncallbacks **override** consumer values for the reserved slots, because\nthe field semantics (mask range, accepted chars, backend form) are fixed\nby DS:\n\n  - `status_code` — HTTP status code field (mask suggestions, format\n    validation, digit-or-X input filter, partial-input normalization).\n\nTo opt out, use a different `name` and attach the factories\n(`createStatusCodeSuggestions`, …) manually."
        },
        {
          "name": "fieldGroups",
          "type": "FieldGroup[] | undefined",
          "required": false,
          "description": "Optional grouping for the field-selection menu. When omitted, fields\nrender as a flat list. When provided, fields render under labeled group\nheaders (group order = array order; field order = listed order). Fields\nnot referenced by any group fall into a trailing headerless section.\nReferenced by field `name`; unknown names are ignored."
        },
        {
          "name": "value",
          "type": "ExprNode | null | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "((expression: ExprNode | null) => void) | undefined",
          "required": false
        },
        {
          "name": "placeholder",
          "type": "string | undefined",
          "required": false,
          "defaultValue": "Type to filter..."
        },
        {
          "name": "error",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "externalErrors",
          "type": "string[] | undefined",
          "required": false,
          "description": "Field names whose values were rejected by the backend. Matching chips are\nrendered with a value error (red). Purely presentational: conditions and\n`onChange` output are unaffected, and the consumer is expected to render\nits own message (e.g. an alert with the backend error text) and clear the\nprop when the filter changes or the query succeeds."
        },
        {
          "name": "onErrorsChange",
          "type": "((errors: string[]) => void) | undefined",
          "required": false,
          "description": "Notified whenever the set of validation messages FilterInput renders below\nthe input changes (empty array = no visible error). Lets a consumer avoid\nstacking its own message (e.g. a backend-error alert) on top of one the\ninput already shows. Pass a stable (memoized) callback."
        },
        {
          "name": "showKeyboardHint",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [
        {
          "name": "FilterInputChip",
          "props": [
            {
              "name": "chipId",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "attribute",
              "type": "string",
              "required": true
            },
            {
              "name": "attributeDescription",
              "type": "string | undefined",
              "required": false,
              "description": "Description shown in a dark tooltip on hover of the attribute segment. When\n absent, no tooltip renders. The operator/value segments are unaffected (AS-1060)."
            },
            {
              "name": "operator",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "error",
              "type": "ChipErrorSegment | undefined",
              "required": false,
              "defaultValue": "false"
            },
            {
              "name": "valueParts",
              "type": "string[] | undefined",
              "required": false
            },
            {
              "name": "valueSeparator",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "errorValueIndices",
              "type": "number[] | undefined",
              "required": false
            },
            {
              "name": "building",
              "type": "boolean | undefined",
              "required": false,
              "defaultValue": "false"
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false,
              "description": "When true, the chip cannot be edited or removed (dimmed appearance)",
              "defaultValue": "false"
            },
            {
              "name": "valueMaxWidth",
              "type": "number | undefined",
              "required": false,
              "description": "Caps the applied value segment at this width (px), truncating with an\n ellipsis; lifts the chip's default max-width so it grows to fit. Defaults\n to 500; a paired chip caps its whole width there instead (AS-1064).",
              "defaultValue": "500"
            },
            {
              "name": "caretMode",
              "type": "\"end\" | undefined",
              "required": false,
              "description": "Caret placement on value inline-edit: `'end'` (default) puts it at the\n tail — better for long values; pass explicitly to keep the API visible (AS-1064).",
              "defaultValue": "end"
            },
            {
              "name": "pair",
              "type": "complex",
              "required": false,
              "description": "Second paired triplet (two-step fields). The paired attribute is fixed."
            },
            {
              "name": "onRemove",
              "type": "(() => void) | undefined",
              "required": false
            },
            {
              "name": "onSegmentClick",
              "type": "complex",
              "required": false
            },
            {
              "name": "onPairSegmentClick",
              "type": "complex",
              "required": false,
              "description": "Click on an editable paired segment (operator/value of the second triplet)."
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "FilterInputFieldMenu",
          "props": [
            {
              "name": "fields",
              "type": "FieldMetadata[]",
              "required": true
            },
            {
              "name": "filterText",
              "type": "string | undefined",
              "required": false,
              "description": "Text from the input to filter displayed fields",
              "defaultValue": ""
            },
            {
              "name": "onSelect",
              "type": "(field: FieldMetadata) => void",
              "required": true
            },
            {
              "name": "open",
              "type": "boolean | undefined",
              "required": false,
              "defaultValue": "false"
            },
            {
              "name": "onOpenChange",
              "type": "((open: boolean) => void) | undefined",
              "required": false
            },
            {
              "name": "recentConditions",
              "type": "Condition[] | undefined",
              "required": false,
              "defaultValue": "[]"
            },
            {
              "name": "suggestedFields",
              "type": "FieldMetadata[] | undefined",
              "required": false,
              "defaultValue": "[]"
            },
            {
              "name": "fieldGroups",
              "type": "FieldGroup[] | undefined",
              "required": false,
              "description": "Optional grouping for the field list. When omitted, fields render flat."
            },
            {
              "name": "onSelectAnd",
              "type": "(() => void) | undefined",
              "required": false
            },
            {
              "name": "onSelectOr",
              "type": "(() => void) | undefined",
              "required": false
            },
            {
              "name": "onEscape",
              "type": "(() => void) | undefined",
              "required": false
            },
            {
              "name": "positioning",
              "type": "Record<string, unknown> | undefined",
              "required": false
            },
            {
              "name": "inputRef",
              "type": "RefObject<HTMLInputElement | null> | undefined",
              "required": false,
              "description": "Ref to the query bar input — ArrowUp on first item returns focus here"
            },
            {
              "name": "menuRef",
              "type": "RefObject<HTMLDivElement | null> | undefined",
              "required": false,
              "description": "Ref to the menu content (shared across menus for focus management)."
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "FilterInputOperatorMenu",
          "props": [
            {
              "name": "fieldType",
              "type": "FieldType",
              "required": true,
              "description": "The field type to determine which operators to show"
            },
            {
              "name": "operators",
              "type": "FilterOperator[] | undefined",
              "required": false,
              "description": "Optional list of operators from field config.\nWhen provided, only these operators are shown (preserving type-based grouping).\nFalls back to OPERATORS_BY_TYPE[fieldType] when not set."
            },
            {
              "name": "onSelect",
              "type": "(operator: FilterOperator) => void",
              "required": true,
              "description": "Callback when an operator is selected"
            },
            {
              "name": "open",
              "type": "boolean | undefined",
              "required": false,
              "description": "Whether the menu is open",
              "defaultValue": "false"
            },
            {
              "name": "onOpenChange",
              "type": "((open: boolean) => void) | undefined",
              "required": false,
              "description": "Callback when open state should change"
            },
            {
              "name": "onEscape",
              "type": "(() => void) | undefined",
              "required": false,
              "description": "Callback when Escape is pressed (discard)"
            },
            {
              "name": "positioning",
              "type": "Record<string, unknown> | undefined",
              "required": false,
              "description": "Override positioning config for the dropdown"
            },
            {
              "name": "inputRef",
              "type": "RefObject<HTMLInputElement | null> | undefined",
              "required": false,
              "description": "Ref to the query bar input — ArrowUp on first item returns focus here"
            },
            {
              "name": "filterText",
              "type": "string | undefined",
              "required": false,
              "description": "Text to filter operators by label",
              "defaultValue": ""
            },
            {
              "name": "menuRef",
              "type": "RefObject<HTMLDivElement | null> | undefined",
              "required": false,
              "description": "Ref to the menu content element — shared across menus for focus management"
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "FilterInputValueMenu",
          "props": [
            {
              "name": "values",
              "type": "ValueOption[]",
              "required": true
            },
            {
              "name": "onSelect",
              "type": "(value: ConditionValue) => void",
              "required": true
            },
            {
              "name": "onCommit",
              "type": "((values: ConditionValue[]) => void) | undefined",
              "required": false
            },
            {
              "name": "open",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "onOpenChange",
              "type": "((open: boolean) => void) | undefined",
              "required": false
            },
            {
              "name": "multiSelect",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "initialValues",
              "type": "ConditionValue[] | undefined",
              "required": false
            },
            {
              "name": "highlightValue",
              "type": "ConditionValue | undefined",
              "required": false
            },
            {
              "name": "onEscape",
              "type": "(() => void) | undefined",
              "required": false
            },
            {
              "name": "width",
              "type": "number | \"standard\" | \"compact\" | undefined",
              "required": false
            },
            {
              "name": "positioning",
              "type": "Record<string, unknown> | undefined",
              "required": false
            },
            {
              "name": "onBuildingValueChange",
              "type": "((preview: string | undefined) => void) | undefined",
              "required": false
            },
            {
              "name": "onItemToggle",
              "type": "(() => void) | undefined",
              "required": false,
              "description": "Fires only on user-initiated multi-select toggle (not on init)."
            },
            {
              "name": "inputRef",
              "type": "RefObject<HTMLInputElement | null> | undefined",
              "required": false,
              "description": "Query bar input — ArrowUp on first item returns focus here."
            },
            {
              "name": "filterText",
              "type": "string | undefined",
              "required": false,
              "description": "Filter values by label."
            },
            {
              "name": "loading",
              "type": "boolean | undefined",
              "required": false,
              "description": "Options are still loading — show a loading indicator instead of the list."
            },
            {
              "name": "emptyLabel",
              "type": "string | undefined",
              "required": false,
              "description": "Replaces the empty-state's default \"No results\" text."
            },
            {
              "name": "menuRef",
              "type": "RefObject<HTMLDivElement | null> | undefined",
              "required": false,
              "description": "Menu content ref (shared across menus for focus management)."
            },
            {
              "name": "blurCommitRef",
              "type": "RefObject<(() => boolean) | null> | undefined",
              "required": false,
              "description": "Set here so blur handler can commit multi-select values."
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Default",
          "code": "import { FilterInput } from '@wallarm-org/design-system/FilterInput';\n\n<FilterInput fields={attackVectorFields} placeholder=\"Type to filter...\" />",
          "storyFile": "FilterInput/stories/FilterInput.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInput",
          "description": "The pattern at rest against the real attack-vectors schema: click in and it walks you field, then operator, then value."
        },
        {
          "name": "WithKeyboardHint",
          "code": "import { FilterInput } from '@wallarm-org/design-system/FilterInput';\n\n<FilterInput fields={attackVectorFields} placeholder=\"Type to filter...\" showKeyboardHint />",
          "storyFile": "FilterInput/stories/FilterInput.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInput",
          "description": "`showKeyboardHint` prints the shortcut hint beside the input — worth turning on where filtering is new to the reader, and off where it is routine."
        },
        {
          "name": "WithFieldGroups",
          "code": "import { FilterInput } from '@wallarm-org/design-system/FilterInput';\n\n<FilterInput fields={groupedDemoFields} fields={['attack_type'} />",
          "storyFile": "FilterInput/stories/FilterInput.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInput",
          "description": "`fieldGroups` sorts the field menu under labelled headers, which is what keeps a fifty-field schema navigable."
        },
        {
          "name": "WithDescribedChip",
          "code": "import { useState } from 'react';\nimport { FilterInput, type ExprNode } from '@wallarm-org/design-system/FilterInput';\n\nexport const WithDescribedChip = () => {\n    const [expression, setExpression] = useState<ExprNode | null>({\n      type: 'condition',\n      field: 'status_code',\n      operator: '=',\n      value: '200',\n    });\n\n    return (\n      <FilterInput\n        data-testid='filter-input'\n        fields={describedChipFields}\n        value={expression}\n        onChange={setExpression}\n        placeholder='Type to filter...'\n      />\n    );\n  };",
          "storyFile": "FilterInput/stories/FilterInput.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInput",
          "description": "A field with a `description` carries it into a tooltip on the chip's first segment, so a committed filter can still explain itself; the operator and value segments keep click-to-edit."
        },
        {
          "name": "ErrorEmpty",
          "code": "import { FilterInput } from '@wallarm-org/design-system/FilterInput';\n\n<FilterInput fields={attackVectorFields} placeholder=\"Type to filter...\" error />",
          "storyFile": "FilterInput/stories/FilterInput.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInput",
          "description": "`error` reddens the input as a whole — pair it with an `Alert` that says what was rejected, since the input itself cannot."
        },
        {
          "name": "WithPresetValue",
          "code": "import { useState } from 'react';\nimport { FilterInput, type ExprNode } from '@wallarm-org/design-system/FilterInput';\n\nexport const WithPresetValue = () => {\n    const [expression, setExpression] = useState<ExprNode | null>({\n      type: 'condition',\n      field: 'status',\n      operator: '=',\n      value: 'Blocked',\n    });\n\n    return (\n      <>\n        <FilterInput\n          data-testid='filter-input'\n          fields={attackVectorFields}\n          value={expression}\n          onChange={setExpression}\n          placeholder='Type to filter...'\n        />\n        {expression && (\n          <div className='mt-16 rounded-8 border border-border-primary bg-bg-light-primary p-8 font-mono text-xs text-text-secondary'>\n            <pre>{JSON.stringify(expression, null, 2)}</pre>\n          </div>\n        )}\n      </>\n    );\n  };",
          "storyFile": "FilterInput/stories/FilterInput.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInput",
          "description": "Controlled mode: `value` takes an `ExprNode` and `onChange` hands the tree back. The JSON below the input is the story printing that tree, not part of the component."
        },
        {
          "name": "WithMultiConditionPreset",
          "code": "import { useState } from 'react';\nimport { FilterInput, type ExprNode } from '@wallarm-org/design-system/FilterInput';\n\nexport const WithMultiConditionPreset = () => {\n    const [expression, setExpression] = useState<ExprNode | null>({\n      type: 'group',\n      operator: 'and',\n      children: [\n        { type: 'condition', field: 'status', operator: '=', value: 'Blocked' },\n        { type: 'condition', field: 'status_code', operator: '>', value: 400 },\n      ],\n    });\n\n    return (\n      <>\n        <FilterInput\n          data-testid='filter-input'\n          fields={attackVectorFields}\n          value={expression}\n          onChange={setExpression}\n          placeholder='Type to filter...'\n        />\n        {expression && (\n          <div className='mt-16 rounded-8 border border-border-primary bg-bg-light-primary p-8 font-mono text-xs text-text-secondary'>\n            <pre>{JSON.stringify(expression, null, 2)}</pre>\n          </div>\n        )}\n      </>\n    );\n  };",
          "storyFile": "FilterInput/stories/FilterInput.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInput",
          "description": "Two conditions joined by AND — what a `group` node looks like once rendered, connectors included."
        },
        {
          "name": "ErrorWithValue",
          "code": "import { useState } from 'react';\nimport { FilterInput, type ExprNode } from '@wallarm-org/design-system/FilterInput';\n\nexport const ErrorWithValue = () => {\n    const [expression, setExpression] = useState<ExprNode | null>({\n      type: 'condition',\n      field: 'status',\n      operator: '=',\n      value: 'Blocked',\n    });\n\n    return (\n      <FilterInput\n        data-testid='filter-input'\n        fields={attackVectorFields}\n        value={expression}\n        onChange={setExpression}\n        placeholder='Type to filter...'\n        error\n      />\n    );\n  };",
          "storyFile": "FilterInput/stories/FilterInput.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInput",
          "description": "The error state with a condition already committed: the chip stays editable, so the query can be fixed in place rather than cleared."
        },
        {
          "name": "WithDisabledChips",
          "code": "import { useState } from 'react';\nimport { FilterInput, type ExprNode } from '@wallarm-org/design-system/FilterInput';\n\nexport const WithDisabledChips = () => {\n    const [expression, setExpression] = useState<ExprNode | null>({\n      type: 'group',\n      operator: 'and',\n      children: [\n        { type: 'condition', field: 'country', operator: '=', value: 'US', disabled: true },\n        { type: 'condition', field: 'status', operator: '=', value: 'Blocked', disabled: true },\n        { type: 'condition', field: 'status_code', operator: '>', value: 400 },\n      ],\n    });\n\n    return (\n      <>\n        <FilterInput\n          data-testid='filter-input'\n          fields={attackVectorFields}\n          value={expression}\n          onChange={setExpression}\n          placeholder='Add more filters...'\n        />\n        {expression && (\n          <div className='mt-16 rounded-8 border border-border-primary bg-bg-light-primary p-8 font-mono text-xs text-text-secondary'>\n            <pre>{JSON.stringify(expression, null, 2)}</pre>\n          </div>\n        )}\n      </>\n    );\n  };",
          "storyFile": "FilterInput/stories/FilterInput.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInput",
          "description": "A condition marked `disabled` is locked — dimmed, no edit, no remove — which is how a drill-down carries its context into the filter without letting the reader drop it."
        },
        {
          "name": "AllChipsDisabled",
          "code": "import { useState } from 'react';\nimport { FilterInput, type ExprNode } from '@wallarm-org/design-system/FilterInput';\n\nexport const AllChipsDisabled = () => {\n    const [expression, setExpression] = useState<ExprNode | null>({\n      type: 'group',\n      operator: 'and',\n      children: [\n        { type: 'condition', field: 'status', operator: '=', value: 'Monitoring', disabled: true },\n        {\n          type: 'condition',\n          field: 'country',\n          operator: 'in',\n          value: ['US', 'DE'],\n          disabled: true,\n        },\n      ],\n    });\n\n    return (\n      <FilterInput\n        data-testid='filter-input'\n        fields={attackVectorFields}\n        value={expression}\n        onChange={setExpression}\n        placeholder='Add more filters...'\n      />\n    );\n  };",
          "storyFile": "FilterInput/stories/FilterInput.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInput",
          "description": "With every chip locked, clear-all has nothing to remove, and the input still accepts new conditions on top."
        },
        {
          "name": "HTTPStatusCodeSuggestions",
          "code": "import { FilterInput, createStatusCodeInputFilter, createStatusCodeNormalizer, createStatusCodeSuggestions, createStatusCodeValidator } from '@wallarm-org/design-system/FilterInput';\n\n<FilterInput label=\"Status code\" type=\"integer\" getSuggestions={createStatusCodeSuggestions()} validate={createStatusCodeValidator()} acceptChar={createStatusCodeInputFilter()} normalize={createStatusCodeNormalizer()} />",
          "storyFile": "FilterInput/stories/FilterInput.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInput",
          "description": "A status-code field wired by hand with the `createStatusCode*` helpers: typing narrows the mask suggestions, 4 to 4XX and 40 to 40X."
        },
        {
          "name": "HTTPStatusCodeByName",
          "code": "import { FilterInput } from '@wallarm-org/design-system/FilterInput';\n\n<FilterInput label=\"Status code\" type=\"integer\" operators={['='} />",
          "storyFile": "FilterInput/stories/FilterInput.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInput",
          "description": "`status_code` is a reserved field name — the DS fills in the same suggestions, input filter, normaliser and validator on its own, and an explicit callback still wins."
        },
        {
          "name": "PairedField",
          "code": "import { useState } from 'react';\nimport { FilterInput, type ExprNode } from '@wallarm-org/design-system/FilterInput';\n\nexport const PairedField = () => {\n    const ParentComponent = () => {\n      const [value, setValue] = useState<ExprNode | null>(null);\n      return (\n        <FilterInput\n          data-testid='filter-input'\n          fields={pairedFields}\n          value={value}\n          onChange={setValue}\n        />\n      );\n    };\n    return <ParentComponent />;\n  };",
          "storyFile": "FilterInput/stories/FilterInput.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInput",
          "description": "`pairedField` captures two steps in one chip — a parameter name, then its value with its own operator — for an attribute that means nothing on its own."
        },
        {
          "name": "PairedFieldValueIsSet",
          "code": "import { useState } from 'react';\nimport { FilterInput, type ExprNode } from '@wallarm-org/design-system/FilterInput';\n\nexport const PairedFieldValueIsSet = () => {\n    const ParentComponent = () => {\n      const [value, setValue] = useState<ExprNode | null>({\n        type: 'group',\n        operator: 'and',\n        children: [\n          { type: 'condition', field: 'context_param', operator: '=', value: 'header' },\n          { type: 'condition', field: 'context_value', operator: 'is_null', value: null },\n        ],\n      });\n      return (\n        <FilterInput\n          data-testid='filter-input'\n          fields={pairedFields}\n          value={value}\n          onChange={setValue}\n        />\n      );\n    };\n    return <ParentComponent />;\n  };",
          "storyFile": "FilterInput/stories/FilterInput.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInput",
          "description": "`is set` and `is not set` on the paired half finish the chip with no second value, which is how you ask whether a key is present at all."
        },
        {
          "name": "PairedFieldValueDescriptions",
          "code": "import { useState } from 'react';\nimport { FilterInput, type ExprNode } from '@wallarm-org/design-system/FilterInput';\n\nexport const PairedFieldValueDescriptions = () => {\n    const ParentComponent = () => {\n      const [value, setValue] = useState<ExprNode | null>(null);\n      return (\n        <FilterInput\n          data-testid='filter-input'\n          fields={describedParamFields}\n          value={value}\n          onChange={setValue}\n        />\n      );\n    };\n    return <ParentComponent />;\n  };",
          "storyFile": "FilterInput/stories/FilterInput.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInput",
          "description": "The value rows carry a muted second line because the bold name is not unique: two `request-id` rows differ only by their path, and selecting one commits the path."
        },
        {
          "name": "PairedFieldPreset",
          "code": "import { useState } from 'react';\nimport { FilterInput, type ExprNode } from '@wallarm-org/design-system/FilterInput';\n\nexport const PairedFieldPreset = () => {\n    const ParentComponent = () => {\n      const [value, setValue] = useState<ExprNode | null>({\n        type: 'condition',\n        field: 'context_param',\n        operator: '=',\n        value: 'header',\n        pair: { operator: '=', value: 'authorization' },\n      });\n      return (\n        <FilterInput\n          data-testid='filter-input'\n          fields={pairedFields}\n          value={value}\n          onChange={setValue}\n        />\n      );\n    };\n    return <ParentComponent />;\n  };",
          "storyFile": "FilterInput/stories/FilterInput.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInput",
          "description": "The same paired field arriving pre-filled from a controlled value, rendered as the single chip it becomes."
        },
        {
          "name": "NestedValueSubmenu",
          "code": "import { useState } from 'react';\nimport { FilterInput, type ExprNode } from '@wallarm-org/design-system/FilterInput';\n\nexport const NestedValueSubmenu = () => {\n    const ParentComponent = () => {\n      const [value, setValue] = useState<ExprNode | null>(null);\n      return (\n        <>\n          <FilterInput\n            data-testid='filter-input'\n            fields={attackTypeNestedFields}\n            value={value}\n            onChange={setValue}\n            placeholder='Filter by attack type…'\n          />\n          {value && (\n            <div className='mt-16 rounded-8 border border-border-primary bg-bg-light-primary p-8 font-mono text-xs text-text-secondary'>\n              <pre>{JSON.stringify(value, null, 2)}</pre>\n            </div>\n          )}\n        </>\n      );\n    };\n    return <ParentComponent />;\n  };",
          "storyFile": "FilterInput/stories/FilterInput.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInput",
          "description": "Values grouped under section headers, with one row opening a submenu of sub-types: only leaves commit, so the expression never carries a group. A fully selected group collapses to its own label in the chip while a partial one lists the chosen leaves, and typing flattens the tree to matches at any depth."
        },
        {
          "name": "Default",
          "code": "import { FilterInputChip } from '@wallarm-org/design-system/FilterInput';\n\nexport const Default = () => (\n  <FilterInputChip />\n);",
          "storyFile": "FilterInput/stories/FilterInputChip.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputChip",
          "description": "The three segments a chip is made of; inside `FilterInput` each one is separately clickable, which is how a committed filter gets edited."
        },
        {
          "name": "WithError",
          "code": "import { FilterInputChip } from '@wallarm-org/design-system/FilterInput';\n\nexport const WithError = () => (\n  <FilterInputChip />\n);",
          "storyFile": "FilterInput/stories/FilterInputChip.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputChip",
          "description": "`error` reddens the chip for a value that was rejected. It is presentational only — the expression underneath is unchanged."
        },
        {
          "name": "WithLongText",
          "code": "import { FilterInputChip } from '@wallarm-org/design-system/FilterInput';\n\nexport const WithLongText = () => (\n  <FilterInputChip />\n);",
          "storyFile": "FilterInput/stories/FilterInputChip.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputChip",
          "description": "Long text in both segments. The chip caps at 320px; segments size to their content, with the attribute capped at 180px and the value guaranteed 60px minimum. When space is tight, the attribute shrinks first (since the value is what the filter matches on), both truncating with ellipsis rather than one segment collapsing to zero."
        },
        {
          "name": "WithValueMaxWidth",
          "code": "import { FilterInputChip } from '@wallarm-org/design-system/FilterInput';\n\nexport const WithValueMaxWidth = () => (\n  <FilterInputChip />\n);",
          "storyFile": "FilterInput/stories/FilterInputChip.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputChip",
          "description": "A field with its own `valueMaxWidth` (here 500px) lifts the chip's blanket cap and lets the value segment run wide, truncating with an ellipsis only past that width — for long freeform values like parameter-path expressions (AS-1064). The full value is preserved for matching."
        },
        {
          "name": "RealisticExample",
          "code": "import { FilterInputChip } from '@wallarm-org/design-system/FilterInput';\n\nexport const RealisticExample = () => (\n  <FilterInputChip />\n);",
          "storyFile": "FilterInput/stories/FilterInputChip.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputChip",
          "description": "The same chip carrying real content, which is where the segment widths actually get tested."
        },
        {
          "name": "AndOperator",
          "code": "import { FilterInputConnectorChip } from '../FilterInputField';\nimport { MockFilterInputProvider } from './mockFilterInputContext';\n\nexport const AndOperator = () => (\n  <MockFilterInputProvider>\n    <FilterInputConnectorChip variant='and' chipId='c-1' onChange={() => undefined} />\n  </MockFilterInputProvider>\n);",
          "storyFile": "FilterInput/stories/FilterInputChip.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputChip",
          "description": "The AND connector is itself a chip, clickable to change the join. Standalone it reads `FilterInput` context, so the story wraps it in a no-op provider."
        },
        {
          "name": "OrOperator",
          "code": "import { FilterInputConnectorChip } from '../FilterInputField';\nimport { MockFilterInputProvider } from './mockFilterInputContext';\n\nexport const OrOperator = () => (\n  <MockFilterInputProvider>\n    <FilterInputConnectorChip variant='or' chipId='c-1' onChange={() => undefined} />\n  </MockFilterInputProvider>\n);",
          "storyFile": "FilterInput/stories/FilterInputChip.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputChip",
          "description": "The OR connector, same shape — which is why AND/OR needs no separate control."
        },
        {
          "name": "CombinedWithAnd",
          "code": "import { FilterInputChip, FilterInputConnectorChip } from '../FilterInputField';\nimport { MockFilterInputProvider } from './mockFilterInputContext';\n\nexport const CombinedWithAnd = () => (\n  <MockFilterInputProvider>\n    <div className='flex items-center gap-4'>\n      <FilterInputChip attribute='IP Address' operator='is' value='192.168.1.1' />\n      <FilterInputConnectorChip variant='and' chipId='c-1' onChange={() => undefined} />\n      <FilterInputChip attribute='Country' operator='is' value='US' />\n    </div>\n  </MockFilterInputProvider>\n);",
          "storyFile": "FilterInput/stories/FilterInputChip.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputChip",
          "description": "Two conditions and the connector between them: what the input assembles as each chip commits."
        },
        {
          "name": "CombinedWithOr",
          "code": "import { FilterInputChip, FilterInputConnectorChip } from '../FilterInputField';\nimport { MockFilterInputProvider } from './mockFilterInputContext';\n\nexport const CombinedWithOr = () => (\n  <MockFilterInputProvider>\n    <div className='flex items-center gap-4'>\n      <FilterInputChip attribute='Status' operator='is' value='Active' />\n      <FilterInputConnectorChip variant='or' chipId='c-1' onChange={() => undefined} />\n      <FilterInputChip attribute='Status' operator='is' value='Pending' />\n    </div>\n  </MockFilterInputProvider>\n);",
          "storyFile": "FilterInput/stories/FilterInputChip.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputChip",
          "description": "The same pair joined by OR, where the connector is the only difference between two very different queries."
        },
        {
          "name": "WithDeleteButton",
          "code": "import { FilterInputChip } from '@wallarm-org/design-system/FilterInput';\n\nexport const WithDeleteButton = () => (\n  <FilterInputChip />\n);",
          "storyFile": "FilterInput/stories/FilterInputChip.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputChip",
          "description": "`onRemove` reveals the remove button on hover, so a resting filter row stays quiet."
        },
        {
          "name": "ErrorWithDelete",
          "code": "import { FilterInputChip } from '@wallarm-org/design-system/FilterInput';\n\nexport const ErrorWithDelete = () => (\n  <FilterInputChip />\n);",
          "storyFile": "FilterInput/stories/FilterInputChip.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputChip",
          "description": "Error plus remove — a rejected chip has to stay removable, since dropping it is usually the fastest fix."
        },
        {
          "name": "InteractiveDeleteExample",
          "code": "import * as React from 'react';\nimport { FilterInputChip, FilterInputConnectorChip } from '../FilterInputField';\nimport { MockFilterInputProvider } from './mockFilterInputContext';\n\nexport const InteractiveDeleteExample = () => {\n  const [chips, setChips] = React.useState([\n    { id: 1, attribute: 'IP Address', operator: 'is', value: '192.168.1.1' },\n    { id: 2, attribute: 'Country', operator: 'is', value: 'US' },\n    { id: 3, attribute: 'Status', operator: 'is', value: 'Active' },\n  ]);\n\n  return (\n    <MockFilterInputProvider>\n      <div className='flex items-center gap-4 flex-wrap'>\n        {chips.map((chip, index) => (\n          <React.Fragment key={chip.id}>\n            {index > 0 && (\n              <FilterInputConnectorChip\n                variant='and'\n                chipId={`connector-${chip.id}`}\n                onChange={() => undefined}\n              />\n            )}\n            <FilterInputChip\n              data-testid='filter-input-chip'\n              attribute={chip.attribute}\n              operator={chip.operator}\n              value={chip.value}\n              onRemove={() => setChips(chips.filter(c => c.id !== chip.id))}\n            />\n          </React.Fragment>\n        ))}\n        {chips.length === 0 && <p className='text-text-secondary text-sm'>All filters removed</p>}\n      </div>\n    </MockFilterInputProvider>\n  );\n};",
          "storyFile": "FilterInput/stories/FilterInputChip.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputChip",
          "description": "Removing chips one at a time, with the connectors closing up behind them."
        },
        {
          "name": "Disabled",
          "code": "import { FilterInputChip } from '@wallarm-org/design-system/FilterInput';\n\nexport const Disabled = () => (\n  <FilterInputChip />\n);",
          "storyFile": "FilterInput/stories/FilterInputChip.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputChip",
          "description": "`disabled` locks a chip: dimmed, no click, no remove, for a condition the surrounding page owns."
        },
        {
          "name": "DisabledWithOnRemove",
          "code": "import { FilterInputChip } from '@wallarm-org/design-system/FilterInput';\n\nexport const DisabledWithOnRemove = () => (\n  <FilterInputChip />\n);",
          "storyFile": "FilterInput/stories/FilterInputChip.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputChip",
          "description": "`disabled` wins over `onRemove` — no remove button appears, so a locked chip cannot be dropped by accident."
        },
        {
          "name": "DisabledAndInteractiveMix",
          "code": "import { FilterInputChip, FilterInputConnectorChip } from '../FilterInputField';\nimport { MockFilterInputProvider } from './mockFilterInputContext';\n\nexport const DisabledAndInteractiveMix = () => (\n  <MockFilterInputProvider>\n    <div className='flex items-center gap-4'>\n      <FilterInputChip\n        attribute='IP Address'\n        operator='is'\n        value='34.74.73.20'\n        disabled\n        onRemove={() => undefined}\n      />\n      <FilterInputConnectorChip variant='and' chipId='c-1' onChange={() => undefined} />\n      <FilterInputChip attribute='Country' operator='is' value='US' onRemove={onRemove} />\n    </div>\n  </MockFilterInputProvider>\n);",
          "storyFile": "FilterInput/stories/FilterInputChip.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputChip",
          "description": "Locked and editable chips in one row, which is what a drill-down actually looks like."
        },
        {
          "name": "BuildingAttributeOnly",
          "code": "import { FilterInputChip } from '@wallarm-org/design-system/FilterInput';\n\nexport const BuildingAttributeOnly = () => (\n  <FilterInputChip building attribute='IP Address' />\n);",
          "storyFile": "FilterInput/stories/FilterInputChip.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputChip",
          "description": "`building` is the half-made chip shown while a condition is being composed — attribute chosen, operator next."
        },
        {
          "name": "BuildingWithOperator",
          "code": "import { FilterInputChip } from '@wallarm-org/design-system/FilterInput';\n\nexport const BuildingWithOperator = () => (\n  <FilterInputChip building attribute='IP Address' operator='is' />\n);",
          "storyFile": "FilterInput/stories/FilterInputChip.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputChip",
          "description": "One step on, waiting for a value."
        },
        {
          "name": "BuildingComplete",
          "code": "import { FilterInputChip } from '@wallarm-org/design-system/FilterInput';\n\nexport const BuildingComplete = () => (\n  <FilterInputChip building attribute='IP Address' operator='is' value='192.168.1.1' />\n);",
          "storyFile": "FilterInput/stories/FilterInputChip.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputChip",
          "description": "All three segments filled, at the point where the chip commits and stops building."
        },
        {
          "name": "AllStatesShowcase",
          "code": "import { FilterInputChip, FilterInputConnectorChip } from '../FilterInputField';\nimport { MockFilterInputProvider } from './mockFilterInputContext';\n\nexport const AllStatesShowcase = () => (\n  <MockFilterInputProvider>\n    <div className='flex flex-col gap-4'>\n      {/* Chip variants */}\n      <div>\n        <div className='flex items-center gap-2 flex-wrap'>\n          <FilterInputChip attribute='Attribute' operator='operator' value='Value' />\n          <FilterInputChip attribute='Attribute' operator='operator' value='Value' error />\n          <FilterInputChip\n            attribute='Attribute'\n            operator='operator'\n            value='Value'\n            onRemove={() => undefined}\n          />\n          <FilterInputChip\n            attribute='Attribute'\n            operator='operator'\n            value='Value'\n            error\n            onRemove={() => undefined}\n          />\n        </div>\n      </div>\n      {/* Disabled chip variants */}\n      <div>\n        <div className='flex items-center gap-2 flex-wrap'>\n          <FilterInputChip attribute='IP Address' operator='is' value='34.74.73.20' disabled />\n          <FilterInputChip\n            attribute='Host'\n            operator='is'\n            value='api.example.com'\n            disabled\n            onRemove={() => undefined}\n          />\n        </div>\n      </div>\n      {/* Building chip variants */}\n      <div>\n        <div className='flex items-center gap-2 flex-wrap'>\n          <FilterInputChip building attribute='IP Address' />\n          <FilterInputChip building attribute='IP Address' operator='is' />\n          <FilterInputChip building attribute='IP Address' operator='is' value='192.168.1.1' />\n        </div>\n      </div>\n      {/* Connector variants */}\n      <div>\n        <div className='flex items-center gap-2 flex-wrap'>\n          <FilterInputConnectorChip variant='and' chipId='c-1' onChange={() => undefined} />\n          <FilterInputConnectorChip variant='or' chipId='c-2' onChange={() => undefined} />\n        </div>\n      </div>\n    </div>\n  </MockFilterInputProvider>\n);",
          "storyFile": "FilterInput/stories/FilterInputChip.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputChip",
          "description": "Every chip state in one frame — the quickest way to check a visual change has not shifted one of them."
        },
        {
          "name": "Paired",
          "code": "import { FilterInputChip } from '@wallarm-org/design-system/FilterInput';\n\nexport const Paired = () => (\n  <FilterInputChip\n    attribute='Context Param'\n    operator='is'\n    value='xxx'\n    pair={{ attribute: 'Value', operator: 'is', value: 'yyy' }}\n    onRemove={() => undefined}\n  />\n);",
          "storyFile": "FilterInput/stories/FilterInputChip.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputChip",
          "description": "A paired chip carries two triplets separated by a semicolon, for a field whose value means nothing without its key."
        },
        {
          "name": "PairedWithError",
          "code": "import { FilterInputChip } from '@wallarm-org/design-system/FilterInput';\n\nexport const PairedWithError = () => (\n  <FilterInputChip\n    attribute='Context Param'\n    operator='is'\n    value='xxx'\n    pair={{ attribute: 'Value', operator: 'is', value: 'yyy', error: 'value' }}\n    onRemove={() => undefined}\n  />\n);",
          "storyFile": "FilterInput/stories/FilterInputChip.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputChip",
          "description": "The error lands on the half that is wrong — here the required second value — rather than reddening the whole chip."
        },
        {
          "name": "PairedWithLongText",
          "code": "import { FilterInputChip } from '@wallarm-org/design-system/FilterInput';\n\nexport const PairedWithLongText = () => (\n  <FilterInputChip\n    attribute='Context Param With A Long Name'\n    operator='is'\n    value='a-very-long-first-value-that-truncates'\n    pair={{ attribute: 'Value', operator: 'is', value: 'a-very-long-second-value-that-truncates' }}\n    onRemove={() => undefined}\n  />\n);",
          "storyFile": "FilterInput/stories/FilterInputChip.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputChip",
          "description": "The same cap, 380px across two triplets. The base value is held to 90px so it cannot hide its partner, but every other segment keeps its full width, so the second value is the one that gives way."
        },
        {
          "name": "Default",
          "code": "import { useState } from 'react';\nimport { FilterInput, type ExprNode } from '@wallarm-org/design-system/FilterInput';\nimport { backendFieldsToMetadata, realBackendFields } from './backendFieldsFixture';\n\nexport const Default = () => {\n    const [expression, setExpression] = useState<ExprNode | null>(null);\n\n    const fields = realBackendFields.map(backendFieldsToMetadata);\n\n    return (\n      <>\n        <FilterInput\n          data-testid='filter-input'\n          fields={fields}\n          value={expression}\n          onChange={setExpression}\n          placeholder='Filter attacks...'\n          showKeyboardHint\n        />\n\n        {/* Debug output */}\n        {expression && (\n          <div className='mt-16 rounded-8 border border-border-primary bg-bg-light-primary p-8 font-mono text-xs text-text-secondary'>\n            <pre>{JSON.stringify(expression, null, 2)}</pre>\n          </div>\n        )}\n      </>\n    );\n  };",
          "storyFile": "FilterInput/stories/FilterInputComposition.stories.tsx",
          "storyTitle": "Patterns/FilterInput/Composition",
          "description": "The raw backend payload rendered as-is: around fifty fields, a hundred-plus application list, and the paired context-parameter field — the breadth the pattern has to survive."
        },
        {
          "name": "SuggestionsOnly",
          "code": "import { useState } from 'react';\nimport { FilterInput, type ExprNode, type FieldMetadata } from '@wallarm-org/design-system/FilterInput';\n\nexport const SuggestionsOnly = () => {\n    const [expression, setExpression] = useState<ExprNode | null>(null);\n\n    const suggestionFields: FieldMetadata[] = attackFields.map(field => ({\n      ...field,\n      strictValues: false,\n    }));\n\n    return (\n      <>\n        <FilterInput\n          data-testid='filter-input'\n          fields={suggestionFields}\n          value={expression}\n          onChange={setExpression}\n          placeholder='Type to filter — options are suggestions, free text allowed...'\n          showKeyboardHint\n        />\n\n        {expression && (\n          <div className='mt-16 rounded-8 border border-border-primary bg-bg-light-primary p-8 font-mono text-xs text-text-secondary'>\n            <pre>{JSON.stringify(expression, null, 2)}</pre>\n          </div>\n        )}\n      </>\n    );\n  };",
          "storyFile": "FilterInput/stories/FilterInputComposition.stories.tsx",
          "storyTitle": "Patterns/FilterInput/Composition",
          "description": "With `strictValues: false` everywhere, option lists become suggestions and any typed value commits, which is how the Attacks page treats the schema. Type checks and explicit `validate` callbacks still apply."
        },
        {
          "name": "Simple",
          "code": "import { useState } from 'react';\nimport { FilterInput, type ExprNode, type FieldMetadata } from '@wallarm-org/design-system/FilterInput';\n\nexport const Simple = () => {\n    const [expression, setExpression] = useState<ExprNode | null>(null);\n\n    const simpleFields: FieldMetadata[] = [\n      {\n        name: 'status',\n        label: 'Status',\n        type: 'enum',\n        values: [\n          { value: 'active', label: 'Active' },\n          { value: 'pending', label: 'Pending' },\n          { value: 'archived', label: 'Archived' },\n        ],\n      },\n      {\n        name: 'priority',\n        label: 'Priority',\n        type: 'integer',\n        values: [\n          { value: 1, label: 'Low' },\n          { value: 5, label: 'Medium' },\n          { value: 10, label: 'High' },\n        ],\n      },\n    ];\n\n    return (\n      <>\n        <FilterInput\n          data-testid='filter-input'\n          fields={simpleFields}\n          value={expression}\n          onChange={expr => {\n            onFilterChange(expr);\n            setExpression(expr);\n          }}\n          placeholder='Filter items...'\n        />\n\n        {expression && (\n          <div className='mt-16 rounded-8 border border-border-primary bg-bg-light-primary p-8 font-mono text-xs text-text-secondary'>\n            <pre data-testid='expression-debug'>{JSON.stringify(expression, null, 2)}</pre>\n          </div>\n        )}\n      </>\n    );\n  };",
          "storyFile": "FilterInput/stories/FilterInputComposition.stories.tsx",
          "storyTitle": "Patterns/FilterInput/Composition",
          "description": "Two fields, to show the same component scales down — though at this size a pair of `Select`s is usually the better answer."
        },
        {
          "name": "BackendIntegration",
          "code": "import { useState } from 'react';\nimport { FilterInput, type ExprNode, type FieldMetadata } from '@wallarm-org/design-system/FilterInput';\nimport { Skeleton } from '@wallarm-org/design-system/Skeleton';\n\nexport const BackendIntegration = () => {\n    const [metadata, setMetadata] = useState<FieldMetadata[] | null>(null);\n    const [expression, setExpression] = useState<ExprNode | null>(null);\n\n    // Simulate fetching metadata from backend\n    useState(() => {\n      // In real app: fetch('/api/security/query-metadata')\n      setTimeout(() => {\n        setMetadata(attackFields);\n      }, 100);\n    });\n\n    if (!metadata) {\n      return <Skeleton width='100%' height='40px' />;\n    }\n\n    return (\n      <FilterInput\n        data-testid='filter-input'\n        fields={metadata}\n        value={expression}\n        onChange={setExpression}\n        placeholder='Loading metadata from backend...'\n      />\n    );\n  };",
          "storyFile": "FilterInput/stories/FilterInputComposition.stories.tsx",
          "storyTitle": "Patterns/FilterInput/Composition",
          "description": "The schema arriving from a fetch: until `fields` exists there is nothing to filter by, so the input waits behind a placeholder block."
        },
        {
          "name": "Default",
          "code": "export const Default = () => <FieldMenuHarness fields={sampleFields} onSelect={noop} />;",
          "storyFile": "FilterInput/stories/FilterInputFieldMenu.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputFieldMenu",
          "description": "The plain list — every field in the config, label first, whatever its type."
        },
        {
          "name": "FewFields",
          "code": "export const FewFields = () => <FieldMenuHarness fields={sampleFields.slice(0, 5)} onSelect={noop} />;",
          "storyFile": "FilterInput/stories/FilterInputFieldMenu.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputFieldMenu",
          "description": "A short config, to check the menu does not pad itself out."
        },
        {
          "name": "Closed",
          "code": "<FilterInput fields={sampleFields} open={false} onSelect={noop} />",
          "storyFile": "FilterInput/stories/FilterInputFieldMenu.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputFieldMenu",
          "description": "`open={false}` renders nothing at all — no collapsed shell, no placeholder — so\nthis frame is deliberately empty. It is the one story with no trigger."
        },
        {
          "name": "Interactive",
          "code": "export const Interactive = () => <FieldMenuHarness fields={sampleFields} onSelect={noop} showSelection />;",
          "storyFile": "FilterInput/stories/FilterInputFieldMenu.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputFieldMenu",
          "description": "Selection wired up, so you can watch which field the menu hands back."
        },
        {
          "name": "WithSearch",
          "code": "export const WithSearch = () => <FieldMenuHarness fields={sampleFields} onSelect={noop} />;",
          "storyFile": "FilterInput/stories/FilterInputFieldMenu.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputFieldMenu",
          "description": "Typing filters the list by label and name, case-insensitively — try “status” or “CWE”."
        },
        {
          "name": "WithRecentFields",
          "code": "export const WithRecentFields = () => (\n    <FieldMenuHarness fields={sampleFields} recentConditions={recentConditions} onSelect={noop} />\n  );",
          "storyFile": "FilterInput/stories/FilterInputFieldMenu.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputFieldMenu",
          "description": "`recentConditions` puts the last few filters back at the top, capped at three —\nwhat keeps a fifty-field menu usable day to day. Each row replays the whole\ncondition, not just the field."
        },
        {
          "name": "WithSuggestions",
          "code": "export const WithSuggestions = () => (\n    <FieldMenuHarness\n      fields={sampleFields}\n      suggestedFields={sampleFields.slice(0, 3)}\n      onSelect={noop}\n    />\n  );",
          "storyFile": "FilterInput/stories/FilterInputFieldMenu.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputFieldMenu",
          "description": "A curated suggestions section, for the handful of fields most people reach for first."
        },
        {
          "name": "WithGroups",
          "code": "export const WithGroups = () => (\n    <FieldMenuHarness\n      fields={sampleFields}\n      fieldGroups={[\n        { label: 'Threat classification', fields: ['status', 'severity', 'blocking_status'] },\n        {\n          label: 'Request features',\n          fields: ['http_status_code', 'endpoint', 'hostname', 'parameter'],\n        },\n        { label: 'Source and identity', fields: ['location', 'network', 'impact'] },\n      ]}\n      onSelect={noop}\n    />\n  );",
          "storyFile": "FilterInput/stories/FilterInputFieldMenu.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputFieldMenu",
          "description": "Fields under labelled group headers, in array order, with anything left out of\nevery group falling into a trailing headerless section — here, `CWE`."
        },
        {
          "name": "WithDescriptions",
          "code": "export const WithDescriptions = () => (\n    <FieldMenuHarness\n      fields={describedFields}\n      fieldGroups={[\n        {\n          label: 'Threat classification',\n          fields: ['attack_type', 'parameter', 'status_code', 'no_desc'],\n        },\n      ]}\n      onSelect={noop}\n    />\n  );",
          "storyFile": "FilterInput/stories/FilterInputFieldMenu.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputFieldMenu",
          "description": "Hovering or keyboard-focusing a row opens a popover beside the menu with the description and, where the value format is not obvious, an example. A row with no description opens nothing, and group headers are inert."
        },
        {
          "name": "WithScrollableDescriptions",
          "code": "export const WithScrollableDescriptions = () => <FieldMenuHarness fields={manyDescribedFields} onSelect={noop} />;",
          "storyFile": "FilterInput/stories/FilterInputFieldMenu.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputFieldMenu",
          "description": "A described list long enough to scroll, for checking the popover keeps up with the cursor and the keyboard."
        },
        {
          "name": "WithRecentAndSuggestions",
          "code": "export const WithRecentAndSuggestions = () => (\n    <FieldMenuHarness\n      fields={sampleFields}\n      recentConditions={recentConditions.slice(0, 2)}\n      suggestedFields={sampleFields.slice(0, 2)}\n      onSelect={noop}\n    />\n  );",
          "storyFile": "FilterInput/stories/FilterInputFieldMenu.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputFieldMenu",
          "description": "Both props set, and only Recent renders — the two shortcut sections are\nmutually exclusive, so suggestions are the fallback for someone with no\nhistory rather than a second row of shortcuts."
        },
        {
          "name": "StringType",
          "code": "export const StringType = () => <OperatorMenuHarness fieldType='string' />;",
          "storyFile": "FilterInput/stories/FilterInputOperatorMenu.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputOperatorMenu",
          "description": "A string field: equality, substring matching, set membership, and the two presence checks."
        },
        {
          "name": "IntegerType",
          "code": "export const IntegerType = () => <OperatorMenuHarness fieldType='integer' />;",
          "storyFile": "FilterInput/stories/FilterInputOperatorMenu.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputOperatorMenu",
          "description": "Numbers add the comparison operators, which is the usual reason to reach for a query builder at all, with `in` below the rule as its own group. `between` is not here — it is date-only."
        },
        {
          "name": "FloatType",
          "code": "export const FloatType = () => <OperatorMenuHarness fieldType='float' />;",
          "storyFile": "FilterInput/stories/FilterInputOperatorMenu.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputOperatorMenu",
          "description": "Same comparisons as integer, minus `in`: picking an exact float out of a list is not a real query."
        },
        {
          "name": "DateType",
          "code": "export const DateType = () => <OperatorMenuHarness fieldType='date' />;",
          "storyFile": "FilterInput/stories/FilterInputOperatorMenu.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputOperatorMenu",
          "description": "Dates are the only type that offers `between`, so a time window is one condition rather than two, and the comparisons read as before and after."
        },
        {
          "name": "BooleanType",
          "code": "export const BooleanType = () => <OperatorMenuHarness fieldType='boolean' />;",
          "storyFile": "FilterInput/stories/FilterInputOperatorMenu.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputOperatorMenu",
          "description": "A boolean offers is / is not and the presence checks, and nothing else is worth asking."
        },
        {
          "name": "EnumType",
          "code": "export const EnumType = () => <OperatorMenuHarness fieldType='enum' />;",
          "storyFile": "FilterInput/stories/FilterInputOperatorMenu.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputOperatorMenu",
          "description": "An enum trades comparison for set membership: is one of / is not one of is the operator that earns its place here."
        },
        {
          "name": "Interactive",
          "code": "export const Interactive = () => <OperatorMenuHarness fieldType='string' />;",
          "storyFile": "FilterInput/stories/FilterInputOperatorMenu.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputOperatorMenu",
          "description": "Selection wired up, with the chosen operator echoed beside the trigger."
        },
        {
          "name": "KeyboardNavigation",
          "code": "export const KeyboardNavigation = () => (\n  <div className='flex flex-col gap-8'>\n    <OperatorMenuHarness fieldType='string' />\n  </div>\n);",
          "storyFile": "FilterInput/stories/FilterInputOperatorMenu.stories.tsx",
          "storyTitle": "Patterns/FilterInput/FilterInputOperatorMenu",
          "description": "Arrow keys move, Enter selects, Escape closes — the menu is fully operable without a pointer once the trigger has opened it."
        }
      ]
    },
    {
      "name": "Flex",
      "description": "A flex container with the properties as props — `direction`, `justify`, `align`, `wrap`, plus `basis` fractions and `grow` / `shrink` for how the children size themselves. Reach for `Stack`, or `HStack` / `VStack`, when all you want is a spaced list in one direction: `Stack` carries a default gap where `Flex` has none. `Flex` takes no `className`, so everything goes through props.",
      "importPath": "@wallarm-org/design-system/Flex",
      "props": [
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "align",
          "type": "{ start: string; center: string; end: string; stretch: string; baseline: string; }",
          "required": false,
          "defaultValue": "stretch"
        },
        {
          "name": "inline",
          "type": "{ true: string; false: string; }",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "grow",
          "type": "{ true: string; false: string; }",
          "required": false
        },
        {
          "name": "fullWidth",
          "type": "{ true: string; }",
          "required": false
        },
        {
          "name": "wrap",
          "type": "{ wrap: string; nowrap: string; reverse: string; }",
          "required": false,
          "defaultValue": "nowrap"
        },
        {
          "name": "direction",
          "type": "{ row: string; column: string; 'row-reverse': string; 'column-reverse': string; }",
          "required": false,
          "defaultValue": "row"
        },
        {
          "name": "justify",
          "type": "{ start: string; center: string; end: string; between: string; around: string; evenly: string; }",
          "required": false,
          "defaultValue": "start"
        },
        {
          "name": "gap",
          "type": "complex",
          "required": false
        },
        {
          "name": "shrink",
          "type": "{ true: string; false: string; }",
          "required": false
        },
        {
          "name": "basis",
          "type": "complex",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "asChild",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "false"
        }
      ],
      "variants": [
        {
          "name": "inline",
          "options": [
            "true",
            "false"
          ]
        },
        {
          "name": "direction",
          "options": [
            "row",
            "column",
            "row-reverse",
            "column-reverse"
          ]
        },
        {
          "name": "align",
          "options": [
            "start",
            "center",
            "end",
            "stretch",
            "baseline"
          ]
        },
        {
          "name": "justify",
          "options": [
            "start",
            "center",
            "end",
            "between",
            "around",
            "evenly"
          ]
        },
        {
          "name": "wrap",
          "options": [
            "wrap",
            "nowrap",
            "reverse"
          ]
        },
        {
          "name": "gap",
          "options": [
            "1",
            "2",
            "4",
            "6",
            "8",
            "12",
            "16",
            "20",
            "24",
            "28",
            "32",
            "36",
            "40",
            "44",
            "48",
            "56",
            "64",
            "80",
            "96",
            "112",
            "128",
            "144"
          ]
        },
        {
          "name": "grow",
          "options": [
            "true",
            "false"
          ]
        },
        {
          "name": "shrink",
          "options": [
            "true",
            "false"
          ]
        },
        {
          "name": "fullWidth",
          "options": [
            "true"
          ]
        },
        {
          "name": "basis",
          "options": [
            "auto",
            "full",
            "1/2",
            "1/3",
            "2/3",
            "1/4",
            "2/4",
            "3/4",
            "1/5",
            "2/5",
            "3/5",
            "4/5",
            "1/6",
            "2/6",
            "3/6",
            "4/6",
            "5/6",
            "1/12",
            "2/12",
            "3/12",
            "4/12",
            "5/12",
            "6/12",
            "7/12",
            "8/12",
            "9/12",
            "10/12",
            "11/12",
            "0"
          ]
        }
      ],
      "subComponents": [],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Flex } from '@wallarm-org/design-system/Flex';\n\nexport const Basic = () => (\n  <Flex gap={4}>\n    <Box>A</Box>\n    <Box>B</Box>\n    <Box>C</Box>\n  </Flex>\n);",
          "storyFile": "Flex/Flex.stories.tsx",
          "storyTitle": "Layout/Flex",
          "description": "A row of three, which is the default direction. There is no gap until you ask for one."
        },
        {
          "name": "Direction",
          "code": "import { Flex } from '@wallarm-org/design-system/Flex';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Direction = () => (\n  <Flex direction='column' gap={8}>\n    <VStack>\n      <Flex direction='row' gap={2}>\n        <Box className='h-32 py-2 px-4 text-sm'>1</Box>\n        <Box className='h-32 py-2 px-4 text-sm'>2</Box>\n        <Box className='h-32 py-2 px-4 text-sm'>3</Box>\n      </Flex>\n    </VStack>\n    <VStack>\n      <Flex direction='column' gap={2}>\n        <Box className='h-32 py-2 px-4 text-sm'>1</Box>\n        <Box className='h-32 py-2 px-4 text-sm'>2</Box>\n        <Box className='h-32 py-2 px-4 text-sm'>3</Box>\n      </Flex>\n    </VStack>\n    <VStack>\n      <Flex direction='row-reverse' gap={2}>\n        <Box className='h-32 py-2 px-4 text-sm'>1</Box>\n        <Box className='h-32 py-2 px-4 text-sm'>2</Box>\n        <Box className='h-32 py-2 px-4 text-sm'>3</Box>\n      </Flex>\n    </VStack>\n  </Flex>\n);",
          "storyFile": "Flex/Flex.stories.tsx",
          "storyTitle": "Layout/Flex",
          "description": "`row`, `column` and `row-reverse`. Reverse changes the paint order without touching the DOM order, so it moves the visual sequence away from the tab order — use it sparingly."
        },
        {
          "name": "Alignment",
          "code": "import { Flex } from '@wallarm-org/design-system/Flex';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Alignment = () => (\n  <Flex direction='column' gap={8}>\n    <VStack>\n      <Flex justify='start' fullWidth>\n        <Box className='h-16 w-16 text-xs'>A</Box>\n        <Box className='h-16 w-16 text-xs'>B</Box>\n      </Flex>\n    </VStack>\n    <VStack>\n      <Flex justify='center' fullWidth>\n        <Box className='h-16 w-16 text-xs'>A</Box>\n        <Box className='h-16 w-16 text-xs'>B</Box>\n      </Flex>\n    </VStack>\n    <VStack>\n      <Flex justify='between' fullWidth>\n        <Box className='h-16 w-16 text-xs'>A</Box>\n        <Box className='h-16 w-16 text-xs'>B</Box>\n      </Flex>\n    </VStack>\n  </Flex>\n);",
          "storyFile": "Flex/Flex.stories.tsx",
          "storyTitle": "Layout/Flex",
          "description": "`justify` distributes along the main axis, and needs `fullWidth` (or a sized parent) to have any room to distribute in."
        },
        {
          "name": "Wrap",
          "code": "import { Flex } from '@wallarm-org/design-system/Flex';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Wrap = () => (\n  <VStack>\n    <Flex wrap='wrap' gap={2} fullWidth>\n      {new Array(40).fill(null).map((_, index) => {\n        const key = `${index + 1}`;\n        return (\n          <Box className='h-20 w-20 text-xs' key={key}>\n            {key}\n          </Box>\n        );\n      })}\n    </Flex>\n  </VStack>\n);",
          "storyFile": "Flex/Flex.stories.tsx",
          "storyTitle": "Layout/Flex",
          "description": "`wrap` lets the row break onto more lines once it runs out of width, which is what keeps a long row of chips or tags from overflowing."
        },
        {
          "name": "GrowShrink",
          "code": "import { Flex } from '@wallarm-org/design-system/Flex';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const GrowShrink = () => (\n  <Flex direction='column' gap={8}>\n    <VStack>\n      <Flex fullWidth>\n        <Box className='h-16 flex-1 text-xs'>Flex-1</Box>\n        <Box className='h-16 flex-1 text-xs'>Flex-1</Box>\n        <Box className='h-16 text-xs'>Fixed</Box>\n      </Flex>\n    </VStack>\n    <VStack>\n      <Flex fullWidth>\n        <Box className='h-16 flex-shrink text-xs'>Shrinkable long content</Box>\n        <Box className='h-16 flex-shrink-0 text-xs'>No shrink</Box>\n      </Flex>\n    </VStack>\n  </Flex>\n);",
          "storyFile": "Flex/Flex.stories.tsx",
          "storyTitle": "Layout/Flex",
          "description": "How the children behave when the space does not fit: growing to fill it, or shrinking to survive it. `basis` is the third lever, for a child that should start at a fraction of the row."
        }
      ]
    },
    {
      "name": "FormatDateTime",
      "description": "Prints a timestamp the way the house date guide says to: `relative` by default for anything recent, `date` when only the day matters, `datetime` when the exact moment does. Relative stops being relative as a date ages — past roughly five months it prints the day and month, past a year it adds the year — and it always carries the full absolute time, timezone included, in a tooltip.",
      "importPath": "@wallarm-org/design-system/FormatDateTime",
      "props": [
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "value",
          "type": "string | number | Date | null | undefined",
          "required": true,
          "description": "ISO string, Date object, or Unix timestamp (ms)"
        },
        {
          "name": "format",
          "type": "FormatDateTimeFormat | undefined",
          "required": false,
          "description": "Display format. Default: 'relative'",
          "defaultValue": "relative"
        },
        {
          "name": "layout",
          "type": "FormatDateTimeLayout | undefined",
          "required": false,
          "description": "Datetime layout. `stacked` puts date over time; `inline` puts them on one\nline. Only affects `format='datetime'`. Default: 'stacked'",
          "defaultValue": "stacked"
        },
        {
          "name": "showSeconds",
          "type": "boolean | undefined",
          "required": false,
          "description": "Show seconds in the relative-format tooltip. Default: true",
          "defaultValue": "true"
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [],
      "examples": [
        {
          "name": "Relative",
          "code": "import { subDays, subHours, subMinutes, subMonths, subSeconds, subYears } from 'date-fns';\nimport { FormatDateTime } from '@wallarm-org/design-system/FormatDateTime';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Relative = () => (\n  <VStack gap={12} align='start'>\n    <HStack gap={16} align='center'>\n      <FormatDateTime value={subSeconds(now, 10)} format='relative' />\n    </HStack>\n    <HStack gap={16} align='center'>\n      <FormatDateTime value={subMinutes(now, 12)} format='relative' />\n    </HStack>\n    <HStack gap={16} align='center'>\n      <FormatDateTime value={subHours(now, 3)} format='relative' />\n    </HStack>\n    <HStack gap={16} align='center'>\n      <FormatDateTime value={subHours(now, 30)} format='relative' />\n    </HStack>\n    <HStack gap={16} align='center'>\n      <FormatDateTime value={subDays(now, 5)} format='relative' />\n    </HStack>\n    <HStack gap={16} align='center'>\n      <FormatDateTime value={subDays(now, 21)} format='relative' />\n    </HStack>\n    <HStack gap={16} align='center'>\n      <FormatDateTime value={subMonths(now, 3)} format='relative' />\n    </HStack>\n    <HStack gap={16} align='center'>\n      <FormatDateTime value={subDays(now, 200)} format='relative' />\n    </HStack>\n    <HStack gap={16} align='center'>\n      <FormatDateTime value={subYears(now, 2)} format='relative' />\n    </HStack>\n  </VStack>\n);",
          "storyFile": "FormatDateTime/FormatDateTime.stories.tsx",
          "storyTitle": "Data Display/FormatDateTime",
          "description": "The whole ladder in one frame, from `Just now` up to the age where it gives up and\nprints a date instead. The dashed underline is the cue that the precise value is one\nhover away."
        },
        {
          "name": "DateFormat",
          "code": "import { FormatDateTime } from '@wallarm-org/design-system/FormatDateTime';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const DateFormat = () => (\n  <VStack gap={12} align='start'>\n    <FormatDateTime value='2026-01-01T00:00:00' format='date' />\n    <FormatDateTime value='2026-02-11T14:32:07' format='date' />\n    <FormatDateTime value='2025-06-15T09:00:00' format='date' />\n  </VStack>\n);",
          "storyFile": "FormatDateTime/FormatDateTime.stories.tsx",
          "storyTitle": "Data Display/FormatDateTime",
          "description": "`format='date'` drops the time — and drops the year too when the date falls in the\ncurrent one, which is why only the 2025 row carries it."
        },
        {
          "name": "DatetimeFormat",
          "code": "import { FormatDateTime } from '@wallarm-org/design-system/FormatDateTime';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const DatetimeFormat = () => (\n  <VStack gap={12} align='start'>\n    <FormatDateTime value='2026-01-01T11:00:00' format='datetime' />\n    <FormatDateTime value='2026-02-11T14:32:07' format='datetime' />\n    <FormatDateTime value='2025-12-25T23:59:59' format='datetime' />\n  </VStack>\n);",
          "storyFile": "FormatDateTime/FormatDateTime.stories.tsx",
          "storyTitle": "Data Display/FormatDateTime",
          "description": "`format='datetime'` shows both, the time in secondary type with its timezone, and no\ntooltip: there is nothing left to reveal."
        },
        {
          "name": "DatetimeLayout",
          "code": "import { FormatDateTime } from '@wallarm-org/design-system/FormatDateTime';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const DatetimeLayout = () => (\n  <HStack gap={64} align='start'>\n    <VStack gap={12} align='start'>\n      <FormatDateTime value='2026-01-01T11:00:00' format='datetime' layout='stacked' />\n      <FormatDateTime value='2026-02-11T14:32:07' format='datetime' layout='stacked' />\n      <FormatDateTime value='2025-12-25T23:59:59' format='datetime' layout='stacked' />\n    </VStack>\n    <VStack gap={12} align='start'>\n      <FormatDateTime value='2026-01-01T11:00:00' format='datetime' layout='inline' />\n      <FormatDateTime value='2026-02-11T14:32:07' format='datetime' layout='inline' />\n      <FormatDateTime value='2025-12-25T23:59:59' format='datetime' layout='inline' />\n    </VStack>\n  </HStack>\n);",
          "storyFile": "FormatDateTime/FormatDateTime.stories.tsx",
          "storyTitle": "Data Display/FormatDateTime",
          "description": "`stacked` is the default and the table-cell shape; `inline` puts date and time on one\nbaseline for a row that cannot grow to two lines."
        },
        {
          "name": "WithDescription",
          "code": "import { FormatDateTime } from '@wallarm-org/design-system/FormatDateTime';\nimport { VStack } from '@wallarm-org/design-system/Stack';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const WithDescription = () => (\n  <VStack gap={12} align='start'>\n    <VStack gap={2}>\n      <FormatDateTime value='2026-01-01T00:00:00' format='date' />\n      <Text size='sm' color='secondary'>\n        Created by admin\n      </Text>\n    </VStack>\n    <VStack gap={2}>\n      <FormatDateTime value='2026-02-11T14:32:07' format='date' />\n      <Text size='sm' color='secondary'>\n        Last modified\n      </Text>\n    </VStack>\n  </VStack>\n);",
          "storyFile": "FormatDateTime/FormatDateTime.stories.tsx",
          "storyTitle": "Data Display/FormatDateTime",
          "description": "When, and then who or what — the second line is composed from `Text` rather than being\na prop, so it can say anything the row needs."
        },
        {
          "name": "NullValue",
          "code": "import { FormatDateTime } from '@wallarm-org/design-system/FormatDateTime';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const NullValue = () => (\n  <VStack gap={12} align='start'>\n    <FormatDateTime value={null} />\n    <FormatDateTime value={undefined} />\n  </VStack>\n);",
          "storyFile": "FormatDateTime/FormatDateTime.stories.tsx",
          "storyTitle": "Data Display/FormatDateTime",
          "description": "`null` and `undefined` both come out as an em dash rather than an empty cell, with 'No\ndata' behind it on hover."
        },
        {
          "name": "FutureDate",
          "code": "import { FormatDateTime } from '@wallarm-org/design-system/FormatDateTime';\n\nexport const FutureDate = () => (\n  <FormatDateTime value={new Date(Date.now() + 5 * 60 * 1000)} format='relative' />\n);",
          "storyFile": "FormatDateTime/FormatDateTime.stories.tsx",
          "storyTitle": "Data Display/FormatDateTime",
          "description": "A timestamp five minutes ahead reads `Just now` rather than counting forwards — the\ncomponent absorbs clock skew between a browser and a server instead of showing it."
        },
        {
          "name": "DateOrderAndHourCycle",
          "code": "import { subDays } from 'date-fns';\nimport { DateFormatProvider } from '@wallarm-org/design-system/DateFormatProvider';\nimport { FormatDateTime } from '@wallarm-org/design-system/FormatDateTime';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const DateOrderAndHourCycle = () => (\n  <VStack gap={24} align='start'>\n    <VStack gap={12} align='start'>\n      <DateFormatProvider order='day-first' hourCycle={24}>\n        <VStack gap={8} align='start'>\n          <FormatDateTime value='2026-02-11T14:32:07' format='date' />\n          <FormatDateTime value='2026-02-11T14:32:07' format='datetime' />\n          <FormatDateTime value={subDays(now, 200)} format='relative' />\n        </VStack>\n      </DateFormatProvider>\n    </VStack>\n    <VStack gap={12} align='start'>\n      <DateFormatProvider order='month-first' hourCycle={12}>\n        <VStack gap={8} align='start'>\n          <FormatDateTime value='2026-02-11T14:32:07' format='date' />\n          <FormatDateTime value='2026-02-11T14:32:07' format='datetime' />\n          <FormatDateTime value={subDays(now, 200)} format='relative' />\n        </VStack>\n      </DateFormatProvider>\n    </VStack>\n    <VStack gap={12} align='start'>\n      <DateFormatProvider order='day-first' hourCycle={12}>\n        <VStack gap={8} align='start'>\n          <FormatDateTime value='2026-02-11T14:32:07' format='date' />\n          <FormatDateTime value='2026-02-11T14:32:07' format='datetime' />\n          <FormatDateTime value={subDays(now, 200)} format='relative' />\n        </VStack>\n      </DateFormatProvider>\n    </VStack>\n    <VStack gap={12} align='start'>\n      <DateFormatProvider order='month-first' hourCycle={24}>\n        <VStack gap={8} align='start'>\n          <FormatDateTime value='2026-02-11T14:32:07' format='date' />\n          <FormatDateTime value='2026-02-11T14:32:07' format='datetime' />\n          <FormatDateTime value={subDays(now, 200)} format='relative' />\n        </VStack>\n      </DateFormatProvider>\n    </VStack>\n  </VStack>\n);",
          "storyFile": "FormatDateTime/FormatDateTime.stories.tsx",
          "storyTitle": "Data Display/FormatDateTime",
          "description": "The component respects the app's date order from `DateFormatProvider`. Day-first (the\ndefault) prints \"11 Feb, 2026\"; month-first prints \"Feb 11, 2026\". Both hour cycles\nare shown: 24-hour and 12-hour with AM/PM."
        }
      ]
    },
    {
      "name": "FormatNumber",
      "description": "Prints a number the way the house number guide says to: abbreviated by default — `12k`, `59.6M` — with the full figure in a tooltip behind a dashed underline. `type` chooses the family: `decimal`, `percent`, which refuses to round to a flat `0%` or `100%` it has not earned, and `byte`, which counts in units of 1000.",
      "importPath": "@wallarm-org/design-system/FormatNumber",
      "props": [
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "value",
          "type": "number | null | undefined",
          "required": true,
          "description": "Numeric value to display. null/undefined renders em dash + \"No data\" tooltip."
        },
        {
          "name": "type",
          "type": "FormatNumberType | undefined",
          "required": false,
          "description": "Formatting category. Default: 'decimal'.\n- 'decimal': plain number with optional abbreviation\n- 'percent': percentage with boundary safety\n- 'byte': decimal byte units: 512 B, 2.3 GB",
          "defaultValue": "decimal"
        },
        {
          "name": "notation",
          "type": "FormatNumberNotation | undefined",
          "required": false,
          "description": "'compact' abbreviates (12k, 59.6M); 'standard' shows full value.\nDefault: 'compact'. Only applies to type='decimal' and type='byte'.",
          "defaultValue": "compact"
        },
        {
          "name": "unit",
          "type": "string | undefined",
          "required": false,
          "description": "Unit label for accessible name + tooltip: \"requests\", \"errors\".\nAppended after a space. Only meaningful for type='decimal'."
        },
        {
          "name": "decimals",
          "type": "number | undefined",
          "required": false,
          "description": "Decimal places for percent. Default: 0.",
          "defaultValue": "0"
        },
        {
          "name": "tooltip",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether to show a tooltip with the full value on abbreviated numbers.\nWhen false, abbreviated values display without tooltip or dashed underline.\nDefault: true."
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [],
      "examples": [
        {
          "name": "Compact",
          "code": "import { FormatNumber } from '@wallarm-org/design-system/FormatNumber';\n\nexport const Compact = () => (\n  <div className='grid grid-cols-[1fr_1fr] items-center gap-x-16 gap-y-12'>\n    {compactValues.map(v => (\n      <>\n        <FormatNumber key={v} value={v} />\n      </>\n    ))}\n  </div>\n);",
          "storyFile": "FormatNumber/FormatNumber.stories.tsx",
          "storyTitle": "Data Display/FormatNumber",
          "description": "The raw value beside what the component makes of it, across the tier boundaries —\n999,499 stays `999k` while 999,500 becomes `1M`, because the tier turns over when\nrounding would reach 1000×. Abbreviated values use tabular figures, so a column of\nthem stays aligned."
        },
        {
          "name": "Standard",
          "code": "import { FormatNumber } from '@wallarm-org/design-system/FormatNumber';\n\nexport const Standard = () => (\n  <div className='grid grid-cols-[1fr_1fr] items-center gap-x-16 gap-y-12'>\n    {compactValues.map(v => (\n      <>\n        <FormatNumber key={v} value={v} notation='standard' />\n      </>\n    ))}\n  </div>\n);",
          "storyFile": "FormatNumber/FormatNumber.stories.tsx",
          "storyTitle": "Data Display/FormatNumber",
          "description": "`notation='standard'` prints the grouped figure instead, for the place where the exact\nnumber is the point and there is room to show it."
        },
        {
          "name": "WithUnit",
          "code": "import { FormatNumber } from '@wallarm-org/design-system/FormatNumber';\n\nexport const WithUnit = () => (\n  <div className='grid grid-cols-[1fr_1fr] items-center gap-x-16 gap-y-12'>\n    <FormatNumber value={42} unit='requests' />\n    <FormatNumber value={12_042} unit='requests' />\n    <FormatNumber value={59_614_283} unit='errors' />\n    <FormatNumber value={500} unit='requests' notation='standard' />\n  </div>\n);",
          "storyFile": "FormatNumber/FormatNumber.stories.tsx",
          "storyTitle": "Data Display/FormatNumber",
          "description": "`unit` follows the value — except on an abbreviated number with its tooltip still on,\nwhere it moves into the tooltip and the accessible name and leaves the cell."
        },
        {
          "name": "Percent",
          "code": "import { FormatNumber } from '@wallarm-org/design-system/FormatNumber';\n\nexport const Percent = () => (\n  <div className='grid grid-cols-[1fr_1fr] items-center gap-x-16 gap-y-12'>\n    <FormatNumber value={0} type='percent' />\n    <FormatNumber value={0.02} type='percent' />\n    <FormatNumber value={0.02} type='percent' decimals={1} />\n    <FormatNumber value={25.5} type='percent' decimals={1} />\n    <FormatNumber value={50} type='percent' />\n    <FormatNumber value={99.97} type='percent' />\n    <FormatNumber value={99.97} type='percent' decimals={1} />\n    <FormatNumber value={100} type='percent' />\n  </div>\n);",
          "storyFile": "FormatNumber/FormatNumber.stories.tsx",
          "storyTitle": "Data Display/FormatNumber",
          "description": "The boundary rules: anything above zero that would round to `0%` prints `<1%`, and\nanything below a hundred that would round to `100%` prints `>99%`, with `decimals`\nmoving both thresholds."
        },
        {
          "name": "Bytes",
          "code": "import { FormatNumber } from '@wallarm-org/design-system/FormatNumber';\n\nexport const Bytes = () => (\n  <div className='grid grid-cols-[1fr_1fr] items-center gap-x-16 gap-y-12'>\n    <FormatNumber value={512} type='byte' />\n    <FormatNumber value={3_400} type='byte' />\n    <FormatNumber value={12_700_000} type='byte' />\n    <FormatNumber value={2_345_678_901} type='byte' />\n    <FormatNumber value={1_100_000_000_000} type='byte' />\n    <FormatNumber value={12_700_000} type='byte' notation='standard' />\n  </div>\n);",
          "storyFile": "FormatNumber/FormatNumber.stories.tsx",
          "storyTitle": "Data Display/FormatNumber",
          "description": "`byte` counts in decimal units — a thousand to the kilobyte, not 1024 — so 12,700,000\nreads `12.7 MB`, and `standard` spells the whole figure out."
        },
        {
          "name": "NoTooltip",
          "code": "import { FormatNumber } from '@wallarm-org/design-system/FormatNumber';\n\nexport const NoTooltip = () => (\n  <div className='grid grid-cols-[1fr_1fr] items-center gap-x-16 gap-y-12'>\n    <FormatNumber value={12_042} tooltip={false} />\n    <FormatNumber value={59_614_283} tooltip={false} />\n    <FormatNumber value={12_042} unit='requests' tooltip={false} />\n    <FormatNumber value={12_700_000} type='byte' tooltip={false} />\n  </div>\n);",
          "storyFile": "FormatNumber/FormatNumber.stories.tsx",
          "storyTitle": "Data Display/FormatNumber",
          "description": "`tooltip={false}` removes the tooltip and the dashed underline with it, for a cell where\nthe abbreviation is enough; the full value stays in the accessible name."
        },
        {
          "name": "NegativeValues",
          "code": "import { FormatNumber } from '@wallarm-org/design-system/FormatNumber';\n\nexport const NegativeValues = () => (\n  <div className='grid grid-cols-[1fr_1fr] items-center gap-x-16 gap-y-12'>\n    <FormatNumber value={-42} />\n    <FormatNumber value={-12_042} />\n    <FormatNumber value={-59_614_283} />\n  </div>\n);",
          "storyFile": "FormatNumber/FormatNumber.stories.tsx",
          "storyTitle": "Data Display/FormatNumber",
          "description": "Negatives abbreviate on the same tiers, with the sign kept in front of the number."
        },
        {
          "name": "NullValue",
          "code": "import { FormatNumber } from '@wallarm-org/design-system/FormatNumber';\n\nexport const NullValue = () => (\n  <div className='grid grid-cols-[1fr_1fr] items-center gap-x-16 gap-y-12'>\n    <FormatNumber value={null} />\n    <FormatNumber value={undefined} />\n  </div>\n);",
          "storyFile": "FormatNumber/FormatNumber.stories.tsx",
          "storyTitle": "Data Display/FormatNumber",
          "description": "`null` and `undefined` render an em dash with 'No data' on hover, so a figure nobody\nrecorded never reads as a zero."
        },
        {
          "name": "SpecialValues",
          "code": "import { FormatNumber } from '@wallarm-org/design-system/FormatNumber';\n\nexport const SpecialValues = () => (\n  <div className='grid grid-cols-[1fr_1fr] items-center gap-x-16 gap-y-12'>\n    <FormatNumber value={0} />\n    <FormatNumber value={Number.NaN} />\n    <FormatNumber value={Number.POSITIVE_INFINITY} />\n  </div>\n);",
          "storyFile": "FormatNumber/FormatNumber.stories.tsx",
          "storyTitle": "Data Display/FormatNumber",
          "description": "Zero is printed as itself rather than abbreviated, while `NaN` and `Infinity` fall back\nto the em dash — with no tooltip, since there is nothing behind them to show."
        }
      ]
    },
    {
      "name": "Heading",
      "description": "Geist for titles and section headings, where hierarchy comes from the size step — reach for `Text` when the words are copy rather than a title. Visual size and document level are independent: pick `size` for how it looks and `as` for the outline, so a visually small heading can still be the `h2` the structure needs.",
      "importPath": "@wallarm-org/design-system/Heading",
      "props": [
        {
          "name": "color",
          "type": "{ primary: string; 'primary-alt': string; secondary: string; 'secondary-alt': string; inherit: string; }",
          "required": false,
          "defaultValue": "inherit"
        },
        {
          "name": "size",
          "type": "{ sm: string; md: string; lg: string; xl: string; '2xl': string; '3xl': string; '4xl': string; '5xl': string; '6xl': string; '7xl': string; }",
          "required": false,
          "defaultValue": "xl"
        },
        {
          "name": "weight",
          "type": "{ light: string; regular: string; medium: string; bold: string; }",
          "required": false,
          "defaultValue": "bold"
        },
        {
          "name": "align",
          "type": "{ left: string; center: string; right: string; }",
          "required": false
        },
        {
          "name": "grow",
          "type": "{ true: string; }",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "truncate",
          "type": "{ true: string; }",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "asChild",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "lineClamp",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "as",
          "type": "C | undefined",
          "required": false,
          "defaultValue": "h1"
        }
      ],
      "variants": [
        {
          "name": "size",
          "options": [
            "sm",
            "md",
            "lg",
            "xl",
            "2xl",
            "3xl",
            "4xl",
            "5xl",
            "6xl",
            "7xl"
          ]
        },
        {
          "name": "weight",
          "options": [
            "light",
            "regular",
            "medium",
            "bold"
          ]
        },
        {
          "name": "color",
          "options": [
            "primary",
            "primary-alt",
            "secondary",
            "secondary-alt",
            "inherit"
          ]
        },
        {
          "name": "align",
          "options": [
            "left",
            "center",
            "right"
          ]
        },
        {
          "name": "grow",
          "options": [
            "true"
          ]
        },
        {
          "name": "truncate",
          "options": [
            "true"
          ]
        }
      ],
      "subComponents": [],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Heading } from '@wallarm-org/design-system/Heading';\n\nexport const Basic = () => (\n  <Heading>Default Heading</Heading>\n);",
          "storyFile": "Heading/Heading.stories.tsx",
          "storyTitle": "Typography/Heading",
          "description": "The default step. A heading is a title first and a size second, which is why the two are\nseparate props."
        },
        {
          "name": "Sizes",
          "code": "import { Heading } from '@wallarm-org/design-system/Heading';\nimport { VStack } from '@wallarm-org/design-system/Stack';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const Sizes = () => (\n  <VStack gap={24} align='start'>\n    {SIZES.map(({ size, metrics }) => (\n      <VStack key={size} gap={4} align='start'>\n        <Text size='xs' color='secondary'>\n          size=&apos;{size}&apos; · {metrics}\n        </Text>\n        <Heading size={size}>\n          The quick brown fox\n        </Heading>\n      </VStack>\n    ))}\n  </VStack>\n);",
          "storyFile": "Heading/Heading.stories.tsx",
          "storyTitle": "Typography/Heading",
          "description": "The full ramp with its metrics. The bottom steps deliberately duplicate the text ramp — `sm`\nis 14 on 20 exactly as in `Text` — because what separates them is semantic, not visual."
        },
        {
          "name": "Weights",
          "code": "import { Heading } from '@wallarm-org/design-system/Heading';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Weights = () => (\n  <VStack align='start'>\n    <Heading size='3xl' weight='light'>\n      Light Weight Heading\n    </Heading>\n    <Heading size='3xl' weight='regular'>\n      Regular Weight Heading\n    </Heading>\n    <Heading size='3xl' weight='medium'>\n      Medium Weight Heading\n    </Heading>\n    <Heading size='3xl' weight='bold'>\n      Bold Weight Heading\n    </Heading>\n  </VStack>\n);",
          "storyFile": "Heading/Heading.stories.tsx",
          "storyTitle": "Typography/Heading",
          "description": "All four weights at every size, so weight emphasises within a level rather than creating one."
        },
        {
          "name": "AsChild",
          "code": "import { Heading } from '@wallarm-org/design-system/Heading';\n\nexport const AsChild = () => (\n  <Heading size='4xl' weight='bold' asChild>\n    <h2>Custom H2 Element with AsChild</h2>\n  </Heading>\n);",
          "storyFile": "Heading/Heading.stories.tsx",
          "storyTitle": "Typography/Heading",
          "description": "`asChild` moves the styling onto your own element, keeping whatever tag the surrounding\nmarkup needs."
        },
        {
          "name": "PolymorphicElements",
          "code": "import { Heading } from '@wallarm-org/design-system/Heading';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const PolymorphicElements = () => (\n  <VStack align='start'>\n    <Heading as='h1' size='4xl'>\n      H1 Heading\n    </Heading>\n    <Heading as='h2' size='3xl'>\n      H2 Heading\n    </Heading>\n    <Heading as='h3' size='2xl'>\n      H3 Heading\n    </Heading>\n    <Heading as='h4' size='xl'>\n      H4 Heading\n    </Heading>\n    <Heading as='h5' size='lg'>\n      H5 Heading\n    </Heading>\n    <Heading as='h6' size='md'>\n      H6 Heading\n    </Heading>\n  </VStack>\n);",
          "storyFile": "Heading/Heading.stories.tsx",
          "storyTitle": "Typography/Heading",
          "description": "`as` across the heading levels, which is the outline both a screen reader and a table of\ncontents read. Choose it from the document structure, not from the size you wanted."
        },
        {
          "name": "AsSpan",
          "code": "import { Heading } from '@wallarm-org/design-system/Heading';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const AsSpan = () => (\n  <Text>\n    This is a paragraph with{' '}\n    <Heading as='span' size='lg' weight='bold'>\n      inline heading text\n    </Heading>{' '}\n    using span element.\n  </Text>\n);",
          "storyFile": "Heading/Heading.stories.tsx",
          "storyTitle": "Typography/Heading",
          "description": "A heading rendered inline, for a title inside a row of other content where a block element\nwould break the line."
        },
        {
          "name": "AsDiv",
          "code": "import { Heading } from '@wallarm-org/design-system/Heading';\n\nexport const AsDiv = () => (\n  <Heading as='div' size='2xl' weight='medium'>\n    This heading is rendered as a div element\n  </Heading>\n);",
          "storyFile": "Heading/Heading.stories.tsx",
          "storyTitle": "Typography/Heading",
          "description": "A heading with no document level at all, for text that looks like a title but should not\nappear in the outline."
        }
      ]
    },
    {
      "name": "HttpMethod",
      "description": "Renders an HTTP method as a fixed-colour code `Badge` — the colour is part of the vocabulary rather than a choice: safe reads green, destructive rose, the technical verbs slate. A verb outside the seven known ones prints verbatim in slate, so nothing unexpected is swallowed; reach for `Badge` itself when what you are labelling is not a method.",
      "importPath": "@wallarm-org/design-system/HttpMethod",
      "props": [
        {
          "name": "method",
          "type": "(string & {}) | HttpMethodName",
          "required": true,
          "description": "HTTP method to render. Known values from `HttpMethodName` get a dedicated\ncolor via `HTTP_METHOD_COLOR`; any other string renders in slate as the\n\"Other\" fallback (the text itself is shown verbatim)."
        },
        {
          "name": "size",
          "type": "\"small\" | \"medium\" | \"large\" | null | undefined",
          "required": false,
          "description": "Badge size — defaults to `medium`.",
          "defaultValue": "medium"
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [],
      "examples": [
        {
          "name": "Playground",
          "code": "import { HttpMethod } from '@wallarm-org/design-system/HttpMethod';\n\nexport const Playground = () => <HttpMethod />;",
          "storyFile": "HttpMethod/HttpMethod.stories.tsx",
          "storyTitle": "Data Display/HttpMethod",
          "description": "One badge on the controls, for trying a method or a size the stories below do not cover."
        },
        {
          "name": "AllMethods",
          "code": "import { HTTP_METHODS, HttpMethod } from '@wallarm-org/design-system/HttpMethod';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const AllMethods = () => (\n  <VStack align='start' gap={8}>\n    {HTTP_METHODS.map(method => (\n      <HttpMethod key={method} method={method} />\n    ))}\n    <HttpMethod method='OTHER' />\n  </VStack>\n);",
          "storyFile": "HttpMethod/HttpMethod.stories.tsx",
          "storyTitle": "Data Display/HttpMethod",
          "description": "The seven methods with their locked colours, and an unrecognised verb underneath taking\nthe slate fallback."
        },
        {
          "name": "Sizes",
          "code": "import { HTTP_METHODS, HttpMethod } from '@wallarm-org/design-system/HttpMethod';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Sizes = () => (\n  <VStack gap={16}>\n    <HStack align='center' gap={8}>\n      {HTTP_METHODS.map(method => (\n        <HttpMethod key={method} method={method} size='medium' />\n      ))}\n    </HStack>\n    <HStack align='center' gap={8}>\n      {HTTP_METHODS.map(method => (\n        <HttpMethod key={method} method={method} size='large' />\n      ))}\n    </HStack>\n  </VStack>\n);",
          "storyFile": "HttpMethod/HttpMethod.stories.tsx",
          "storyTitle": "Data Display/HttpMethod",
          "description": "`medium`, the default, is a 20px badge; `large` adds vertical padding to reach 24px and\nleaves the code type at 12px, so it is about air in the row, not emphasis."
        },
        {
          "name": "UnknownMethodFallsBackToSlate",
          "code": "import { HttpMethod } from '@wallarm-org/design-system/HttpMethod';\nimport { HStack } from '@wallarm-org/design-system/Stack';\n\nexport const UnknownMethodFallsBackToSlate = () => (\n  <HStack align='center' gap={8}>\n    <HttpMethod method='TRACE' />\n    <HttpMethod method='CONNECT' />\n    <HttpMethod method='LINK' />\n  </HStack>\n);",
          "storyFile": "HttpMethod/HttpMethod.stories.tsx",
          "storyTitle": "Data Display/HttpMethod",
          "description": "`TRACE`, `CONNECT` and `LINK` are real verbs with no colour of their own, so they come\nout slate rather than being dropped or rewritten."
        }
      ]
    },
    {
      "name": "ImageCropper",
      "description": "Select part of an image by moving and zooming it inside a fixed frame, then export a Blob at the exact outputSize. The frame follows the output aspect ratio and preserves the source proportions. Compose Slider for zoom, FileUpload for choosing a file, and your own Save action through ImageCropperContext. All processing runs in the browser; the consumer owns uploading. Preview rounding is visual only: the saved image is rectangular. Remote images need crossOrigin=\"anonymous\" on ImageCropperImage and server CORS permission for canvas export; local file/object URLs also work. Size the preview with width classes; CSS scale transforms on ancestors are not supported by the underlying crop geometry. Arrow keys pan, Shift accelerates, and +/− zoom.",
      "importPath": "@wallarm-org/design-system/ImageCropper",
      "props": [
        {
          "name": "outputSize",
          "type": "ImageCropperSize",
          "required": true,
          "description": "Exact exported pixel dimensions; also determines the visible frame's aspect ratio."
        },
        {
          "name": "zoom",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "defaultZoom",
          "type": "number | undefined",
          "required": false,
          "defaultValue": "1"
        },
        {
          "name": "minZoom",
          "type": "number | undefined",
          "required": false,
          "description": "The minimum scale, relative to the image covering the frame. Must be at least 1.",
          "defaultValue": "1"
        },
        {
          "name": "maxZoom",
          "type": "number | undefined",
          "required": false,
          "defaultValue": "5"
        },
        {
          "name": "onZoomChange",
          "type": "((zoom: number) => void) | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [
        {
          "name": "ImageCropperContext",
          "props": []
        },
        {
          "name": "ImageCropperGrid",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "ImageCropperImage",
          "props": [
            {
              "name": "alt",
              "type": "string | undefined",
              "required": false,
              "defaultValue": ""
            },
            {
              "name": "height",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "loading",
              "type": "\"eager\" | \"lazy\" | undefined",
              "required": false
            },
            {
              "name": "src",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "width",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "ImageCropperSelection",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "ImageCropperViewport",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Avatar",
          "code": "export const Avatar = () => <Example compact />;",
          "storyFile": "ImageCropper/ImageCropper.stories.tsx",
          "storyTitle": "Inputs/ImageCropper",
          "description": "A small rounded preview like the avatar design; the saved square is 256 × 256 pixels."
        },
        {
          "name": "Landscape",
          "code": "import { LANDSCAPE } from './stories/fixtures';\n\nexport const Landscape = () => (\n  <Example source={LANDSCAPE} outputSize={{ width: 320, height: 180 }} />\n);",
          "storyFile": "ImageCropper/ImageCropper.stories.tsx",
          "storyTitle": "Inputs/ImageCropper",
          "description": "Wide source and output: a 600 × 300 image is cropped to a 320 × 180 result."
        },
        {
          "name": "WithFileUpload",
          "code": "export const WithFileUpload = () => <Example upload />;",
          "storyFile": "ImageCropper/ImageCropper.stories.tsx",
          "storyTitle": "Inputs/ImageCropper",
          "description": "FileUpload owns picking and validation; useFilePreviewUrl releases the local object URL."
        },
        {
          "name": "Controlled",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\n\nexport const Controlled = () => {\n  const [zoom, setZoom] = useState(1.5);\n  const [locked, setLocked] = useState(false);\n  return (\n    <div className='flex flex-col items-center gap-16'>\n      <Example\n        zoom={zoom}\n        onZoomChange={value => {\n          if (!locked) setZoom(value);\n        }}\n      />\n      <Button\n        variant='secondary'\n        color='neutral'\n        data-testid='cropper-lock-zoom'\n        onClick={() => setLocked(value => !value)}\n      >\n        {locked ? 'Unlock zoom' : 'Lock zoom'}\n      </Button>\n    </div>\n  );\n};",
          "storyFile": "ImageCropper/ImageCropper.stories.tsx",
          "storyTitle": "Inputs/ImageCropper",
          "description": "The parent can accept or reject zoom changes; the image and external slider follow its value."
        },
        {
          "name": "Geometry",
          "code": "import { WIDE_BANDS } from './stories/fixtures';\n\nexport const Geometry = () => (\n  <Example source={WIDE_BANDS} outputSize={{ width: 64, height: 64 }} geometry />\n);",
          "storyFile": "ImageCropper/ImageCropper.stories.tsx",
          "storyTitle": "Inputs/ImageCropper",
          "description": "Color bands make source proportions and the exact exported selection easy to verify."
        }
      ]
    },
    {
      "name": "Indicator",
      "description": "A coloured dot for a state next to something that already names it — a row, a tab, an item in a list. Reach for `Badge` when the state needs naming, since colour on its own carries nothing for a reader who cannot separate the hues.",
      "importPath": "@wallarm-org/design-system/Indicator",
      "props": [
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "color",
          "type": "string | undefined",
          "required": false,
          "defaultValue": "info"
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "size",
          "type": "{ sm: string; md: string; }",
          "required": false,
          "defaultValue": "sm"
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "size",
          "options": [
            "sm",
            "md"
          ],
          "defaultValue": "sm"
        },
        {
          "name": "color",
          "options": [
            "info",
            "brand",
            "warning",
            "success",
            "ai",
            "danger"
          ],
          "defaultValue": "info"
        }
      ],
      "subComponents": [],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Indicator } from '@wallarm-org/design-system/Indicator';\n\nexport const Basic = () => <Indicator />;",
          "storyFile": "Indicator/Indicator.stories.tsx",
          "storyTitle": "Status Indication/Indicator",
          "description": "The default dot. It only works where the thing beside it is already labelled — the dot\nqualifies that label rather than replacing it."
        },
        {
          "name": "AllVariants",
          "code": "import { Indicator } from '@wallarm-org/design-system/Indicator';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const AllVariants = () => (\n  // Fixed-width cells so each size heading sits over its own column: the dots are 6 and 8px, far\n  // narrower than the words above them, so without a shared width nothing lines up.\n  <VStack gap={16} align='start'>\n    <HStack gap={24} align='center'>\n    </HStack>\n    {colors.map(color => (\n      <HStack key={color} gap={24} align='center'>\n        <div className='flex w-32 justify-center'>\n          <Indicator size='sm' color={color} />\n        </div>\n        <div className='flex w-32 justify-center'>\n          <Indicator size='md' color={color} />\n        </div>\n      </HStack>\n    ))}\n  </VStack>\n);",
          "storyFile": "Indicator/Indicator.stories.tsx",
          "storyTitle": "Status Indication/Indicator",
          "description": "Both sizes against every colour. The colours mean what they mean everywhere else in the\nsystem, so pick from meaning rather than from contrast."
        }
      ]
    },
    {
      "name": "InlineEdit",
      "description": "Turns a displayed value into its own editor, so a reader can correct one field without opening a form — reach for a form when several values change together. Every story composes it inside an `Attribute`, because that is what keeps the read and edit states the same height and stops the row jumping on toggle.",
      "importPath": "@wallarm-org/design-system/InlineEdit",
      "props": [
        {
          "name": "value",
          "type": "T | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "T | undefined",
          "required": false
        },
        {
          "name": "onValueChange",
          "type": "((value: T) => void) | undefined",
          "required": false
        },
        {
          "name": "onValueCommit",
          "type": "((value: T) => void | Promise<unknown>) | undefined",
          "required": false
        },
        {
          "name": "onValueRevert",
          "type": "((value: T) => void) | undefined",
          "required": false
        },
        {
          "name": "onBeforeValueCommit",
          "type": "((value: T, committedValue: T) => boolean | void | Promise<boolean | void>) | undefined",
          "required": false,
          "description": "Commit guard. Called on every submit (Enter, blur, popover close,\nconfirm button) before `onValueCommit`, with the draft to be committed\nand the current committed value. Only an explicit `false` (or a promise\nresolving to `false`) blocks the commit: the field silently stays in\nedit mode with the draft. Any other result — `true`, `undefined`, no\nreturn — lets the commit proceed. A rejection or a synchronous throw is\ntreated like a commit failure: status `error`, message from the error,\nfield stays in edit mode.\n\nWhile the guard's promise is pending the edit session is held: duplicate\nsubmits are suppressed, blur neither submits nor cancels, and the field\nshows no status (`idle` — the consumer's confirmation UI is the\nfeedback). Escape still cancels; a late resolution after cancel is\ndropped. The value committed on `true` is exactly the `value` argument\nthe guard received; if the draft changed while the guard was pending,\nthe resolution is dropped and the field stays in edit mode.\n\nGuards must settle via non-blocking UI (a promise resolved by dialog\nbuttons). Synchronous blocking dialogs (`window.confirm`) are\nunsupported with submitMode 'blur'/'both' (the queued blur re-prompts).\nThe guard's owner never gets its consumer UI closed by the DS — treat\nthe dialog's own buttons as the source of truth for closing it."
        },
        {
          "name": "edit",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultEdit",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "onEditChange",
          "type": "((editing: boolean) => void) | undefined",
          "required": false
        },
        {
          "name": "activationMode",
          "type": "InlineEditActivationMode | undefined",
          "required": false
        },
        {
          "name": "submitMode",
          "type": "InlineEditSubmitMode | undefined",
          "required": false
        },
        {
          "name": "selectOnFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "status",
          "type": "InlineEditStatus | undefined",
          "required": false
        },
        {
          "name": "savedDuration",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "disabled",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "readOnly",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "multiline",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        },
        {
          "name": "activatable",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        },
        {
          "name": "invalid",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        }
      ],
      "subComponents": [
        {
          "name": "InlineEditControl",
          "props": [
            {
              "name": "submitMode",
              "type": "InlineEditSubmitMode | undefined",
              "required": false,
              "description": "Explicit render-time submit mode for this editor session. Highest\nprecedence (beats editor registrations and the root prop) — the escape\nhatch for custom editors that cannot call useInlineEditSubmitMode."
            },
            {
              "name": "showActions",
              "type": "boolean | undefined",
              "required": false,
              "description": "Show floating action buttons (submit/cancel) below the input.\nProvides a mouse-clickable alternative to Enter/Escape keyboard shortcuts.",
              "defaultValue": "true"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "InlineEditDate",
          "props": []
        },
        {
          "name": "InlineEditDateTime",
          "props": []
        },
        {
          "name": "InlineEditError",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "InlineEditInput",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "pattern",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "HTMLInputTypeAttribute | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "size",
              "type": "{ default: string; medium: string; small: string; 'inline-edit': string; }",
              "required": false,
              "defaultValue": "inline-edit"
            },
            {
              "name": "alt",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "height",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "src",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "width",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "autoComplete",
              "type": "HTMLInputAutoCompleteAttribute | undefined",
              "required": false
            },
            {
              "name": "maxLength",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "minLength",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "placeholder",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "readOnly",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "required",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "checked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "step",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "accept",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "max",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "min",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "multiple",
              "type": "boolean | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "InlineEditNumber",
          "props": [
            {
              "name": "form",
              "type": "string | undefined",
              "required": false,
              "description": "The associate form of the input element."
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "pattern",
              "type": "string | undefined",
              "required": false,
              "description": "The pattern used to check the <input> element's value against"
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | undefined",
              "required": false,
              "description": "The initial value of the input when rendered.\nUse when you don't need to control the value of the input."
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string",
              "required": false,
              "description": "The unique identifier of the machine."
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "inputMode",
              "type": "InputMode | undefined",
              "required": false,
              "description": "Hints at the type of data that might be entered by the user. It also determines\nthe type of keyboard shown to the user on mobile devices"
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false,
              "description": "Whether the number input is disabled."
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false,
              "description": "The name attribute of the number input. Useful for form submission."
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "description": "Use the provided child element as the default rendered element, combining their props and behavior."
            },
            {
              "name": "size",
              "type": "{ default: string; medium: string; small: string; 'inline-edit': string; }",
              "required": false,
              "defaultValue": "inline-edit"
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "ids",
              "type": "ElementIds | undefined",
              "required": false,
              "description": "The ids of the elements in the number input. Useful for composition."
            },
            {
              "name": "readOnly",
              "type": "boolean | undefined",
              "required": false,
              "description": "Whether the number input is readonly"
            },
            {
              "name": "required",
              "type": "boolean | undefined",
              "required": false,
              "description": "Whether the number input is required"
            },
            {
              "name": "step",
              "type": "number | undefined",
              "required": false,
              "description": "The amount to increment or decrement the value by"
            },
            {
              "name": "max",
              "type": "number | undefined",
              "required": false,
              "description": "The maximum value of the number input"
            },
            {
              "name": "min",
              "type": "number | undefined",
              "required": false,
              "description": "The minimum value of the number input"
            },
            {
              "name": "translations",
              "type": "IntlTranslations | undefined",
              "required": false,
              "description": "Specifies the localized strings that identifies the accessibility elements and their states"
            },
            {
              "name": "largeStep",
              "type": "number | undefined",
              "required": false,
              "description": "The amount to increment or decrement the value by when the `Shift` key is held."
            },
            {
              "name": "smallStep",
              "type": "number | undefined",
              "required": false,
              "description": "The amount to increment or decrement the value by when the `Alt` key is held."
            },
            {
              "name": "allowMouseWheel",
              "type": "boolean | undefined",
              "required": false,
              "description": "Whether to allow mouse wheel to change the value"
            },
            {
              "name": "allowOverflow",
              "type": "boolean | undefined",
              "required": false,
              "description": "Whether to allow the value overflow the min/max range"
            },
            {
              "name": "clampValueOnBlur",
              "type": "boolean | undefined",
              "required": false,
              "description": "Whether to clamp the value when the input loses focus (blur)"
            },
            {
              "name": "focusInputOnChange",
              "type": "boolean | undefined",
              "required": false,
              "description": "Whether to focus input when the value changes"
            },
            {
              "name": "formatOptions",
              "type": "Intl.NumberFormatOptions | undefined",
              "required": false,
              "description": "The options to pass to the `Intl.NumberFormat` constructor"
            },
            {
              "name": "onValueInvalid",
              "type": "complex",
              "required": false,
              "description": "Function invoked when the value overflows or underflows the min/max range"
            },
            {
              "name": "onFocusChange",
              "type": "complex",
              "required": false,
              "description": "Function invoked when the number input is focused"
            },
            {
              "name": "onValueCommit",
              "type": "complex",
              "required": false,
              "description": "Function invoked when the value is committed (when the input is blurred or the Enter key is pressed)"
            },
            {
              "name": "spinOnPress",
              "type": "boolean | undefined",
              "required": false,
              "description": "Whether to spin the value when the increment/decrement button is pressed"
            },
            {
              "name": "locale",
              "type": "string | undefined",
              "required": false,
              "description": "The current locale. Based on the BCP 47 definition."
            }
          ]
        },
        {
          "name": "InlineEditPreview",
          "props": [
            {
              "name": "tooltip",
              "type": "ReactNode",
              "required": false,
              "description": "Tooltip shown on hover/focus while the value is editable. Defaults to\n`'Edit'`. Pass `null` to disable the tooltip.",
              "defaultValue": "Edit"
            },
            {
              "name": "lineClamp",
              "type": "1 | 2 | 3 | 4 | 5 | 6 | undefined",
              "required": false,
              "description": "Clamp the read-mode value to this many lines (with an ellipsis) instead of\nthe default single-line truncation. Use for multi-line values (textarea).\nApplies to the default (no-parts) composition; when composing\n`InlineEditPreviewValue` explicitly, set `lineClamp` on it directly."
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "InlineEditPreviewIcon",
          "props": []
        },
        {
          "name": "InlineEditPreviewValue",
          "props": [
            {
              "name": "lineClamp",
              "type": "1 | 2 | 3 | 4 | 5 | 6 | undefined",
              "required": false,
              "description": "Clamp the read-mode value to this many lines (with an ellipsis) instead of\nthe default single-line truncation. Use for multi-line values (textarea)."
            }
          ]
        },
        {
          "name": "InlineEditSelect",
          "props": [
            {
              "name": "items",
              "type": "SelectDataItem[] | undefined",
              "required": false,
              "description": "Options; the collection is built internally (PaginationPageSize\nprecedent). Provide exactly one of `items` / `collection`."
            },
            {
              "name": "collection",
              "type": "complex",
              "required": false,
              "description": "A prebuilt collection (e.g. built once upstream, or with custom\nfiltering/sorting). Provide exactly one of `items` / `collection` — a\ndev-only warning fires otherwise."
            },
            {
              "name": "multiple",
              "type": "boolean | undefined",
              "required": false,
              "defaultValue": "false"
            }
          ]
        },
        {
          "name": "InlineEditTextarea",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "size",
              "type": "{ small: string; medium: string; default: string; 'inline-edit': string; }",
              "required": false,
              "defaultValue": "inline-edit"
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "autoComplete",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "maxLength",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "minLength",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "placeholder",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "readOnly",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "required",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "minRows",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "maxRows",
              "type": "number | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "InlineEditTime",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "TimeValue | null | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false,
              "description": "Whether the input is disabled. Prevents user interaction."
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "size",
              "type": "TemporalInputSize | undefined",
              "required": false,
              "description": "Visual size. Default: 'default' (36px).",
              "defaultValue": "inline-edit"
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "error",
              "type": "boolean | undefined",
              "required": false,
              "description": "Whether the input has an error state. Sets `aria-invalid` and error styling."
            },
            {
              "name": "placeholder",
              "type": "string | undefined",
              "required": false,
              "description": "Placeholder shown when no value is selected."
            },
            {
              "name": "readOnly",
              "type": "boolean | undefined",
              "required": false,
              "description": "Whether the input is read-only. Segments are focusable but not editable."
            },
            {
              "name": "showIcon",
              "type": "boolean | undefined",
              "required": false,
              "description": "Whether to show the leading icon. Default: true.",
              "defaultValue": "false"
            },
            {
              "name": "minValue",
              "type": "TimeValue | undefined",
              "required": false
            },
            {
              "name": "maxValue",
              "type": "TimeValue | undefined",
              "required": false
            },
            {
              "name": "placeholderValue",
              "type": "TimeValue | undefined",
              "required": false
            },
            {
              "name": "isRequired",
              "type": "boolean | undefined",
              "required": false,
              "description": "Marks the field as required in assistive tech and HTML form validation."
            },
            {
              "name": "showTimeDropdown",
              "type": "boolean | undefined",
              "required": false,
              "description": "Show dropdown for time selection with arrow navigation.",
              "defaultValue": "true"
            },
            {
              "name": "timeStep",
              "type": "number | undefined",
              "required": false,
              "description": "Time interval in minutes for dropdown options. Default: 30."
            },
            {
              "name": "granularity",
              "type": "TimeInputGranularity | undefined",
              "required": false,
              "description": "Smallest editable unit.\n- 'hour': hours only\n- 'minute': hours and minutes (default)\n- 'second': hours, minutes, and seconds",
              "defaultValue": "minute"
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "TextEditor",
          "code": "import { useState } from 'react';\nimport { Attribute, AttributeLabel, AttributeValue } from '@wallarm-org/design-system/Attribute';\nimport { InlineEdit, InlineEditControl, InlineEditError, InlineEditInput, InlineEditPreview } from '@wallarm-org/design-system/InlineEdit';\n\nexport const TextEditor = () => {\n  const [text, setText] = useState('Checkout API');\n  return (\n    <div className='w-[320px]'>\n      <Attribute>\n        <AttributeLabel>Name</AttributeLabel>\n        <AttributeValue>\n          <InlineEdit\n            value={text}\n            onValueCommit={v => setText(v as string)}\n            data-testid='text'\n          >\n            <InlineEditPreview data-analytics-id='inline-edit-name'>{text}</InlineEditPreview>\n            <InlineEditControl>\n              <InlineEditInput data-analytics-id='inline-edit-name-input' aria-label='Name' />\n            </InlineEditControl>\n            <InlineEditError />\n          </InlineEdit>\n        </AttributeValue>\n      </Attribute>\n    </div>\n  );\n};",
          "storyFile": "InlineEdit/InlineEdit.stories.tsx",
          "storyTitle": "Inputs/InlineEdit",
          "description": "The default editor. Clicking the value swaps in an input of the same size, which is why the\nrow does not move."
        },
        {
          "name": "NumberEditor",
          "code": "import { useState } from 'react';\nimport { Attribute, AttributeLabel, AttributeValue } from '@wallarm-org/design-system/Attribute';\nimport { InlineEdit, InlineEditControl, InlineEditNumber, InlineEditPreview } from '@wallarm-org/design-system/InlineEdit';\n\nexport const NumberEditor = () => {\n  const [port, setPort] = useState('8443');\n  return (\n    <div className='w-[320px]'>\n      <Attribute>\n        <AttributeLabel>Port</AttributeLabel>\n        <AttributeValue>\n          <InlineEdit\n            value={port}\n            onValueCommit={v => setPort(v as string)}\n            data-testid='number'\n          >\n            <InlineEditPreview>{port}</InlineEditPreview>\n            <InlineEditControl>\n              <InlineEditNumber />\n            </InlineEditControl>\n          </InlineEdit>\n        </AttributeValue>\n      </Attribute>\n    </div>\n  );\n};",
          "storyFile": "InlineEdit/InlineEdit.stories.tsx",
          "storyTitle": "Inputs/InlineEdit",
          "description": "`InlineEditNumber` for a numeric field, with the steppers available while editing and gone\nagain once committed."
        },
        {
          "name": "TextareaEditor",
          "code": "import { useState } from 'react';\nimport { Attribute, AttributeLabel, AttributeValue } from '@wallarm-org/design-system/Attribute';\nimport { InlineEdit, InlineEditControl, InlineEditError, InlineEditPreview, InlineEditTextarea } from '@wallarm-org/design-system/InlineEdit';\n\nexport const TextareaEditor = () => {\n  const [about, setAbout] = useState(\n    'Displays a labeled value for a single object attribute. Used in detail panels, drawers and forms to present structured information.',\n  );\n  return (\n    <div className='w-[320px]'>\n      <Attribute>\n        <AttributeLabel>About</AttributeLabel>\n        <AttributeValue>\n          <InlineEdit\n            value={about}\n            onValueCommit={v => setAbout(v as string)}\n            data-testid='textarea'\n          >\n            <InlineEditPreview lineClamp={3}>{about}</InlineEditPreview>\n            <InlineEditControl>\n              <InlineEditTextarea minRows={2} maxRows={6} />\n            </InlineEditControl>\n            <InlineEditError />\n          </InlineEdit>\n        </AttributeValue>\n      </Attribute>\n    </div>\n  );\n};",
          "storyFile": "InlineEdit/InlineEdit.stories.tsx",
          "storyTitle": "Inputs/InlineEdit",
          "description": "For a value long enough to wrap. `lineClamp` on the preview keeps the row short in read mode\nand lets the editor grow past it."
        },
        {
          "name": "SelectEditor",
          "code": "import { useState } from 'react';\nimport { Attribute, AttributeLabel, AttributeValue } from '@wallarm-org/design-system/Attribute';\nimport { ChevronDown } from '@wallarm-org/design-system/icons';\nimport { InlineEdit, InlineEditControl, InlineEditPreview, InlineEditPreviewIcon, InlineEditPreviewValue, InlineEditSelect } from '@wallarm-org/design-system/InlineEdit';\nimport { SelectButton, SelectContent, SelectPositioner } from '@wallarm-org/design-system/Select';\n\nexport const SelectEditor = () => {\n  const [role, setRole] = useState<string[]>(['editor']);\n  const roleLabel = roleItems.find(i => i.value === (role[0] ?? ''))?.label ?? '';\n  return (\n    <div className='w-[320px]'>\n      <Attribute>\n        <AttributeLabel>Role</AttributeLabel>\n        <AttributeValue>\n          <InlineEdit\n            value={role}\n            onValueCommit={v => setRole(v as string[])}\n            data-testid='select'\n          >\n            <InlineEditPreview>\n              <InlineEditPreviewValue>{roleLabel}</InlineEditPreviewValue>\n              <InlineEditPreviewIcon>\n                <ChevronDown size='md' />\n              </InlineEditPreviewIcon>\n            </InlineEditPreview>\n            <InlineEditControl>\n              <InlineEditSelect items={roleItems}>\n                <SelectButton size='inline-edit' />\n                <SelectPositioner>\n                  <SelectContent>{renderSelectOptions(roleItems)}</SelectContent>\n                </SelectPositioner>\n              </InlineEditSelect>\n            </InlineEditControl>\n          </InlineEdit>\n        </AttributeValue>\n      </Attribute>\n    </div>\n  );\n};",
          "storyFile": "InlineEdit/InlineEdit.stories.tsx",
          "storyTitle": "Inputs/InlineEdit",
          "description": "`InlineEditSelect` for a value from a known set. Its children are ordinary `Select` parts, so\nthe menu behaves exactly as it would standalone."
        },
        {
          "name": "MultiSelectEditor",
          "code": "import { useState } from 'react';\nimport { Attribute, AttributeLabel, AttributeValue } from '@wallarm-org/design-system/Attribute';\nimport { ChevronDown } from '@wallarm-org/design-system/icons';\nimport { InlineEdit, InlineEditControl, InlineEditPreview, InlineEditPreviewIcon, InlineEditPreviewValue, InlineEditSelect } from '@wallarm-org/design-system/InlineEdit';\nimport { SelectButton, SelectContent, SelectPositioner } from '@wallarm-org/design-system/Select';\n\nexport const MultiSelectEditor = () => {\n  const [roles, setRoles] = useState<string[]>(['editor', 'viewer']);\n  const rolesLabel = roles.map(v => roleItems.find(i => i.value === v)?.label ?? v).join(', ');\n  return (\n    <div className='w-[320px]'>\n      <Attribute>\n        <AttributeLabel>Roles</AttributeLabel>\n        <AttributeValue>\n          <InlineEdit\n            value={roles}\n            onValueCommit={v => setRoles(v as string[])}\n            data-testid='multi-select'\n          >\n            <InlineEditPreview>\n              <InlineEditPreviewValue>{rolesLabel}</InlineEditPreviewValue>\n              <InlineEditPreviewIcon>\n                <ChevronDown size='md' />\n              </InlineEditPreviewIcon>\n            </InlineEditPreview>\n            <InlineEditControl>\n              <InlineEditSelect items={roleItems} multiple>\n                <SelectButton size='inline-edit' />\n                <SelectPositioner>\n                  <SelectContent>{renderSelectOptions(roleItems)}</SelectContent>\n                </SelectPositioner>\n              </InlineEditSelect>\n            </InlineEditControl>\n          </InlineEdit>\n        </AttributeValue>\n      </Attribute>\n    </div>\n  );\n};",
          "storyFile": "InlineEdit/InlineEdit.stories.tsx",
          "storyTitle": "Inputs/InlineEdit",
          "description": "The same editor with `multiple`, for a value that is genuinely a list rather than one choice."
        },
        {
          "name": "TagsEditor",
          "code": "import { useState } from 'react';\nimport { Attribute, AttributeLabel, AttributeValue } from '@wallarm-org/design-system/Attribute';\nimport { ChevronDown } from '@wallarm-org/design-system/icons';\nimport { InlineEdit, InlineEditControl, InlineEditPreview, InlineEditPreviewIcon, InlineEditPreviewValue, InlineEditSelect } from '@wallarm-org/design-system/InlineEdit';\nimport { OverflowList } from '@wallarm-org/design-system/OverflowList';\nimport { SelectContent, SelectPositioner } from '@wallarm-org/design-system/Select';\nimport { Tag } from '@wallarm-org/design-system/Tag';\n\nexport const TagsEditor = () => {\n  const [tags, setTags] = useState<string[]>(['production', 'critical']);\n  return (\n    <div className='w-[320px]'>\n      <Attribute>\n        <AttributeLabel>Tags</AttributeLabel>\n        <AttributeValue>\n          <InlineEdit\n            value={tags}\n            onValueCommit={v => setTags(v as string[])}\n            data-testid='tags'\n          >\n            <InlineEditPreview>\n              <InlineEditPreviewValue>\n                <OverflowList\n                  className='gap-4'\n                  items={tags}\n                  itemRenderer={tag => <Tag key={tag}>{tag}</Tag>}\n                />\n              </InlineEditPreviewValue>\n              <InlineEditPreviewIcon>\n                <ChevronDown size='md' />\n              </InlineEditPreviewIcon>\n            </InlineEditPreview>\n            <InlineEditControl>\n              <InlineEditSelect items={tagItems} multiple>\n                <SelectInputTrigger />\n                <SelectPositioner>\n                  <SelectContent>{renderSelectOptions(tagItems)}</SelectContent>\n                </SelectPositioner>\n              </InlineEditSelect>\n            </InlineEditControl>\n          </InlineEdit>\n        </AttributeValue>\n      </Attribute>\n    </div>\n  );\n};",
          "storyFile": "InlineEdit/InlineEdit.stories.tsx",
          "storyTitle": "Inputs/InlineEdit",
          "description": "A multi-select whose committed value reads as `Tag` chips, which suits a list the reader\nscans rather than one they read as a sentence."
        },
        {
          "name": "DateEditor",
          "code": "import { useState } from 'react';\nimport { format } from 'date-fns';\nimport { type DateValue, CalendarDate } from '@wallarm-org/design-system';\nimport { Attribute, AttributeLabel, AttributeValue } from '@wallarm-org/design-system/Attribute';\nimport { CalendarBody, CalendarContent, CalendarGrids, CalendarTrigger } from '@wallarm-org/design-system/Calendar';\nimport { DateFormatProvider } from '@wallarm-org/design-system/DateFormatProvider';\nimport { Calendar } from '@wallarm-org/design-system/icons';\nimport { InlineEdit, InlineEditControl, InlineEditDate, InlineEditPreview, InlineEditPreviewIcon, InlineEditPreviewValue } from '@wallarm-org/design-system/InlineEdit';\n\nexport const DateEditor = () => {\n  const [date, setDate] = useState<DateValue | null>(new CalendarDate(2026, 6, 15));\n  const dateLabel = date\n    ? format(new Date(date.year, date.month - 1, date.day), 'd MMM, yyyy')\n    : '—';\n  return (\n    <div className='w-[320px]'>\n      <DateFormatProvider order='day-first' hourCycle={24}>\n        <Attribute>\n          <AttributeLabel>Date</AttributeLabel>\n          <AttributeValue>\n            <InlineEdit\n              value={date}\n              onValueCommit={v => setDate(v as DateValue | null)}\n              data-testid='date'\n            >\n              <InlineEditPreview>\n                <InlineEditPreviewValue>{dateLabel}</InlineEditPreviewValue>\n                <InlineEditPreviewIcon>\n                  <Calendar size='md' />\n                </InlineEditPreviewIcon>\n              </InlineEditPreview>\n              <InlineEditControl>\n                <InlineEditDate>\n                  <CalendarTrigger>\n                    <DateInputTrigger granularity='day' />\n                  </CalendarTrigger>\n                  <CalendarContent>\n                    <CalendarBody>\n                      <CalendarGrids />\n                    </CalendarBody>\n                  </CalendarContent>\n                </InlineEditDate>\n              </InlineEditControl>\n            </InlineEdit>\n          </AttributeValue>\n        </Attribute>\n      </DateFormatProvider>\n    </div>\n  );\n};",
          "storyFile": "InlineEdit/InlineEdit.stories.tsx",
          "storyTitle": "Inputs/InlineEdit",
          "description": "`InlineEditDate` hosts a `Calendar`, so the editor is a popover rather than a field — the row\nstays the same height while it is open."
        },
        {
          "name": "TimeEditor",
          "code": "import { useState } from 'react';\nimport { type TimeValue } from '@react-aria/datepicker';\nimport { format } from 'date-fns';\nimport { Time } from '@wallarm-org/design-system';\nimport { Attribute, AttributeLabel, AttributeValue } from '@wallarm-org/design-system/Attribute';\nimport { DateFormatProvider } from '@wallarm-org/design-system/DateFormatProvider';\nimport { Clock } from '@wallarm-org/design-system/icons';\nimport { InlineEdit, InlineEditControl, InlineEditPreview, InlineEditPreviewIcon, InlineEditPreviewValue, InlineEditTime } from '@wallarm-org/design-system/InlineEdit';\n\nexport const TimeEditor = () => {\n  const [time, setTime] = useState<TimeValue | null>(new Time(14, 30));\n  const timeLabel = time ? format(new Date(2000, 0, 1, time.hour, time.minute), 'h:mm a') : '—';\n  return (\n    <div className='w-[320px]'>\n      <DateFormatProvider order='day-first' hourCycle={12}>\n        <Attribute>\n          <AttributeLabel>Time</AttributeLabel>\n          <AttributeValue>\n            <InlineEdit\n              value={time}\n              onValueCommit={v => setTime(v as TimeValue | null)}\n              data-testid='time'\n            >\n              <InlineEditPreview>\n                <InlineEditPreviewValue>{timeLabel}</InlineEditPreviewValue>\n                <InlineEditPreviewIcon>\n                  <Clock size='md' />\n                </InlineEditPreviewIcon>\n              </InlineEditPreview>\n              <InlineEditControl>\n                <InlineEditTime />\n              </InlineEditControl>\n            </InlineEdit>\n          </AttributeValue>\n        </Attribute>\n      </DateFormatProvider>\n    </div>\n  );\n};",
          "storyFile": "InlineEdit/InlineEdit.stories.tsx",
          "storyTitle": "Inputs/InlineEdit",
          "description": "`InlineEditTime` for a time of day, taking the same value objects as `TimeInput`."
        },
        {
          "name": "DateTimeEditor",
          "code": "import { useState } from 'react';\nimport { format } from 'date-fns';\nimport { CalendarDateTime, Time } from '@wallarm-org/design-system';\nimport { Attribute, AttributeLabel, AttributeValue } from '@wallarm-org/design-system/Attribute';\nimport { CalendarBody, CalendarContent, CalendarGrids, CalendarInputHeader, CalendarTrigger } from '@wallarm-org/design-system/Calendar';\nimport { DateFormatProvider } from '@wallarm-org/design-system/DateFormatProvider';\nimport { Calendar } from '@wallarm-org/design-system/icons';\nimport { InlineEdit, InlineEditControl, InlineEditDateTime, InlineEditPreview, InlineEditPreviewIcon, InlineEditPreviewValue } from '@wallarm-org/design-system/InlineEdit';\n\nexport const DateTimeEditor = () => {\n  const [dateTime, setDateTime] = useState<CalendarDateTime | null>(\n    new CalendarDateTime(2026, 6, 15, 14, 30),\n  );\n  const dateTimeLabel = dateTime\n    ? format(\n        new Date(dateTime.year, dateTime.month - 1, dateTime.day, dateTime.hour, dateTime.minute),\n        'd MMM, yyyy h:mm a',\n      )\n    : '—';\n  return (\n    <div className='w-[320px]'>\n      <DateFormatProvider order='day-first' hourCycle={12}>\n        <Attribute>\n          <AttributeLabel>Date &amp; Time</AttributeLabel>\n          <AttributeValue>\n            <InlineEdit\n              value={dateTime}\n              onValueCommit={v => setDateTime(v as CalendarDateTime | null)}\n              data-testid='datetime'\n            >\n              <InlineEditPreview>\n                <InlineEditPreviewValue>{dateTimeLabel}</InlineEditPreviewValue>\n                <InlineEditPreviewIcon>\n                  <Calendar size='md' />\n                </InlineEditPreviewIcon>\n              </InlineEditPreview>\n              <InlineEditControl>\n                <InlineEditDateTime>\n                  <CalendarTrigger>\n                    <DateInputTrigger granularity='minute' />\n                  </CalendarTrigger>\n                  <CalendarContent>\n                    <CalendarBody>\n                      <CalendarInputHeader />\n                      <CalendarGrids />\n                    </CalendarBody>\n                  </CalendarContent>\n                </InlineEditDateTime>\n              </InlineEditControl>\n            </InlineEdit>\n          </AttributeValue>\n        </Attribute>\n      </DateFormatProvider>\n    </div>\n  );\n};",
          "storyFile": "InlineEdit/InlineEdit.stories.tsx",
          "storyTitle": "Inputs/InlineEdit",
          "description": "Date and time in one editor, for a value where the pair only makes sense together."
        },
        {
          "name": "HorizontalLayout",
          "code": "import { useState } from 'react';\nimport { Attribute, AttributeLabel, AttributeValue } from '@wallarm-org/design-system/Attribute';\nimport { ChevronDown } from '@wallarm-org/design-system/icons';\nimport { InlineEdit, InlineEditControl, InlineEditError, InlineEditInput, InlineEditPreview, InlineEditPreviewIcon, InlineEditPreviewValue, InlineEditSelect } from '@wallarm-org/design-system/InlineEdit';\nimport { SelectButton, SelectContent, SelectPositioner } from '@wallarm-org/design-system/Select';\n\nexport const HorizontalLayout = () => {\n  const [name, setName] = useState('Checkout API');\n  const [role, setRole] = useState<string[]>(['editor']);\n  const roleLabel = roleItems.find(i => i.value === (role[0] ?? ''))?.label ?? '';\n  return (\n    <div className='flex w-[420px] flex-col gap-8'>\n      <Attribute orientation='horizontal'>\n        <AttributeLabel>Name</AttributeLabel>\n        <AttributeValue>\n          <InlineEdit\n            value={name}\n            onValueCommit={v => setName(v as string)}\n            data-testid='horizontal-text'\n          >\n            <InlineEditPreview>{name}</InlineEditPreview>\n            <InlineEditControl>\n              <InlineEditInput aria-label='Name' />\n            </InlineEditControl>\n            <InlineEditError />\n          </InlineEdit>\n        </AttributeValue>\n      </Attribute>\n\n      <Attribute orientation='horizontal'>\n        <AttributeLabel>Role</AttributeLabel>\n        <AttributeValue>\n          <InlineEdit\n            value={role}\n            onValueCommit={v => setRole(v as string[])}\n            data-testid='horizontal-select'\n          >\n            <InlineEditPreview>\n              <InlineEditPreviewValue>{roleLabel}</InlineEditPreviewValue>\n              <InlineEditPreviewIcon>\n                <ChevronDown size='md' />\n              </InlineEditPreviewIcon>\n            </InlineEditPreview>\n            <InlineEditControl>\n              <InlineEditSelect items={roleItems}>\n                <SelectButton size='inline-edit' />\n                <SelectPositioner>\n                  <SelectContent>{renderSelectOptions(roleItems)}</SelectContent>\n                </SelectPositioner>\n              </InlineEditSelect>\n            </InlineEditControl>\n          </InlineEdit>\n        </AttributeValue>\n      </Attribute>\n    </div>\n  );\n};",
          "storyFile": "InlineEdit/InlineEdit.stories.tsx",
          "storyTitle": "Inputs/InlineEdit",
          "description": "`InlineEdit` inside a horizontal `Attribute` — label on the left, value/editor on the right.\nThe orientation belongs to `Attribute`, not here: `InlineEdit` has no orientation prop and\nbehaves identically either way."
        },
        {
          "name": "States",
          "code": "import { Attribute, AttributeLabel, AttributeValue } from '@wallarm-org/design-system/Attribute';\nimport { InlineEdit, InlineEditControl, InlineEditError, InlineEditInput, InlineEditPreview } from '@wallarm-org/design-system/InlineEdit';\n\nexport const States = () => (\n  <div className='flex w-[420px] flex-col gap-12'>\n    <Attribute>\n      <AttributeLabel>Name</AttributeLabel>\n      <AttributeValue>\n        <InlineEdit\n          defaultValue='Checkout API and ABC'\n          status='loading'\n          data-testid='loading'\n        >\n          <InlineEditPreview>Checkout API and ABC</InlineEditPreview>\n          <InlineEditControl>\n            <InlineEditInput />\n          </InlineEditControl>\n        </InlineEdit>\n      </AttributeValue>\n    </Attribute>\n\n    <Attribute>\n      <AttributeLabel>Name</AttributeLabel>\n      <AttributeValue>\n        <InlineEdit\n          defaultValue='Checkout API and ABC'\n          status='saved'\n          data-testid='saved'\n        >\n          <InlineEditPreview>Checkout API and ABC</InlineEditPreview>\n          <InlineEditControl>\n            <InlineEditInput />\n          </InlineEditControl>\n        </InlineEdit>\n      </AttributeValue>\n    </Attribute>\n\n    <Attribute>\n      <AttributeLabel>Name</AttributeLabel>\n      <AttributeValue>\n        <InlineEdit\n          defaultValue='Checkout API and ABC'\n          defaultEdit\n          status='error'\n          data-testid='error'\n        >\n          <InlineEditPreview>Checkout API and ABC</InlineEditPreview>\n          <InlineEditControl>\n            <InlineEditInput />\n          </InlineEditControl>\n          <InlineEditError>An error message.</InlineEditError>\n        </InlineEdit>\n      </AttributeValue>\n    </Attribute>\n  </div>\n);",
          "storyFile": "InlineEdit/InlineEdit.stories.tsx",
          "storyTitle": "Inputs/InlineEdit",
          "description": "The three async states side by side. `saved` is transient and clears itself after\n`savedDuration`, so it is pinned here to be looked at."
        },
        {
          "name": "Async",
          "code": "import { useState } from 'react';\nimport { Attribute, AttributeLabel, AttributeValue } from '@wallarm-org/design-system/Attribute';\nimport { InlineEdit, InlineEditControl, InlineEditError, InlineEditInput, InlineEditPreview } from '@wallarm-org/design-system/InlineEdit';\n\nexport const Async = () => {\n  const [value, setValue] = useState('Checkout API');\n  const save = (v: unknown) =>\n    new Promise<void>((resolve, reject) => {\n      setTimeout(() => {\n        if ((v as string).trim().length === 0) reject(new Error('Name is required.'));\n        else {\n          setValue(v as string);\n          resolve();\n        }\n      }, 1200);\n    });\n  return (\n    <div className='w-[320px]'>\n      <Attribute>\n        <AttributeLabel>Name</AttributeLabel>\n        <AttributeValue>\n          <InlineEdit value={value} onValueCommit={save} data-testid='attr'>\n            <InlineEditPreview>{value}</InlineEditPreview>\n            <InlineEditControl>\n              <InlineEditInput />\n            </InlineEditControl>\n            <InlineEditError />\n          </InlineEdit>\n        </AttributeValue>\n      </Attribute>\n    </div>\n  );\n};",
          "storyFile": "InlineEdit/InlineEdit.stories.tsx",
          "storyTitle": "Inputs/InlineEdit",
          "description": "A commit that returns a promise. The field stays in edit mode until it resolves, and a\nrejection keeps the reader's text rather than discarding it."
        },
        {
          "name": "NonEditable",
          "code": "import { Attribute, AttributeLabel, AttributeValue } from '@wallarm-org/design-system/Attribute';\nimport { InlineEdit, InlineEditControl, InlineEditInput, InlineEditPreview } from '@wallarm-org/design-system/InlineEdit';\n\nexport const NonEditable = () => (\n  <div className='flex w-[320px] flex-col gap-8'>\n    <Attribute>\n      <AttributeLabel>Read only</AttributeLabel>\n      <AttributeValue>\n        <InlineEdit defaultValue='Locked value' readOnly data-testid='readonly'>\n          <InlineEditPreview>Locked value</InlineEditPreview>\n          <InlineEditControl>\n            <InlineEditInput />\n          </InlineEditControl>\n        </InlineEdit>\n      </AttributeValue>\n    </Attribute>\n    <Attribute>\n      <AttributeLabel>Disabled</AttributeLabel>\n      <AttributeValue>\n        <InlineEdit defaultValue='Disabled value' disabled data-testid='disabled'>\n          <InlineEditPreview>Disabled value</InlineEditPreview>\n          <InlineEditControl>\n            <InlineEditInput />\n          </InlineEditControl>\n        </InlineEdit>\n      </AttributeValue>\n    </Attribute>\n  </div>\n);",
          "storyFile": "InlineEdit/InlineEdit.stories.tsx",
          "storyTitle": "Inputs/InlineEdit",
          "description": "`readOnly` and `disabled` are different answers: read-only shows the value plainly with no\naffordance, disabled says there is a control here that you cannot use."
        },
        {
          "name": "ConfirmCommit",
          "code": "import { useRef, useState } from 'react';\nimport { Attribute, AttributeLabel, AttributeValue } from '@wallarm-org/design-system/Attribute';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Dialog, DialogBody, DialogContent, DialogFooter, DialogFooterControls, DialogHeader, DialogTitle } from '@wallarm-org/design-system/Dialog';\nimport { ChevronDown } from '@wallarm-org/design-system/icons';\nimport { InlineEdit, InlineEditControl, InlineEditInput, InlineEditPreview, InlineEditPreviewIcon, InlineEditPreviewValue, InlineEditSelect } from '@wallarm-org/design-system/InlineEdit';\nimport { SelectContent, SelectPositioner } from '@wallarm-org/design-system/Select';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const ConfirmCommit = () => {\n  const [email, setEmail] = useState('dev@wallarm.com');\n  const [role, setRole] = useState<string[]>(['editor']);\n  const [pending, setPending] = useState<string | null>(null);\n  const resolverRef = useRef<((ok: boolean) => void) | null>(null);\n\n  // Promise-based confirm: the guard returns this promise and the dialog\n  // buttons settle it. The DS never closes the dialog — `settle` does.\n  const confirmChange = (message: string) =>\n    new Promise<boolean>(resolve => {\n      resolverRef.current = resolve;\n      setPending(message);\n    });\n\n  const settle = (ok: boolean) => {\n    resolverRef.current?.(ok);\n    resolverRef.current = null;\n    setPending(null);\n  };\n\n  const roleLabel = roleItems.find(i => i.value === (role[0] ?? ''))?.label ?? '';\n\n  return (\n    <div className='flex w-[320px] flex-col gap-8'>\n      <Attribute>\n        <AttributeLabel>Email</AttributeLabel>\n        <AttributeValue>\n          <InlineEdit\n            value={email}\n            onBeforeValueCommit={(next, prev) =>\n              next === prev || confirmChange(`Change email to ${next as string}?`)\n            }\n            onValueCommit={v => setEmail(v as string)}\n            data-testid='confirm-email'\n          >\n            <InlineEditPreview>{email}</InlineEditPreview>\n            <InlineEditControl>\n              <InlineEditInput type='email' aria-label='Email' />\n            </InlineEditControl>\n          </InlineEdit>\n        </AttributeValue>\n      </Attribute>\n\n      <Attribute>\n        <AttributeLabel>Role</AttributeLabel>\n        <AttributeValue>\n          <InlineEdit\n            value={role}\n            onBeforeValueCommit={(next, prev) => {\n              // The guard fires on every popover close, including no-op ones —\n              // short-circuit when nothing changed (for dates use `.compare()`).\n              const nextRole = (next as string[]).join();\n              if (nextRole === (prev as string[]).join()) return true;\n              const label =\n                roleItems.find(i => i.value === (next as string[])[0])?.label ?? nextRole;\n              return confirmChange(`Change role to ${label}?`);\n            }}\n            onValueCommit={v => setRole(v as string[])}\n            data-testid='confirm-role'\n          >\n            <InlineEditPreview>\n              <InlineEditPreviewValue>{roleLabel}</InlineEditPreviewValue>\n              <InlineEditPreviewIcon>\n                <ChevronDown size='md' />\n              </InlineEditPreviewIcon>\n            </InlineEditPreview>\n            <InlineEditControl>\n              <InlineEditSelect items={roleItems}>\n                <SelectButtonTrigger />\n                <SelectPositioner>\n                  <SelectContent>{renderSelectOptions(roleItems)}</SelectContent>\n                </SelectPositioner>\n              </InlineEditSelect>\n            </InlineEditControl>\n          </InlineEdit>\n        </AttributeValue>\n      </Attribute>\n\n      <Dialog\n        open={pending !== null}\n        onOpenChange={open => {\n          if (!open) settle(false);\n        }}\n        data-testid='confirm-dialog'\n      >\n        <DialogContent>\n          <DialogHeader>\n            <DialogTitle>Confirm change</DialogTitle>\n          </DialogHeader>\n          <DialogBody>\n            <Text>{pending}</Text>\n          </DialogBody>\n          <DialogFooter>\n            <DialogFooterControls>\n              <Button\n                variant='ghost'\n                color='neutral'\n                size='large'\n                onClick={() => settle(false)}\n                data-testid='confirm-decline'\n              >\n                Cancel\n              </Button>\n              <Button\n                variant='primary'\n                color='brand'\n                size='large'\n                onClick={() => settle(true)}\n                data-testid='confirm-accept'\n              >\n                Change\n              </Button>\n            </DialogFooterControls>\n          </DialogFooter>\n        </DialogContent>\n      </Dialog>\n    </div>\n  );\n};",
          "storyFile": "InlineEdit/InlineEdit.stories.tsx",
          "storyTitle": "Inputs/InlineEdit",
          "description": "`onBeforeValueCommit` intercepts the commit — return `false`, or a promise of it, to hold\nthe field open. Use it where the change is consequential enough to confirm, not for validation,\nand short-circuit unchanged values: the guard fires on every commit path, no-op submits included."
        }
      ]
    },
    {
      "name": "Input",
      "description": "Short, single-line free text — reach for `Textarea` when the answer runs to sentences, and `Select` when it comes from a known set. Wrap it in `Field` for the label and description; a placeholder is an example of the answer, never a substitute for the label and never where required information lives.",
      "importPath": "@wallarm-org/design-system/Input",
      "props": [
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "pattern",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, HTMLInputElement> | undefined",
          "required": false
        },
        {
          "name": "type",
          "type": "HTMLInputTypeAttribute | undefined",
          "required": false
        },
        {
          "name": "disabled",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "name",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "value",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "alt",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "height",
          "type": "string | number | undefined",
          "required": false
        },
        {
          "name": "src",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "width",
          "type": "string | number | undefined",
          "required": false
        },
        {
          "name": "autoComplete",
          "type": "HTMLInputAutoCompleteAttribute | undefined",
          "required": false
        },
        {
          "name": "maxLength",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "minLength",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "placeholder",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "readOnly",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "required",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "checked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "step",
          "type": "string | number | undefined",
          "required": false
        },
        {
          "name": "accept",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "max",
          "type": "string | number | undefined",
          "required": false
        },
        {
          "name": "min",
          "type": "string | number | undefined",
          "required": false
        },
        {
          "name": "multiple",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "size",
          "type": "{ default: string; medium: string; small: string; 'inline-edit': string; }",
          "required": false,
          "defaultValue": "default"
        },
        {
          "name": "error",
          "type": "{ true: string; false: string; }",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "error",
          "options": [
            "true",
            "false"
          ]
        },
        {
          "name": "size",
          "options": [
            "default",
            "medium",
            "small",
            "inline-edit"
          ],
          "defaultValue": "default"
        }
      ],
      "subComponents": [],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Input } from '@wallarm-org/design-system/Input';\n\n<Input />",
          "storyFile": "Input/Input.stories.tsx",
          "storyTitle": "Inputs/Input",
          "description": "The bare control. Dropped inside a `Field` it reads that context and wires up its own\nlabel, description and error state — you don't pass them."
        },
        {
          "name": "Sizes",
          "code": "import { Input } from '@wallarm-org/design-system/Input';\nimport { HStack } from '@wallarm-org/design-system/Stack';\n\nexport const Sizes = () => (\n  <HStack gap={16} align='start'>\n    <Input size='default' />\n    <Input size='medium' />\n    <Input size='small' />\n  </HStack>\n);",
          "storyFile": "Input/Input.stories.tsx",
          "storyTitle": "Inputs/Input",
          "description": "A 36 / 32 / 24px scale shared with `Textarea`, `InputGroup` and the date inputs, so a row\nof mixed fields lines up. Reach below `default` only in dense places like a table filter."
        },
        {
          "name": "Focused",
          "code": "import { Input } from '@wallarm-org/design-system/Input';\n\n<Input />",
          "storyFile": "Input/Input.stories.tsx",
          "storyTitle": "Inputs/Input",
          "description": "Focus is a ring outside the border rather than a border change, so nothing reflows by a\npixel when the reader tabs through a form."
        },
        {
          "name": "Disabled",
          "code": "import { Input } from '@wallarm-org/design-system/Input';\n\n<Input disabled />",
          "storyFile": "Input/Input.stories.tsx",
          "storyTitle": "Inputs/Input",
          "description": "Dimmed and not focusable. Say elsewhere what would enable it — a disabled field with no\nexplanation reads as broken."
        },
        {
          "name": "WithValue",
          "code": "import { Input } from '@wallarm-org/design-system/Input';\n\n<Input value=\"Some value...\" />",
          "storyFile": "Input/Input.stories.tsx",
          "storyTitle": "Inputs/Input",
          "description": "A filled field. Placeholder text is deliberately set at the same size as real input so the\ntext doesn't jump when typing starts; only its colour is lighter."
        },
        {
          "name": "WithError",
          "code": "import { Input } from '@wallarm-org/design-system/Input';\n\n<Input error />",
          "storyFile": "Input/Input.stories.tsx",
          "storyTitle": "Inputs/Input",
          "description": "`error` reddens the border and sets `aria-invalid`. It shows that something is wrong but\nnot what — the message is `FieldError`'s job."
        }
      ]
    },
    {
      "name": "InputGroup",
      "description": "Joins a field to whatever sits against it — an icon, a unit, a shortcut hint, a button — inside one bordered box that focuses as a single control. Reach for `Field` instead when what you need is a label and a description rather than something attached to the field itself.",
      "importPath": "@wallarm-org/design-system/InputGroup",
      "props": [
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "size",
          "type": "{ default: string; medium: string; small: string; 'inline-edit': string; }",
          "required": false,
          "defaultValue": "default"
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "size",
          "options": [
            "default",
            "medium",
            "small",
            "inline-edit"
          ],
          "defaultValue": "default"
        }
      ],
      "subComponents": [],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Info, Search } from '@wallarm-org/design-system/icons';\nimport { Input } from '@wallarm-org/design-system/Input';\nimport { InputGroup, InputGroupAddon, InputGroupText } from '@wallarm-org/design-system/InputGroup';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Basic = () => (\n  <VStack gap={12}>\n    <InputGroup data-testid='input-group'>\n      <InputGroupAddon>\n        <Search />\n      </InputGroupAddon>\n      <Input placeholder='Enter' data-testid='input-group-input' />\n      <InputGroupAddon align='inline-end'>\n        <Info />\n      </InputGroupAddon>\n    </InputGroup>\n\n    <InputGroup>\n      <InputGroupAddon variant='outline'>\n        <InputGroupText>https://</InputGroupText>\n      </InputGroupAddon>\n      <Input placeholder='Enter' value='wallarm/user-settings' />\n      <InputGroupAddon variant='outline' align='inline-end'>\n        <InputGroupText>.com</InputGroupText>\n      </InputGroupAddon>\n    </InputGroup>\n  </VStack>\n);",
          "storyFile": "InputGroup/InputGroup.stories.tsx",
          "storyTitle": "Inputs/InputGroup",
          "description": "`InputGroupAddon` on either side of the control. The group draws the border, so the input\ninside it draws none — which is why an `Input` used here looks different from one used alone."
        },
        {
          "name": "Disabled",
          "code": "import { Info, Search } from '@wallarm-org/design-system/icons';\nimport { Input } from '@wallarm-org/design-system/Input';\nimport { InputGroup, InputGroupAddon, InputGroupText } from '@wallarm-org/design-system/InputGroup';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Disabled = () => (\n  <VStack gap={12}>\n    <InputGroup>\n      <InputGroupAddon>\n        <Search />\n      </InputGroupAddon>\n      <Input placeholder='Enter' disabled />\n      <InputGroupAddon align='inline-end'>\n        <Info />\n      </InputGroupAddon>\n    </InputGroup>\n\n    <InputGroup>\n      <InputGroupAddon>\n        <InputGroupText>https://</InputGroupText>\n      </InputGroupAddon>\n      <Input placeholder='Enter' value='wallarm/user-settings' disabled />\n      <InputGroupAddon align='inline-end'>\n        <InputGroupText>.com</InputGroupText>\n      </InputGroupAddon>\n    </InputGroup>\n  </VStack>\n);",
          "storyFile": "InputGroup/InputGroup.stories.tsx",
          "storyTitle": "Inputs/InputGroup",
          "description": "Disabling the control dims the whole group, addons included, so the box reads as one\nunavailable thing rather than a live button next to a dead field."
        },
        {
          "name": "WithError",
          "code": "import { Info, Search } from '@wallarm-org/design-system/icons';\nimport { Input } from '@wallarm-org/design-system/Input';\nimport { InputGroup, InputGroupAddon, InputGroupText } from '@wallarm-org/design-system/InputGroup';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const WithError = () => (\n  <VStack gap={12}>\n    <InputGroup>\n      <InputGroupAddon>\n        <Search />\n      </InputGroupAddon>\n      <Input placeholder='Enter' error />\n      <InputGroupAddon align='inline-end'>\n        <Info />\n      </InputGroupAddon>\n    </InputGroup>\n\n    <InputGroup>\n      <InputGroupAddon>\n        <InputGroupText>https://</InputGroupText>\n      </InputGroupAddon>\n      <Input placeholder='Enter' value='wallarm/user-settings' error />\n      <InputGroupAddon align='inline-end'>\n        <InputGroupText>.com</InputGroupText>\n      </InputGroupAddon>\n    </InputGroup>\n  </VStack>\n);",
          "storyFile": "InputGroup/InputGroup.stories.tsx",
          "storyTitle": "Inputs/InputGroup",
          "description": "The error border is drawn by the group for the same reason, keeping the red outline around\neverything the reader thinks of as the field."
        },
        {
          "name": "WithLoader",
          "code": "import { Input } from '@wallarm-org/design-system/Input';\nimport { InputGroup, InputGroupAddon } from '@wallarm-org/design-system/InputGroup';\nimport { Loader } from '@wallarm-org/design-system/Loader';\n\nexport const WithLoader = () => (\n  <InputGroup>\n    <Input placeholder='Searching...' disabled />\n    <InputGroupAddon align='inline-end'>\n      <Loader size='md' />\n    </InputGroupAddon>\n  </InputGroup>\n);",
          "storyFile": "InputGroup/InputGroup.stories.tsx",
          "storyTitle": "Inputs/InputGroup",
          "description": "A `Loader` as a trailing addon, for a field that validates or searches as you type. It\nreplaces nothing, so the text doesn't shift when it appears."
        },
        {
          "name": "WithKbd",
          "code": "import { Search } from '@wallarm-org/design-system/icons';\nimport { Input } from '@wallarm-org/design-system/Input';\nimport { InputGroup, InputGroupAddon } from '@wallarm-org/design-system/InputGroup';\nimport { Kbd } from '@wallarm-org/design-system/Kbd';\n\nexport const WithKbd = () => (\n  <InputGroup>\n    <InputGroupAddon>\n      <Search />\n    </InputGroupAddon>\n    <Input placeholder='Search' />\n    <InputGroupAddon align='inline-end'>\n      <Kbd>⌘</Kbd>\n      <Kbd>K</Kbd>\n    </InputGroupAddon>\n  </InputGroup>\n);",
          "storyFile": "InputGroup/InputGroup.stories.tsx",
          "storyTitle": "Inputs/InputGroup",
          "description": "A `Kbd` addon showing the shortcut that focuses the field — the search-box convention.\nOnly worth it where the shortcut actually exists."
        },
        {
          "name": "WithTooltip",
          "code": "import { Info, Search } from '@wallarm-org/design-system/icons';\nimport { Input } from '@wallarm-org/design-system/Input';\nimport { InputGroup, InputGroupAddon } from '@wallarm-org/design-system/InputGroup';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@wallarm-org/design-system/Tooltip';\n\nexport const WithTooltip = () => (\n  <InputGroup>\n    <InputGroupAddon>\n      <Search />\n    </InputGroupAddon>\n    <Input placeholder='Enter' />\n    <InputGroupAddon align='inline-end'>\n      <Tooltip>\n        <TooltipTrigger asChild>\n          <Info />\n        </TooltipTrigger>\n        <TooltipContent>Get more info</TooltipContent>\n      </Tooltip>\n    </InputGroupAddon>\n  </InputGroup>\n);",
          "storyFile": "InputGroup/InputGroup.stories.tsx",
          "storyTitle": "Inputs/InputGroup",
          "description": "An addon that explains the field, for when the reason is longer than a description line but\nshorter than help text."
        },
        {
          "name": "WithTextarea",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { ArrowUp, Settings2 } from '@wallarm-org/design-system/icons';\nimport { InputGroup, InputGroupAddon } from '@wallarm-org/design-system/InputGroup';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\nimport { Textarea } from '@wallarm-org/design-system/Textarea';\n\nexport const WithTextarea = () => (\n  <div style={{ width: 480 }}>\n    <VStack gap={12}>\n      <InputGroup>\n        <Textarea minRows={1} maxRows={5} placeholder='Type a message...' />\n      </InputGroup>\n\n      <InputGroup>\n        <Textarea minRows={1} maxRows={5} placeholder='Type a message...' />\n        <InputGroupAddon align='block-end'>\n          <HStack fullWidth align='center' justify='end'>\n            <Button variant='primary' color='brand' size='small'>\n              <ArrowUp />\n            </Button>\n          </HStack>\n        </InputGroupAddon>\n      </InputGroup>\n\n      <InputGroup>\n        <Textarea minRows={1} maxRows={5} placeholder='Type a message...' />\n        <InputGroupAddon align='block-end'>\n          <HStack fullWidth align='center' justify='between'>\n            <Button variant='secondary' size='small' color='neutral'>\n              <Settings2 />\n            </Button>\n            <Button variant='primary' color='brand' size='small'>\n              <ArrowUp />\n            </Button>\n          </HStack>\n        </InputGroupAddon>\n      </InputGroup>\n    </VStack>\n  </div>\n);",
          "storyFile": "InputGroup/InputGroup.stories.tsx",
          "storyTitle": "Inputs/InputGroup",
          "description": "The group also wraps a `Textarea`, with `align='block-end'` putting the addon under the\ntext rather than beside it — this is the composer shape."
        },
        {
          "name": "WithSelect",
          "code": "import { createListCollection } from '@ark-ui/react/collection';\nimport { LayoutGrid, LayoutTemplate, Search } from '@wallarm-org/design-system/icons';\nimport { Input } from '@wallarm-org/design-system/Input';\nimport { InputGroup, InputGroupAddon } from '@wallarm-org/design-system/InputGroup';\nimport { Select, SelectButton, SelectContent, SelectOption, SelectOptionIndicator, SelectOptionText, SelectPositioner } from '@wallarm-org/design-system/Select';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const WithSelect = () => {\n  const collection = createListCollection({\n    items: [\n      {\n        label: 'React',\n        value: 'react',\n        icon: LayoutGrid,\n        category: 'Frontend',\n      },\n      {\n        label: 'Vue',\n        value: 'vue',\n        icon: LayoutTemplate,\n        category: 'Frontend',\n      },\n      {\n        label: 'Angular',\n        value: 'angular',\n        icon: Search,\n        category: 'Frontend',\n      },\n    ],\n  });\n\n  return (\n    <VStack gap={12}>\n      <InputGroup>\n        <InputGroupAddon variant='outline'>\n          <Select collection={collection}>\n            <SelectButton />\n\n            <SelectPositioner>\n              <SelectContent>\n                {collection.items.map(skill => (\n                  <SelectOption key={skill.value} item={skill}>\n                    <SelectOptionText>{skill.label}</SelectOptionText>\n                    <SelectOptionIndicator />\n                  </SelectOption>\n                ))}\n              </SelectContent>\n            </SelectPositioner>\n          </Select>\n        </InputGroupAddon>\n\n        <Input placeholder='Enter' />\n      </InputGroup>\n\n      <InputGroup>\n        <Input placeholder='Enter' />\n        <InputGroupAddon align='inline-end' variant='outline'>\n          <Select collection={collection}>\n            <SelectButton />\n\n            <SelectPositioner>\n              <SelectContent>\n                {collection.items.map(skill => (\n                  <SelectOption key={skill.value} item={skill}>\n                    <SelectOptionText>{skill.label}</SelectOptionText>\n                    <SelectOptionIndicator />\n                  </SelectOption>\n                ))}\n              </SelectContent>\n            </SelectPositioner>\n          </Select>\n        </InputGroupAddon>\n      </InputGroup>\n\n      <InputGroup>\n        <InputGroupAddon>\n          <Select collection={collection}>\n            <SelectButton />\n\n            <SelectPositioner>\n              <SelectContent>\n                {collection.items.map(skill => (\n                  <SelectOption key={skill.value} item={skill}>\n                    <SelectOptionText>{skill.label}</SelectOptionText>\n                    <SelectOptionIndicator />\n                  </SelectOption>\n                ))}\n              </SelectContent>\n            </SelectPositioner>\n          </Select>\n        </InputGroupAddon>\n\n        <Input placeholder='Enter' />\n      </InputGroup>\n\n      <InputGroup>\n        <Input placeholder='Enter' />\n        <InputGroupAddon align='inline-end'>\n          <Select collection={collection}>\n            <SelectButton />\n\n            <SelectPositioner>\n              <SelectContent>\n                {collection.items.map(skill => (\n                  <SelectOption key={skill.value} item={skill}>\n                    <SelectOptionText>{skill.label}</SelectOptionText>\n                    <SelectOptionIndicator />\n                  </SelectOption>\n                ))}\n              </SelectContent>\n            </SelectPositioner>\n          </Select>\n        </InputGroupAddon>\n      </InputGroup>\n    </VStack>\n  );\n};",
          "storyFile": "InputGroup/InputGroup.stories.tsx",
          "storyTitle": "Inputs/InputGroup",
          "description": "A `Select` as an addon, for a unit or scope that changes what the value means. Keep it on\nthe side the reader reads last."
        }
      ]
    },
    {
      "name": "InputOTP",
      "description": "A short code split into one cell per character, for codes that arrive by mail or from an authenticator — reach for `Input` for anything the reader knows by heart. Six cells by default, and `groupSize` inserts separators so the reader can check what they typed against what they were sent.",
      "importPath": "@wallarm-org/design-system/InputOTP",
      "props": [],
      "variants": [],
      "subComponents": [
        {
          "name": "OTPInput",
          "props": [
            {
              "name": "groupSize",
              "type": "number | undefined",
              "required": false,
              "description": "Number of inputs per group (separator shown between groups). Set to 0 to disable grouping.",
              "defaultValue": "2"
            },
            {
              "name": "separator",
              "type": "ReactNode",
              "required": false,
              "description": "Separator element rendered between groups",
              "defaultValue": "\\u2014"
            },
            {
              "name": "error",
              "type": "boolean | undefined",
              "required": false,
              "description": "Error state (maps to Ark UI `invalid`)",
              "defaultValue": "false"
            },
            {
              "name": "form",
              "type": "string | undefined",
              "required": false,
              "description": "The associate form of the underlying input element."
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "mask",
              "type": "boolean | undefined",
              "required": false,
              "description": "If `true`, the input's value will be masked just like `type=password`"
            },
            {
              "name": "pattern",
              "type": "string | undefined",
              "required": false,
              "description": "The regular expression that the user-entered input value is checked against."
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string[] | undefined",
              "required": false,
              "description": "The initial value of the the pin input when rendered.\nUse when you don't need to control the value of the pin input."
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false,
              "description": "Whether to auto-focus the first input."
            },
            {
              "name": "id",
              "type": "string",
              "required": false,
              "description": "The unique identifier of the machine."
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"numeric\" | \"alphanumeric\" | \"alphabetic\" | undefined",
              "required": false,
              "description": "The type of value the pin-input should allow"
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false,
              "description": "Whether the inputs are disabled"
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false,
              "description": "The name of the input element. Useful for form submission."
            },
            {
              "name": "value",
              "type": "string[] | undefined",
              "required": false,
              "description": "The controlled value of the the pin input."
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "description": "Use the provided child element as the default rendered element, combining their props and behavior."
            },
            {
              "name": "ids",
              "type": "ElementIds | undefined",
              "required": false,
              "description": "The ids of the elements in the pin input. Useful for composition."
            },
            {
              "name": "placeholder",
              "type": "string | undefined",
              "required": false,
              "description": "The placeholder text for the input",
              "defaultValue": ""
            },
            {
              "name": "readOnly",
              "type": "boolean | undefined",
              "required": false,
              "description": "Whether the pin input is in the valid state"
            },
            {
              "name": "required",
              "type": "boolean | undefined",
              "required": false,
              "description": "Whether the pin input is required"
            },
            {
              "name": "onValueChange",
              "type": "complex",
              "required": false,
              "description": "Function called on input change"
            },
            {
              "name": "translations",
              "type": "IntlTranslations | undefined",
              "required": false,
              "description": "Specifies the localized strings that identifies the accessibility elements and their states"
            },
            {
              "name": "onValueInvalid",
              "type": "complex",
              "required": false,
              "description": "Function called when an invalid value is entered"
            },
            {
              "name": "otp",
              "type": "boolean | undefined",
              "required": false,
              "description": "If `true`, the pin input component signals to its fields that they should\nuse `autocomplete=\"one-time-code\"`."
            },
            {
              "name": "onValueComplete",
              "type": "complex",
              "required": false,
              "description": "Function called when all inputs have valid values"
            },
            {
              "name": "autoSubmit",
              "type": "boolean | undefined",
              "required": false,
              "description": "Whether to auto-submit the owning form when all inputs are filled."
            },
            {
              "name": "blurOnComplete",
              "type": "boolean | undefined",
              "required": false,
              "description": "Whether to blur the input when the value is complete"
            },
            {
              "name": "selectOnFocus",
              "type": "boolean | undefined",
              "required": false,
              "description": "Whether to select input value when input is focused"
            },
            {
              "name": "sanitizeValue",
              "type": "((value: string) => string) | undefined",
              "required": false,
              "description": "Function to sanitize pasted values before validation.\nUseful for stripping dashes, spaces, or other formatting."
            },
            {
              "name": "count",
              "type": "number | undefined",
              "required": false,
              "description": "The number of inputs to render to improve SSR aria attributes.\nThis will be required in next major version.",
              "defaultValue": "6"
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Basic",
          "code": "import { OTPInput } from '@wallarm-org/design-system/InputOTP';\n\nexport const Basic = () => <OTPInput />;",
          "storyFile": "InputOTP/OTPInput.stories.tsx",
          "storyTitle": "Inputs/OTPInput",
          "description": "Six cells, with focus advancing as the reader types and a paste filling the whole code at\nonce — pasting is how most codes actually arrive."
        },
        {
          "name": "Disabled",
          "code": "<InputOTP disabled />",
          "storyFile": "InputOTP/OTPInput.stories.tsx",
          "storyTitle": "Inputs/OTPInput",
          "description": "All cells out together. The code is a single value, so cells are never disabled\nindividually."
        },
        {
          "name": "WithError",
          "code": "<InputOTP error />",
          "storyFile": "InputOTP/OTPInput.stories.tsx",
          "storyTitle": "Inputs/OTPInput",
          "description": "The invalid state across every cell, since a wrong code is wrong as a whole rather than in\none position."
        },
        {
          "name": "Numeric",
          "code": "<InputOTP type=\"numeric\" otp />",
          "storyFile": "InputOTP/OTPInput.stories.tsx",
          "storyTitle": "Inputs/OTPInput",
          "description": "Numeric entry brings up the number keypad, and the `otp` flag lets a password manager or\nthe OS offer the code it has just received."
        },
        {
          "name": "Masked",
          "code": "<InputOTP mask defaultValue={['1'} type=\"numeric\" />",
          "storyFile": "InputOTP/OTPInput.stories.tsx",
          "storyTitle": "Inputs/OTPInput",
          "description": "`mask` hides the characters as they are entered. Reserve it for codes worth hiding —\nmasking a six-digit code the reader is copying off a screen only makes it harder."
        },
        {
          "name": "WithField",
          "code": "import { Field, FieldLabel } from '@wallarm-org/design-system/Field';\nimport { OTPInput } from '@wallarm-org/design-system/InputOTP';\n\nexport const WithField = () => (\n    <Field required>\n      <FieldLabel>Label</FieldLabel>\n      <OTPInput />\n    </Field>\n  );",
          "storyFile": "InputOTP/OTPInput.stories.tsx",
          "storyTitle": "Inputs/OTPInput",
          "description": "Inside `Field`, so the instruction above the cells comes from `FieldLabel` and\n`FieldDescription` — which is where to say where the code came from."
        }
      ]
    },
    {
      "name": "Ip",
      "description": "One IP address and what is known about it — the country it resolves to, the port, the provider owning the range — composed as a row in which the address is the identity and everything else is context. `IpList` collapses a set of them: vertical keeps the first and hides the rest behind a `+N addresses` link, horizontal fits as many as the width allows and puts the remainder in a `+N` badge.",
      "importPath": "@wallarm-org/design-system/Ip",
      "props": [
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "asChild",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [
        {
          "name": "IpAddress",
          "props": []
        },
        {
          "name": "IpCountry",
          "props": [
            {
              "name": "code",
              "type": "\"AF\" | \"AX\" | \"AL\" | \"DZ\" | \"AS\" | \"AD\" | \"AO\" | \"AI\" | \"AG\" | \"AR\" | \"AM\" | \"AW\" | \"AU\" | \"AT\" | \"AZ\" | \"BS\" | \"BH\" | \"BD\" | \"BB\" | \"BY\" | \"BE\" | \"BZ\" | \"BJ\" | \"BM\" | \"BT\" | \"BO\" | \"BQ\" | \"BA\" | \"BW\" | \"BV\" | \"BR\" | \"IO\" | \"BN\" | \"BG\" | \"BF\" | \"BI\" | \"CV\" | \"KH\" | \"CM\" | \"CA\" | \"KY\" | \"CF\" | \"TD\" | \"CL\" | \"CN\" | \"CX\" | \"CC\" | \"CO\" | \"KM\" | \"CG\" | \"CD\" | \"CK\" | \"CR\" | \"CI\" | \"HR\" | \"CU\" | \"CW\" | \"CY\" | \"CZ\" | \"DK\" | \"DJ\" | \"DM\" | \"DO\" | \"DNO\" | \"EC\" | \"EG\" | \"SV\" | \"GQ\" | \"ER\" | \"EE\" | \"ET\" | \"FK\" | \"FO\" | \"FJ\" | \"FI\" | \"FR\" | \"GF\" | \"PF\" | \"TF\" | \"GA\" | \"GM\" | \"GE\" | \"DE\" | \"GH\" | \"GI\" | \"GR\" | \"GL\" | \"GD\" | \"GP\" | \"GU\" | \"GT\" | \"GG\" | \"GN\" | \"GW\" | \"GY\" | \"HT\" | \"HM\" | \"VA\" | \"HN\" | \"HK\" | \"HU\" | \"IS\" | \"IN\" | \"ID\" | \"IR\" | \"IQ\" | \"IE\" | \"IM\" | \"IL\" | \"IT\" | \"JM\" | \"JP\" | \"JE\" | \"JO\" | \"KZ\" | \"KE\" | \"KI\" | \"KP\" | \"KR\" | \"KW\" | \"KG\" | \"LA\" | \"LV\" | \"LB\" | \"LS\" | \"LR\" | \"LY\" | \"LI\" | \"LT\" | \"LHO\" | \"LU\" | \"MO\" | \"MK\" | \"MG\" | \"MW\" | \"MY\" | \"MV\" | \"ML\" | \"MT\" | \"MH\" | \"MQ\" | \"MR\" | \"MU\" | \"YT\" | \"MX\" | \"FM\" | \"MD\" | \"MC\" | \"MN\" | \"ME\" | \"MS\" | \"MA\" | \"MZ\" | \"MM\" | \"NA\" | \"NR\" | \"NP\" | \"NL\" | \"NC\" | \"NZ\" | \"NI\" | \"NE\" | \"NG\" | \"NU\" | \"NF\" | \"MP\" | \"NO\" | \"OM\" | \"PK\" | \"PW\" | \"PS\" | \"PA\" | \"PG\" | \"PY\" | \"PE\" | \"PH\" | \"PN\" | \"PL\" | \"PT\" | \"PR\" | \"QA\" | \"ROC\" | \"RE\" | \"RO\" | \"RU\" | \"RW\" | \"BL\" | \"SH\" | \"KN\" | \"LC\" | \"MF\" | \"PM\" | \"VC\" | \"WS\" | \"SM\" | \"ST\" | \"SA\" | \"SN\" | \"RS\" | \"SC\" | \"SL\" | \"SG\" | \"SX\" | \"SK\" | \"SI\" | \"SB\" | \"SO\" | \"ZA\" | \"GS\" | \"SS\" | \"ES\" | \"LK\" | \"SD\" | \"SR\" | \"SJ\" | \"SZ\" | \"SE\" | \"CH\" | \"SY\" | \"TW\" | \"TJ\" | \"TZ\" | \"TH\" | \"TL\" | \"TG\" | \"TK\" | \"TO\" | \"TT\" | \"TN\" | \"TR\" | \"TM\" | \"TC\" | \"TV\" | \"UG\" | \"UA\" | \"AE\" | \"GB\" | \"US\" | \"UY\" | \"UZ\" | \"VU\" | \"VE\" | \"VN\" | \"VG\" | \"VI\" | \"WF\" | \"EH\" | \"YE\" | \"ZM\" | \"ZW\"",
              "required": true
            }
          ]
        },
        {
          "name": "IpList",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"vertical\" | undefined",
              "required": false,
              "defaultValue": "vertical"
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "IpPort",
          "props": []
        },
        {
          "name": "IpProvider",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "muted",
              "type": "{ true: string; false: string; }",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "variant",
              "type": "{ default: string; dotted: string; }",
              "required": false
            },
            {
              "name": "isIconOnly",
              "type": "{ true: string; }",
              "required": false
            },
            {
              "name": "textVariant",
              "type": "{ default: string; code: string; }",
              "required": false
            },
            {
              "name": "isClickable",
              "type": "{ true: string; }",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Ip, IpAddress, IpCountry, IpPort, IpProvider } from '@wallarm-org/design-system/Ip';\n\nexport const Basic = () => (\n  <div className='grid grid-cols-[auto_200px] items-center gap-x-12 gap-y-8'>\n    <Ip>\n      <IpAddress>8.8.8.8</IpAddress>\n    </Ip>\n    <Ip>\n      <IpCountry code='US' />\n      <IpAddress>1.1.1.1</IpAddress>\n    </Ip>\n    <Ip>\n      <IpCountry code='DE' />\n      <IpAddress>77.88.8.8</IpAddress>\n      <IpPort>:8080</IpPort>\n    </Ip>\n    <Ip>\n      <IpCountry code='NL' />\n      <IpAddress>20.33.0.0</IpAddress>\n      <IpProvider>Azure</IpProvider>\n    </Ip>\n    <Ip>\n      <IpCountry code='JP' />\n      <IpAddress>2001:0db8:85a3:0000:0000:8a2e:0370:7334</IpAddress>\n      <IpProvider>GCP</IpProvider>\n    </Ip>\n  </div>\n);",
          "storyFile": "Ip/Ip.stories.tsx",
          "storyTitle": "Data Display/Ip",
          "description": "The five compositions, from the address on its own up to an IPv6 with a provider. The\naddress truncates with a tooltip behind it, so the longest v6 still cannot widen its row."
        },
        {
          "name": "HorizontalMultiple",
          "code": "import { Ip, IpAddress, IpCountry, IpList, IpProvider } from '@wallarm-org/design-system/Ip';\n\nexport const HorizontalMultiple = () => (\n  <div style={{ width: 600 }}>\n    <IpList type='horizontal' data-testid='horizontal-ips'>\n      <Ip>\n        <IpCountry code='ES' />\n        <IpAddress>142.198.167.52</IpAddress>\n        <IpProvider>Azure</IpProvider>\n      </Ip>\n      <Ip>\n        <IpCountry code='US' />\n        <IpAddress>34.74.73.20</IpAddress>\n        <IpProvider>AWS</IpProvider>\n      </Ip>\n      <Ip>\n        <IpCountry code='MY' />\n        <IpAddress>34.74.73.21</IpAddress>\n        <IpProvider>GCP</IpProvider>\n      </Ip>\n      <Ip>\n        <IpCountry code='US' />\n        <IpAddress>34.74.73.22</IpAddress>\n        <IpProvider>AWS</IpProvider>\n      </Ip>\n      <Ip>\n        <IpCountry code='MY' />\n        <IpAddress>34.74.73.23</IpAddress>\n        <IpProvider>GCP</IpProvider>\n      </Ip>\n      <Ip>\n        <IpCountry code='DE' />\n        <IpAddress>77.88.8.8</IpAddress>\n      </Ip>\n      <Ip>\n        <IpCountry code='NL' />\n        <IpAddress>20.33.0.0</IpAddress>\n      </Ip>\n      <Ip>\n        <IpCountry code='JP' />\n        <IpAddress>192.168.1.1</IpAddress>\n      </Ip>\n    </IpList>\n  </div>\n);",
          "storyFile": "Ip/Ip.stories.tsx",
          "storyTitle": "Data Display/Ip",
          "description": "Eight addresses in a 600px row: the ones that fit are separated by a middle dot, and the\nrest fold into a `+N` badge that opens the full set in a popover."
        },
        {
          "name": "VerticalMultiple",
          "code": "import { Ip, IpAddress, IpCountry, IpList, IpPort, IpProvider } from '@wallarm-org/design-system/Ip';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const VerticalMultiple = () => (\n  <VStack gap={12}>\n    <IpList>\n      <Ip>\n        <IpCountry code='US' />\n        <IpAddress>8.8.8.8</IpAddress>\n      </Ip>\n      <Ip>\n        <IpCountry code='AU' />\n        <IpAddress>1.1.1.1</IpAddress>\n      </Ip>\n      <Ip>\n        <IpCountry code='DE' />\n        <IpAddress>77.88.8.8</IpAddress>\n      </Ip>\n    </IpList>\n    <IpList>\n      <Ip data-testid='ip'>\n        <IpCountry code='NL' />\n        <IpAddress>52.94.76.0</IpAddress>\n      </Ip>\n      <Ip data-testid='ip'>\n        <IpCountry code='NL' />\n        <IpAddress>20.33.0.0</IpAddress>\n      </Ip>\n      <Ip data-testid='ip'>\n        <IpCountry code='AZ' />\n        <IpAddress>35.190.0.0</IpAddress>\n        <IpProvider>GCP</IpProvider>\n      </Ip>\n      <Ip data-testid='ip'>\n        <IpCountry code='US' />\n        <IpAddress>169.55.0.0</IpAddress>\n        <IpProvider>IBM Cloud</IpProvider>\n      </Ip>\n      <Ip data-testid='ip'>\n        <IpAddress>88.198.0.0</IpAddress>\n        <IpPort>:8080</IpPort>\n      </Ip>\n    </IpList>\n    <IpList>\n      <Ip>\n        <IpAddress>10.0.0.1</IpAddress>\n        <IpPort>:8080</IpPort>\n        <IpProvider>Tor</IpProvider>\n      </Ip>\n      <Ip>\n        <IpAddress>10.0.0.2</IpAddress>\n        <IpPort>:443</IpPort>\n        <IpProvider>VPN</IpProvider>\n      </Ip>\n    </IpList>\n  </VStack>\n);",
          "storyFile": "Ip/Ip.stories.tsx",
          "storyTitle": "Data Display/Ip",
          "description": "Three vertical lists, each showing its first address only and holding the rest behind a\n`+N addresses` link — the link indents to the address when the row opens with a flag."
        }
      ]
    },
    {
      "name": "Kbd",
      "description": "Shows a keyboard shortcut as a `<kbd>` cap. It is display-only — the DS binds nothing, so the `keydown` handler stays yours — and `Code` is the one to reach for when what you are showing is a value rather than a key. One cap holds one key and `KbdGroup` sets out a combination; render the modifier symbols (⌘, ⇧, ⌥, ↵) rather than the words, so the same shortcut reads the same everywhere.",
      "importPath": "@wallarm-org/design-system/Kbd",
      "props": [
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "size",
          "type": "{ xsmall: string; small: string; medium: string; }",
          "required": false,
          "defaultValue": "small"
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "size",
          "options": [
            "xsmall",
            "small",
            "medium"
          ]
        }
      ],
      "subComponents": [],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Kbd } from '@wallarm-org/design-system/Kbd';\n\nexport const Basic = () => <Kbd>⌘</Kbd>;",
          "storyFile": "Kbd/Kbd.stories.tsx",
          "storyTitle": "Primitives/Kbd",
          "description": "A single cap at the default size. The look is fixed — `size` is the way in, `className` is not."
        },
        {
          "name": "Group",
          "code": "import { Kbd, KbdGroup } from '@wallarm-org/design-system/Kbd';\nimport { VStack } from '@wallarm-org/design-system/Stack';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const Group = () => (\n  <VStack>\n    <KbdGroup>\n      <Kbd>⌘</Kbd>\n      <Kbd>⇧</Kbd>\n      <Kbd>⌥</Kbd>\n      <Kbd>⌃</Kbd>\n    </KbdGroup>\n\n    <KbdGroup>\n      <Kbd>Ctrl</Kbd>\n      <Text>+</Text>\n      <Kbd>B</Kbd>\n    </KbdGroup>\n  </VStack>\n);",
          "storyFile": "Kbd/Kbd.stories.tsx",
          "storyTitle": "Primitives/Kbd",
          "description": "`KbdGroup` lays a combination out one cap per key: modifiers on their own above, and a two-key chord below where the `+` is plain text between the caps."
        },
        {
          "name": "Sizes",
          "code": "import { Kbd } from '@wallarm-org/design-system/Kbd';\nimport { HStack } from '@wallarm-org/design-system/Stack';\n\nexport const Sizes = () => (\n  <HStack>\n    <Kbd size='small'>⌘</Kbd>\n    <Kbd size='medium'>⌘</Kbd>\n  </HStack>\n);",
          "storyFile": "Kbd/Kbd.stories.tsx",
          "storyTitle": "Primitives/Kbd",
          "description": "`small` beside `medium`. Match the cap to the density of the text around it rather than to what looks best on its own."
        },
        {
          "name": "WithTooltip",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Info } from '@wallarm-org/design-system/icons';\nimport { Kbd } from '@wallarm-org/design-system/Kbd';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@wallarm-org/design-system/Tooltip';\n\nexport const WithTooltip = () => (\n  <Tooltip>\n    <TooltipTrigger asChild>\n      <Button variant='outline' color='neutral'>\n        <Info />\n      </Button>\n    </TooltipTrigger>\n    <TooltipContent>\n      Add instance <Kbd>⌘</Kbd>\n    </TooltipContent>\n  </Tooltip>\n);",
          "storyFile": "Kbd/Kbd.stories.tsx",
          "storyTitle": "Primitives/Kbd",
          "description": "Inside a `Tooltip` the cap restyles itself for the inverted surface, so a shortcut hint needs nothing special from you."
        }
      ]
    },
    {
      "name": "Link",
      "description": "The navigation member of the Actions family — a styled `<a>` that takes the reader somewhere. If activating it changes where you are it is a `Link`; if it does something in place it is a `Button`, however text-like it looks. `type` is semantic, so never hand-colour a link, and the hover underline is automatic. Link text has to describe its destination — “Click here” and “Learn more” read as nothing in a screen reader’s link list.",
      "importPath": "@wallarm-org/design-system/Link",
      "props": [
        {
          "name": "download",
          "type": "any",
          "required": false
        },
        {
          "name": "href",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "hrefLang",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "target",
          "type": "HTMLAttributeAnchorTarget | undefined",
          "required": false
        },
        {
          "name": "type",
          "type": "string | undefined",
          "required": false,
          "defaultValue": "default"
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "disabled",
          "type": "{ true: string; }",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "size",
          "type": "{ xs: string; sm: string; md: string; lg: string; xl: string; }",
          "required": false,
          "defaultValue": "lg"
        },
        {
          "name": "weight",
          "type": "{ regular: string; medium: string; }",
          "required": false,
          "defaultValue": "regular"
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "asChild",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "false"
        }
      ],
      "variants": [
        {
          "name": "type",
          "options": [
            "default",
            "alt",
            "muted",
            "table"
          ]
        },
        {
          "name": "size",
          "options": [
            "xs",
            "sm",
            "md",
            "lg",
            "xl"
          ]
        },
        {
          "name": "weight",
          "options": [
            "regular",
            "medium"
          ]
        },
        {
          "name": "disabled",
          "options": [
            "true"
          ]
        }
      ],
      "subComponents": [],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Link } from '@wallarm-org/design-system/Link';\n\nexport const Basic = () => <Link href='#'>Link</Link>;",
          "storyFile": "Link/Link.stories.tsx",
          "storyTitle": "Navigation/Link",
          "description": "The default link at its default size, which is `lg` — a link inside smaller copy needs an explicit size."
        },
        {
          "name": "Types",
          "code": "import { Link } from '@wallarm-org/design-system/Link';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Types = () => (\n  <VStack>\n    <Link href='#' type='default'>\n      Link\n    </Link>\n\n    <Link href='#' type='alt'>\n      Link\n    </Link>\n\n    <Link href='#' type='muted'>\n      Link\n    </Link>\n  </VStack>\n);",
          "storyFile": "Link/Link.stories.tsx",
          "storyTitle": "Navigation/Link",
          "description": "`default`, `alt` and `muted`. `alt` is the inverted family for dark surfaces, which is why it barely reads here; the fourth type, `table`, is the master-cell title link and only belongs there."
        },
        {
          "name": "Weight",
          "code": "import { Link } from '@wallarm-org/design-system/Link';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Weight = () => (\n  <VStack>\n    <Link href='#' weight='regular'>\n      Link\n    </Link>\n\n    <Link href='#' weight='medium'>\n      Link\n    </Link>\n  </VStack>\n);",
          "storyFile": "Link/Link.stories.tsx",
          "storyTitle": "Navigation/Link",
          "description": "`medium` where the surrounding copy is heavier, or to lift a standalone link — there is no bold, so `medium` is as far as it goes."
        },
        {
          "name": "Sizes",
          "code": "import { Link } from '@wallarm-org/design-system/Link';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Sizes = () => (\n  <VStack>\n    <Link href='#' size='xl'>\n      Link\n    </Link>\n\n    <Link href='#' size='lg'>\n      Link\n    </Link>\n\n    <Link href='#' size='md'>\n      Link\n    </Link>\n\n    <Link href='#' size='sm'>\n      Link\n    </Link>\n\n    <Link href='#' size='xs'>\n      Link\n    </Link>\n  </VStack>\n);",
          "storyFile": "Link/Link.stories.tsx",
          "storyTitle": "Navigation/Link",
          "description": "`xs` to `xl`, each matched to a text size. An inline link takes the scale of the copy around it rather than being sized on its own."
        },
        {
          "name": "Icons",
          "code": "import { ArrowRight, SquareArrowOutUpRight } from '@wallarm-org/design-system/icons';\nimport { Link } from '@wallarm-org/design-system/Link';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Icons = () => (\n  <VStack>\n    <Link href='#'>\n      Open new tab <SquareArrowOutUpRight />\n    </Link>\n\n    <Link href='#'>\n      Let's explore <ArrowRight />\n    </Link>\n  </VStack>\n);",
          "storyFile": "Link/Link.stories.tsx",
          "storyTitle": "Navigation/Link",
          "description": "Icons are children, not a prop. A trailing icon is the direction cue — the external-link mark for a new tab, an arrow for “explore” — and a new tab still needs `target` and `rel` set by hand."
        }
      ]
    },
    {
      "name": "List",
      "description": "A semantic `ul` or `ol` with its spacing and markers under control — reach for `ordered` only when the sequence matters, and for a `Table` as soon as each item carries fields of its own. Markers are off by default and `role=\"list\"` is set either way, so a list without bullets is still a list to a screen reader.",
      "importPath": "@wallarm-org/design-system/List",
      "props": [
        {
          "name": "variant",
          "type": "ListVariant | undefined",
          "required": false,
          "defaultValue": "unordered"
        },
        {
          "name": "spacing",
          "type": "ListSpacing | undefined",
          "required": false
        },
        {
          "name": "marker",
          "type": "ListMarker | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "spacing",
          "options": [
            "0",
            "2",
            "4",
            "8",
            "12",
            "16",
            "24"
          ],
          "defaultValue": "4"
        },
        {
          "name": "marker",
          "options": [
            "none",
            "disc",
            "decimal"
          ],
          "defaultValue": "none"
        }
      ],
      "subComponents": [
        {
          "name": "ListIcon",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "ListItem",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Basic",
          "code": "import { List, ListItem } from '@wallarm-org/design-system/List';\n\nexport const Basic = () => (\n  <List>\n    <ListItem>First item</ListItem>\n    <ListItem>Second item</ListItem>\n    <ListItem>Third item</ListItem>\n  </List>\n);",
          "storyFile": "List/List.stories.tsx",
          "storyTitle": "Data Display/List",
          "description": "The default: unordered, no marker, 4px between items — a plain vertical group that\nstill announces itself as a list."
        },
        {
          "name": "Ordered",
          "code": "import { List, ListItem } from '@wallarm-org/design-system/List';\n\nexport const Ordered = () => (\n  <List variant='ordered' marker='decimal'>\n    <ListItem>First step</ListItem>\n    <ListItem>Second step</ListItem>\n    <ListItem>Third step</ListItem>\n  </List>\n);",
          "storyFile": "List/List.stories.tsx",
          "storyTitle": "Data Display/List",
          "description": "`variant='ordered'` changes the element to `ol`; the numbers themselves come from\n`marker='decimal'`, which is a separate decision from the element."
        },
        {
          "name": "WithDisc",
          "code": "import { List, ListItem } from '@wallarm-org/design-system/List';\n\nexport const WithDisc = () => (\n  <List marker='disc'>\n    <ListItem>Apples</ListItem>\n    <ListItem>Bananas</ListItem>\n    <ListItem>Cherries</ListItem>\n  </List>\n);",
          "storyFile": "List/List.stories.tsx",
          "storyTitle": "Data Display/List",
          "description": "`marker='disc'` turns the bullets on and indents the list by 24px to make room for them."
        },
        {
          "name": "WithIcons",
          "code": "import { List, ListIcon, ListItem } from '@wallarm-org/design-system/List';\n\nexport const WithIcons = () => (\n  <List>\n    <ListItem>\n      <ListIcon className='text-text-success'>&#10003;</ListIcon>\n      Completed task\n    </ListItem>\n    <ListItem>\n      <ListIcon className='text-text-warning'>&#9888;</ListIcon>\n      Pending review\n    </ListItem>\n    <ListItem>\n      <ListIcon className='text-text-error'>&#10007;</ListIcon>\n      Failed check\n    </ListItem>\n  </List>\n);",
          "storyFile": "List/List.stories.tsx",
          "storyTitle": "Data Display/List",
          "description": "`ListIcon` puts a meaningful glyph where the marker would be, coloured by what the row\nsays; `ListItem` is a flex row, so the icon and its text share a baseline."
        },
        {
          "name": "Spacing",
          "code": "import { List, ListItem } from '@wallarm-org/design-system/List';\n\nexport const Spacing = () => (\n  <div className='flex gap-48'>\n    <div>\n      <List spacing={0}>\n        <ListItem>Item A</ListItem>\n        <ListItem>Item B</ListItem>\n        <ListItem>Item C</ListItem>\n      </List>\n    </div>\n    <div>\n      <List spacing={8}>\n        <ListItem>Item A</ListItem>\n        <ListItem>Item B</ListItem>\n        <ListItem>Item C</ListItem>\n      </List>\n    </div>\n    <div>\n      <List spacing={16}>\n        <ListItem>Item A</ListItem>\n        <ListItem>Item B</ListItem>\n        <ListItem>Item C</ListItem>\n      </List>\n    </div>\n  </div>\n);",
          "storyFile": "List/List.stories.tsx",
          "storyTitle": "Data Display/List",
          "description": "Three of the seven spacing steps. The gap sits between items only, so a wrapped item\nkeeps its own lines tight while the list stays loose."
        }
      ]
    },
    {
      "name": "Loader",
      "description": "A spinner for a short, in-context wait you cannot measure — one thing at a time, placed where the waiting is happening. Reach for `Skeleton` when a page, list or table is loading a layout you already know, and for `Progress` when you can measure the wait or it runs past about ten seconds, where a spinner starts to read as frozen; a `Button` carries its own loading state, so never put one beside a button. It ships no label and no live region of its own, so the announcement has to come from a `role=\"status\"` element around it.",
      "importPath": "@wallarm-org/design-system/Loader",
      "props": [
        {
          "name": "type",
          "type": "LoaderType | undefined",
          "required": false,
          "defaultValue": "circle"
        },
        {
          "name": "background",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "true"
        },
        {
          "name": "color",
          "type": "{ primary: string; 'primary-alt': string; 'primary-alt-fixed': string; brand: string; danger: string; }",
          "required": false
        },
        {
          "name": "size",
          "type": "{ sm: string; md: string; lg: string; xl: string; '2xl': string; '3xl': string; }",
          "required": false,
          "defaultValue": "xl"
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "size",
          "options": [
            "sm",
            "md",
            "lg",
            "xl",
            "2xl",
            "3xl"
          ]
        },
        {
          "name": "color",
          "options": [
            "primary",
            "primary-alt",
            "primary-alt-fixed",
            "brand",
            "danger"
          ]
        }
      ],
      "subComponents": [],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Loader } from '@wallarm-org/design-system/Loader';\n\nexport const Basic = () => <Loader />;",
          "storyFile": "Loader/Loader.stories.tsx",
          "storyTitle": "Loading/Loader",
          "description": "The default: a `circle` at `xl`, and always indeterminate — there is no determinate spinner, because that is `Progress`."
        },
        {
          "name": "Types",
          "code": "import { Loader } from '@wallarm-org/design-system/Loader';\nimport { HStack } from '@wallarm-org/design-system/Stack';\n\nexport const Types = () => (\n  <HStack>\n    <Loader type='circle' />\n    <Loader type='sonner' />\n  </HStack>\n);",
          "storyFile": "Loader/Loader.stories.tsx",
          "storyTitle": "Loading/Loader",
          "description": "`circle` beside `sonner`, the radial fade. Pick one for a surface and stay with it rather than mixing both in a view."
        },
        {
          "name": "Sizes",
          "code": "import { Loader } from '@wallarm-org/design-system/Loader';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Sizes = () => (\n  <VStack>\n    <HStack>\n      <Loader size='sm' />\n      <Loader size='md' />\n      <Loader size='lg' />\n      <Loader size='xl' />\n      <Loader size='2xl' />\n      <Loader size='3xl' />\n    </HStack>\n\n    <HStack>\n      <Loader type='sonner' size='sm' />\n      <Loader type='sonner' size='md' />\n      <Loader type='sonner' size='lg' />\n      <Loader type='sonner' size='xl' />\n      <Loader type='sonner' size='2xl' />\n      <Loader type='sonner' size='3xl' />\n    </HStack>\n  </VStack>\n);",
          "storyFile": "Loader/Loader.stories.tsx",
          "storyTitle": "Loading/Loader",
          "description": "`sm` to `3xl`, 12px to 48px. The small end is for inline waits inside a field or a row; `xl` and up are for a spinner centred in a panel."
        },
        {
          "name": "Colors",
          "code": "import { Loader } from '@wallarm-org/design-system/Loader';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Colors = () => (\n  <VStack>\n    <HStack>\n      <Loader color='primary' />\n      <Loader color='brand' />\n      <Loader color='danger' />\n      <div className='flex gap-4 bg-slate-950'>\n        <Loader color='primary-alt' />\n\n        <Loader color='primary-alt-fixed' />\n      </div>\n    </HStack>\n\n    <HStack>\n      <Loader type='sonner' color='primary' />\n      <Loader type='sonner' color='brand' />\n      <Loader type='sonner' color='danger' />\n      <div className='flex gap-4 bg-slate-950'>\n        <Loader type='sonner' color='primary-alt' />\n\n        <Loader type='sonner' color='primary-alt-fixed' />\n      </div>\n    </HStack>\n  </VStack>\n);",
          "storyFile": "Loader/Loader.stories.tsx",
          "storyTitle": "Loading/Loader",
          "description": "The icon colours, with `primary-alt` and `primary-alt-fixed` for dark surfaces. With no `color` set the spinner simply takes the current text colour, which is usually what you want."
        },
        {
          "name": "CircleBackground",
          "code": "import { Loader } from '@wallarm-org/design-system/Loader';\nimport { HStack } from '@wallarm-org/design-system/Stack';\n\nexport const CircleBackground = () => (\n  <HStack>\n    <Loader />\n    <Loader background={false} />\n  </HStack>\n);",
          "storyFile": "Loader/Loader.stories.tsx",
          "storyTitle": "Loading/Loader",
          "description": "`background={false}` drops the faint track ring behind the circle — worth it on a surface where the ring reads as a border. It applies to `circle` only."
        }
      ]
    },
    {
      "name": "Logo",
      "description": "The Wallarm logo in its three forms — `icon`, `wordmark` and `full` — sized by height, with the width following. `color` is a decision about the surface rather than a style choice: `default` on light, `white` on a dark surface where the mark should keep its brand colour, and `full-white` only where the whole lockup has to be a single colour. It renders a bare `svg` with no accessible name, so pass an `aria-label` where the logo is the only thing naming a link, and leave it unlabelled where a heading beside it already does.",
      "importPath": "@wallarm-org/design-system/Logo",
      "props": [
        {
          "name": "type",
          "type": "LogoType | undefined",
          "required": false,
          "defaultValue": "full"
        },
        {
          "name": "color",
          "type": "LogoStyle | undefined",
          "required": false,
          "defaultValue": "default"
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "name",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "href",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "target",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "height",
          "type": "string | number | undefined",
          "required": false
        },
        {
          "name": "width",
          "type": "string | number | undefined",
          "required": false
        },
        {
          "name": "max",
          "type": "string | number | undefined",
          "required": false
        },
        {
          "name": "min",
          "type": "string | number | undefined",
          "required": false
        },
        {
          "name": "size",
          "type": "{ xs: string; sm: string; md: string; lg: string; xl: string; '2xl': string; }",
          "required": false,
          "defaultValue": "lg"
        }
      ],
      "variants": [
        {
          "name": "size",
          "options": [
            "xs",
            "sm",
            "md",
            "lg",
            "xl",
            "2xl"
          ],
          "defaultValue": "lg"
        }
      ],
      "subComponents": [],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Logo } from '@wallarm-org/design-system/Logo';\n\nexport const Basic = () => <Logo />;",
          "storyFile": "Logo/Logo.stories.tsx",
          "storyTitle": "Brand/Logo",
          "description": "Every knob live. The defaults are `full` at `lg`, which is 20px tall."
        },
        {
          "name": "Types",
          "code": "import { Logo } from '@wallarm-org/design-system/Logo';\nimport { HStack } from '@wallarm-org/design-system/Stack';\n\nexport const Types = () => (\n  <HStack gap={96} justify='between' fullWidth>\n    <Logo type='icon' />\n    <Logo type='wordmark' />\n    <Logo type='full' />\n  </HStack>\n);",
          "storyFile": "Logo/Logo.stories.tsx",
          "storyTitle": "Brand/Logo",
          "description": "The three forms at one height: the icon alone where space is tight, the wordmark where the mark already appears nearby, and the full lockup everywhere else."
        },
        {
          "name": "Styles",
          "code": "import { Logo } from '@wallarm-org/design-system/Logo';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Styles = () => (\n  <VStack gap={16}>\n    <div className='rounded-8 px-16 py-8'>\n      <HStack gap={96} justify='between' fullWidth>\n        <Logo type='icon' color='default' />\n        <Logo type='wordmark' color='default' />\n        <Logo type='full' color='default' />\n      </HStack>\n    </div>\n    <div className='rounded-8 bg-slate-900 px-16 py-8'>\n      <HStack gap={96} justify='between' fullWidth>\n        <Logo type='icon' color='white' />\n        <Logo type='wordmark' color='white' />\n        <Logo type='full' color='white' />\n      </HStack>\n    </div>\n    <div className='rounded-8 bg-slate-900 px-16 py-8'>\n      <HStack gap={96} justify='between' fullWidth>\n        <Logo type='icon' color='full-white' />\n        <Logo type='wordmark' color='full-white' />\n        <Logo type='full' color='full-white' />\n      </HStack>\n    </div>\n  </VStack>\n);",
          "storyFile": "Logo/Logo.stories.tsx",
          "storyTitle": "Brand/Logo",
          "description": "Each colour style on the surface it is for. `white` keeps the icon’s brand colour and turns only the wordmark white; `full-white` gives up the colour entirely."
        },
        {
          "name": "Sizes",
          "code": "import { Logo } from '@wallarm-org/design-system/Logo';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Sizes = () => (\n  <HStack gap={96} justify='between' fullWidth>\n    <VStack gap={16} align='start'>\n      <Logo type='icon' size='xs' />\n      <Logo type='icon' size='sm' />\n      <Logo type='icon' size='md' />\n      <Logo type='icon' size='lg' />\n      <Logo type='icon' size='xl' />\n      <Logo type='icon' size='2xl' />\n    </VStack>\n    <VStack gap={16} align='start'>\n      <Logo type='wordmark' size='xs' />\n      <Logo type='wordmark' size='sm' />\n      <Logo type='wordmark' size='md' />\n      <Logo type='wordmark' size='lg' />\n      <Logo type='wordmark' size='xl' />\n      <Logo type='wordmark' size='2xl' />\n    </VStack>\n    <VStack gap={16} align='start'>\n      <Logo type='full' size='xs' />\n      <Logo type='full' size='sm' />\n      <Logo type='full' size='md' />\n      <Logo type='full' size='lg' />\n      <Logo type='full' size='xl' />\n      <Logo type='full' size='2xl' />\n    </VStack>\n  </HStack>\n);",
          "storyFile": "Logo/Logo.stories.tsx",
          "storyTitle": "Brand/Logo",
          "description": "`xs` to `2xl`, 10px to 32px of height. The three forms sit side by side because the same height buys three very different footprints — 34, 75 and 118 units of viewBox width."
        }
      ]
    },
    {
      "name": "MessageActions",
      "description": "The small row of icon buttons under a chat message — copy, feedback, a more menu and a timestamp. Every `MessageAction` is a ghost icon button whose required `aria-label` doubles as its tooltip, so the row never needs a visible caption. By default the row is transparent until the nearest `group/message` parent is hovered or holds focus, keeping its 30px height so the conversation does not jump; pass `visible` for the latest answer. Copy is composed with `Copyable` and `CopyableIcon`, menus with `DropdownMenuTrigger asChild`, and feedback with `aria-pressed` — the row itself holds no state. Give a menu-trigger action an explicit `data-testid`: the trigger injects its own `--trigger` id, which replaces the cascaded `--action` one.",
      "importPath": "@wallarm-org/design-system/MessageActions",
      "props": [
        {
          "name": "visible",
          "type": "boolean | undefined",
          "required": false,
          "description": "Force-show the row (e.g. the latest answer). By default the row is revealed on\nhover / focus-within of the nearest `group/message` parent, and always shown on\n`hover: none` devices. Hidden rows keep their 30px height and stay tabbable.",
          "defaultValue": "false"
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "visible",
          "options": [
            "false",
            "true"
          ],
          "defaultValue": "false"
        }
      ],
      "subComponents": [
        {
          "name": "MessageAction",
          "props": [
            {
              "name": "aria-label",
              "type": "string",
              "required": true,
              "description": "Required: the accessible name and the tooltip text."
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "MessageTimestamp",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "User",
          "code": "import { Copyable, CopyableIcon } from '@wallarm-org/design-system/Copyable';\nimport { MessageAction, MessageActions, MessageTimestamp } from '@wallarm-org/design-system/MessageActions';\n\nexport const User = () => (\n  <MessageActions data-testid='user-actions' visible>\n    <MessageTimestamp dateTime='2026-10-21T09:41:00Z'>2m ago</MessageTimestamp>\n    <Copyable text='Show me blocked attacks'>\n      <MessageAction aria-label='Copy' data-testid='user-actions--copy'>\n        <CopyableIcon />\n      </MessageAction>\n    </Copyable>\n  </MessageActions>\n);",
          "storyFile": "MessageActions/MessageActions.stories.tsx",
          "storyTitle": "AI/MessageActions",
          "description": "Under a user message: the timestamp first, then Copy. In a chat, the parent should align\nthe row to the end of the bubble with `items-end`."
        },
        {
          "name": "Wally",
          "code": "import { Copyable, CopyableIcon } from '@wallarm-org/design-system/Copyable';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { Ellipsis, ThumbsDown, ThumbsUp } from '@wallarm-org/design-system/icons';\nimport { MessageAction, MessageActions, MessageTimestamp } from '@wallarm-org/design-system/MessageActions';\n\nexport const Wally = () => (\n  <MessageActions data-testid='wally-actions' visible>\n    <Copyable text={ANSWER}>\n      <MessageAction aria-label='Copy' data-testid='wally-actions--copy'>\n        <CopyableIcon />\n      </MessageAction>\n    </Copyable>\n    <MessageAction aria-label='Good response' data-testid='wally-actions--up'>\n      <ThumbsUp />\n    </MessageAction>\n    <MessageAction aria-label='Bad response' data-testid='wally-actions--down'>\n      <ThumbsDown />\n    </MessageAction>\n    <DropdownMenu>\n      <DropdownMenuTrigger asChild>\n        <MessageAction aria-label='More actions' data-testid='wally-actions--more'>\n          <Ellipsis />\n        </MessageAction>\n      </DropdownMenuTrigger>\n      <DropdownMenuContent>\n        <DropdownMenuItem>Regenerate</DropdownMenuItem>\n        <DropdownMenuItem>Report a problem</DropdownMenuItem>\n      </DropdownMenuContent>\n    </DropdownMenu>\n    <MessageTimestamp dateTime='2026-10-21T09:42:00Z'>1m ago</MessageTimestamp>\n  </MessageActions>\n);",
          "storyFile": "MessageActions/MessageActions.stories.tsx",
          "storyTitle": "AI/MessageActions",
          "description": "Under a Wally answer: Copy, thumbs up and down, a more menu, then the timestamp. The\nEllipsis button is the menu trigger and keeps its own tooltip anchored to it."
        },
        {
          "name": "Visible",
          "code": "import { Copyable, CopyableIcon } from '@wallarm-org/design-system/Copyable';\nimport { MessageAction, MessageActions, MessageTimestamp } from '@wallarm-org/design-system/MessageActions';\n\nexport const Visible = () => (\n  <div className='flex flex-col gap-16'>\n    <div className='group/message flex flex-col items-start gap-4' data-testid='message-default'>\n      <p className='text-sm text-text-primary'>Hover to reveal</p>\n      <MessageActions data-testid='actions-default'>\n        <Copyable text={ANSWER}>\n          <MessageAction aria-label='Copy' data-testid='actions-default--copy'>\n            <CopyableIcon />\n          </MessageAction>\n        </Copyable>\n        <MessageTimestamp dateTime='2026-10-21T09:42:00Z'>1m ago</MessageTimestamp>\n      </MessageActions>\n    </div>\n    <div className='group/message flex flex-col items-start gap-4' data-testid='message-visible'>\n      <p className='text-sm text-text-primary'>visible</p>\n      <MessageActions data-testid='actions-visible' visible>\n        <Copyable text={ANSWER}>\n          <MessageAction aria-label='Copy' data-testid='actions-visible--copy'>\n            <CopyableIcon />\n          </MessageAction>\n        </Copyable>\n        <MessageTimestamp dateTime='2026-10-21T09:42:00Z'>1m ago</MessageTimestamp>\n      </MessageActions>\n    </div>\n  </div>\n);",
          "storyFile": "MessageActions/MessageActions.stories.tsx",
          "storyTitle": "AI/MessageActions",
          "description": "Default versus `visible`. The first row stays transparent (but tabbable) until its message\nis hovered or focused; the second is forced on, as for the latest answer."
        },
        {
          "name": "PressedFeedback",
          "code": "import { useState } from 'react';\nimport { ThumbsDown, ThumbsUp } from '@wallarm-org/design-system/icons';\nimport { MessageAction, MessageActions } from '@wallarm-org/design-system/MessageActions';\n\nexport const PressedFeedback = () => {\n  const [feedback, setFeedback] = useState<'up' | 'down' | null>('up');\n\n  const handleGoodClick = () => {\n    setFeedback(current => (current === 'up' ? null : 'up'));\n  };\n\n  const handleBadClick = () => {\n    setFeedback(current => (current === 'down' ? null : 'down'));\n  };\n\n  return (\n    <MessageActions data-testid='feedback-actions' visible>\n      <MessageAction\n        aria-label='Good response'\n        aria-pressed={feedback === 'up'}\n        data-testid='feedback-up'\n        onClick={handleGoodClick}\n      >\n        <ThumbsUp />\n      </MessageAction>\n      <MessageAction\n        aria-label='Bad response'\n        aria-pressed={feedback === 'down'}\n        data-testid='feedback-down'\n        onClick={handleBadClick}\n      >\n        <ThumbsDown />\n      </MessageAction>\n    </MessageActions>\n  );\n};",
          "storyFile": "MessageActions/MessageActions.stories.tsx",
          "storyTitle": "AI/MessageActions",
          "description": "Thumbs feedback is a plain toggle: pass `aria-pressed` and the button keeps the\n`states-primary-active` background while pressed. Click one to try it."
        },
        {
          "name": "Analytics",
          "code": "import { Copyable, CopyableIcon } from '@wallarm-org/design-system/Copyable';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { Ellipsis, ThumbsUp } from '@wallarm-org/design-system/icons';\nimport { MessageAction, MessageActions } from '@wallarm-org/design-system/MessageActions';\n\nexport const Analytics = () => (\n  <MessageActions data-testid='analytics-actions' visible>\n    <Copyable text={ANSWER}>\n      <MessageAction\n        aria-label='Copy'\n        data-testid='analytics-actions--copy'\n        data-analytics-id='WALLY_ANSWER_COPY'\n      >\n        <CopyableIcon />\n      </MessageAction>\n    </Copyable>\n    <MessageAction\n      aria-label='Good response'\n      data-testid='analytics-actions--up'\n      data-analytics-id='WALLY_ANSWER_FEEDBACK'\n      data-analytics-props='{\"rating\":\"up\"}'\n    >\n      <ThumbsUp />\n    </MessageAction>\n    <DropdownMenu>\n      <DropdownMenuTrigger asChild>\n        <MessageAction\n          aria-label='More actions'\n          data-testid='analytics-actions--more'\n          data-analytics-id='WALLY_ANSWER_MORE'\n        >\n          <Ellipsis />\n        </MessageAction>\n      </DropdownMenuTrigger>\n      <DropdownMenuContent>\n        <DropdownMenuItem>Regenerate</DropdownMenuItem>\n      </DropdownMenuContent>\n    </DropdownMenu>\n  </MessageActions>\n);",
          "storyFile": "MessageActions/MessageActions.stories.tsx",
          "storyTitle": "AI/MessageActions",
          "description": "`data-analytics-id` and `data-analytics-props` go straight onto each `MessageAction` and\nland on its real `<button>` — also through `Copyable` and `DropdownMenuTrigger asChild`."
        }
      ]
    },
    {
      "name": "NavPanel",
      "importPath": "@wallarm-org/design-system/NavPanel",
      "props": [
        {
          "name": "resizable",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "active",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        }
      ],
      "subComponents": [
        {
          "name": "NavPanelBack",
          "props": [
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "NavPanelDivider",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "NavPanelGroup",
          "props": [
            {
              "name": "expanded",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultExpanded",
              "type": "boolean | undefined",
              "required": false,
              "defaultValue": "false"
            },
            {
              "name": "onExpandedChange",
              "type": "((expanded: boolean) => void) | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "NavPanelGroupContent",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "NavPanelGroupItem",
          "props": [
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "defaultValue": "false"
            },
            {
              "name": "icon",
              "type": "ComponentType<SvgIconProps> | undefined",
              "required": false
            },
            {
              "name": "active",
              "type": "boolean | undefined",
              "required": false,
              "defaultValue": "false"
            },
            {
              "name": "download",
              "type": "any",
              "required": false
            },
            {
              "name": "href",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "hrefLang",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "target",
              "type": "HTMLAttributeAnchorTarget | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "NavPanelGroupLabel",
          "props": [
            {
              "name": "icon",
              "type": "ComponentType<SvgIconProps> | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "NavPanelHeader",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "NavPanelItem",
          "props": [
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "defaultValue": "false"
            },
            {
              "name": "icon",
              "type": "ComponentType<SvgIconProps> | undefined",
              "required": false
            },
            {
              "name": "active",
              "type": "boolean | undefined",
              "required": false,
              "defaultValue": "false"
            },
            {
              "name": "download",
              "type": "any",
              "required": false
            },
            {
              "name": "href",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "hrefLang",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "target",
              "type": "HTMLAttributeAnchorTarget | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "NavPanelSectionHeader",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "NavPanelSkeleton",
          "props": [
            {
              "name": "count",
              "type": "number | undefined",
              "required": false,
              "defaultValue": "6"
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": []
    },
    {
      "name": "NavRail",
      "importPath": "@wallarm-org/design-system/NavRail",
      "props": [
        {
          "name": "mode",
          "type": "NavRailMode | undefined",
          "required": false,
          "description": "How the rail lays out its items: `expanded` (icon beside label), `collapsed` (icon only) or\n`compact` (icon over a short label). Wins over `collapsed` when both are set."
        },
        {
          "name": "collapsed",
          "type": "boolean | undefined",
          "required": false,
          "description": "Shorthand for `mode='collapsed'`, kept so existing hosts keep working. Prefer `mode`.",
          "defaultValue": "false"
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "mode",
          "options": [
            "expanded",
            "collapsed",
            "compact"
          ],
          "defaultValue": "expanded"
        },
        {
          "name": "active",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        },
        {
          "name": "avatar",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        }
      ],
      "subComponents": [
        {
          "name": "NavRailBody",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "NavRailFooter",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "NavRailItem",
          "props": [
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "defaultValue": "false"
            },
            {
              "name": "icon",
              "type": "ComponentType<SvgIconProps>",
              "required": true
            },
            {
              "name": "label",
              "type": "ReactNode",
              "required": true
            },
            {
              "name": "shortcut",
              "type": "string[] | undefined",
              "required": false
            },
            {
              "name": "active",
              "type": "boolean | undefined",
              "required": false,
              "defaultValue": "false"
            },
            {
              "name": "avatar",
              "type": "boolean | undefined",
              "required": false,
              "description": "Seats the icon on a soft plate, for the signed-in user's item at the foot of the rail.",
              "defaultValue": "false"
            },
            {
              "name": "avatarSrc",
              "type": "string | undefined",
              "required": false,
              "description": "User photo for the plate (implies `avatar`). The icon shows while it loads and if it fails."
            },
            {
              "name": "download",
              "type": "any",
              "required": false
            },
            {
              "name": "href",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "hrefLang",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "target",
              "type": "HTMLAttributeAnchorTarget | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "NavRailSeparator",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "NavRailSkeleton",
          "props": [
            {
              "name": "count",
              "type": "number | undefined",
              "required": false,
              "defaultValue": "4"
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": []
    },
    {
      "name": "NumberInput",
      "description": "A number the reader nudges rather than types from scratch — reach for `Input` when the figure is just data like a port or an ID, and `Slider` when the position matters more than the exact value. It starts at zero rather than empty, so pass `defaultValue` wherever a pre-filled zero would be mistaken for an answer.",
      "importPath": "@wallarm-org/design-system/NumberInput",
      "props": [
        {
          "name": "form",
          "type": "string | undefined",
          "required": false,
          "description": "The associate form of the input element."
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "pattern",
          "type": "string | undefined",
          "required": false,
          "description": "The pattern used to check the <input> element's value against"
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | undefined",
          "required": false,
          "description": "The initial value of the input when rendered.\nUse when you don't need to control the value of the input.",
          "defaultValue": "0"
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string",
          "required": false,
          "description": "The unique identifier of the machine."
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "inputMode",
          "type": "InputMode | undefined",
          "required": false,
          "description": "Hints at the type of data that might be entered by the user. It also determines\nthe type of keyboard shown to the user on mobile devices"
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "disabled",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the number input is disabled."
        },
        {
          "name": "name",
          "type": "string | undefined",
          "required": false,
          "description": "The name attribute of the number input. Useful for form submission."
        },
        {
          "name": "value",
          "type": "string | undefined",
          "required": false,
          "description": "The controlled value of the input"
        },
        {
          "name": "asChild",
          "type": "boolean | undefined",
          "required": false,
          "description": "Use the provided child element as the default rendered element, combining their props and behavior."
        },
        {
          "name": "ids",
          "type": "ElementIds | undefined",
          "required": false,
          "description": "The ids of the elements in the number input. Useful for composition."
        },
        {
          "name": "readOnly",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the number input is readonly"
        },
        {
          "name": "required",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the number input is required"
        },
        {
          "name": "onValueChange",
          "type": "complex",
          "required": false,
          "description": "Function invoked when the value changes"
        },
        {
          "name": "step",
          "type": "number | undefined",
          "required": false,
          "description": "The amount to increment or decrement the value by"
        },
        {
          "name": "max",
          "type": "number | undefined",
          "required": false,
          "description": "The maximum value of the number input"
        },
        {
          "name": "min",
          "type": "number | undefined",
          "required": false,
          "description": "The minimum value of the number input"
        },
        {
          "name": "translations",
          "type": "IntlTranslations | undefined",
          "required": false,
          "description": "Specifies the localized strings that identifies the accessibility elements and their states"
        },
        {
          "name": "largeStep",
          "type": "number | undefined",
          "required": false,
          "description": "The amount to increment or decrement the value by when the `Shift` key is held."
        },
        {
          "name": "smallStep",
          "type": "number | undefined",
          "required": false,
          "description": "The amount to increment or decrement the value by when the `Alt` key is held."
        },
        {
          "name": "allowMouseWheel",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether to allow mouse wheel to change the value"
        },
        {
          "name": "allowOverflow",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether to allow the value overflow the min/max range"
        },
        {
          "name": "clampValueOnBlur",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether to clamp the value when the input loses focus (blur)"
        },
        {
          "name": "focusInputOnChange",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether to focus input when the value changes"
        },
        {
          "name": "formatOptions",
          "type": "Intl.NumberFormatOptions | undefined",
          "required": false,
          "description": "The options to pass to the `Intl.NumberFormat` constructor"
        },
        {
          "name": "onValueInvalid",
          "type": "complex",
          "required": false,
          "description": "Function invoked when the value overflows or underflows the min/max range"
        },
        {
          "name": "onFocusChange",
          "type": "complex",
          "required": false,
          "description": "Function invoked when the number input is focused"
        },
        {
          "name": "onValueCommit",
          "type": "complex",
          "required": false,
          "description": "Function invoked when the value is committed (when the input is blurred or the Enter key is pressed)"
        },
        {
          "name": "spinOnPress",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether to spin the value when the increment/decrement button is pressed"
        },
        {
          "name": "locale",
          "type": "string | undefined",
          "required": false,
          "description": "The current locale. Based on the BCP 47 definition."
        },
        {
          "name": "size",
          "type": "{ default: string; medium: string; small: string; 'inline-edit': string; }",
          "required": false,
          "defaultValue": "default"
        },
        {
          "name": "error",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "size",
          "options": [
            "default",
            "medium",
            "small",
            "inline-edit"
          ],
          "defaultValue": "default"
        }
      ],
      "subComponents": [],
      "examples": [
        {
          "name": "Basic",
          "code": "import { NumberInput } from '@wallarm-org/design-system/NumberInput';\n\n<NumberInput />",
          "storyFile": "NumberInput/NumberInput.stories.tsx",
          "storyTitle": "Inputs/NumberInput",
          "description": "The field with its steppers, which are always drawn — there is no version without them, so\nthis control always invites adjustment even when the reader would rather type."
        },
        {
          "name": "Sizes",
          "code": "import { NumberInput } from '@wallarm-org/design-system/NumberInput';\nimport { HStack } from '@wallarm-org/design-system/Stack';\n\nexport const Sizes = () => (\n  <HStack gap={16} align='start'>\n    <NumberInput size='default' />\n    <NumberInput size='medium' />\n    <NumberInput size='small' />\n  </HStack>\n);",
          "storyFile": "NumberInput/NumberInput.stories.tsx",
          "storyTitle": "Inputs/NumberInput",
          "description": "The same height scale as `Input`, with the steppers shrinking to match rather than being\ndropped at the smaller sizes."
        },
        {
          "name": "Disabled",
          "code": "import { NumberInput } from '@wallarm-org/design-system/NumberInput';\n\n<NumberInput disabled />",
          "storyFile": "NumberInput/NumberInput.stories.tsx",
          "storyTitle": "Inputs/NumberInput",
          "description": "Field and steppers both out. Worth checking here that the value still reads clearly, since\na number nobody can change is often the number that matters."
        },
        {
          "name": "WithValue",
          "code": "import { NumberInput } from '@wallarm-org/design-system/NumberInput';\n\n<NumberInput value=\"999\" />",
          "storyFile": "NumberInput/NumberInput.stories.tsx",
          "storyTitle": "Inputs/NumberInput",
          "description": "A set value. Typing is allowed as well as stepping, and the value is clamped against `min`\nand `max` rather than refused as it is typed."
        },
        {
          "name": "WithError",
          "code": "import { NumberInput } from '@wallarm-org/design-system/NumberInput';\n\n<NumberInput error />",
          "storyFile": "NumberInput/NumberInput.stories.tsx",
          "storyTitle": "Inputs/NumberInput",
          "description": "`error` reddens the border and sets the invalid state; the reason belongs in `FieldError`\nbeneath it."
        }
      ]
    },
    {
      "name": "NumericBadge",
      "description": "A compact count, `!` / `?` glyph, or icon attached to a tab, button, menu item, or step.\n\n`type` sets the visual weight and `color` sets the meaning. Supported combinations:\n\n- `solid`: `brand`, `danger`\n- `secondary`: `neutral`, `neutral-alt`, `info`, `success`, `danger`, `brand`\n- `outline`: `neutral`, `success`, `danger`, `brand`\n\nThe default is `secondary` / `neutral`. With `type=\"solid\"`, the default color is `brand`.\n\n`size=\"default\"` corresponds to Medium (20px tall, 16px icon); `size=\"small\"` is 16px tall with a 12px icon. Pass content as children and give an icon-only badge an accessible name when it conveys meaning.\n\nHover and focus states apply to clickable badges. Use `asChild` with a native button or link when the badge is an action or navigation target.\n\nMigration from the removed flat `type` API:\n\n| Previous type | New type | New color |\n| --- | --- | --- |\n| `primary` | `secondary` | `neutral` |\n| `primary-alt` | `secondary` | `neutral-alt` |\n| `brand` | `solid` | `brand` |\n| `destructive` | `solid` | `danger` |\n| `outline` | `outline` | `neutral` |\n| `info` | `secondary` | `info` |",
      "importPath": "@wallarm-org/design-system/NumericBadge",
      "props": [
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "color",
          "type": "{ neutral: string; 'neutral-alt': string; brand: string; danger: string; success: string; info: string; }",
          "required": false,
          "defaultValue": "type === 'solid' ? 'brand' : 'neutral"
        },
        {
          "name": "type",
          "type": "{ solid: string; secondary: string; outline: string; }",
          "required": false,
          "defaultValue": "secondary"
        },
        {
          "name": "size",
          "type": "{ default: string; small: string; }",
          "required": false,
          "defaultValue": "default"
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "asChild",
          "type": "boolean | undefined",
          "required": false,
          "description": "Applies the badge to its child element, such as a span or a native button.",
          "defaultValue": "false"
        },
        {
          "name": "data-slot",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "type",
          "options": [
            "solid",
            "secondary",
            "outline"
          ]
        },
        {
          "name": "color",
          "options": [
            "neutral",
            "neutral-alt",
            "brand",
            "danger",
            "success",
            "info"
          ]
        },
        {
          "name": "size",
          "options": [
            "default",
            "small"
          ]
        },
        {
          "name": "iconOnly",
          "options": [
            "true"
          ]
        },
        {
          "name": "clickable",
          "options": [
            "true",
            "false"
          ]
        }
      ],
      "subComponents": [],
      "examples": [
        {
          "name": "Basic",
          "code": "import { NumericBadge } from '@wallarm-org/design-system/NumericBadge';\n\nexport const Basic = () => <NumericBadge>1</NumericBadge>;",
          "storyFile": "NumericBadge/NumericBadge.stories.tsx",
          "storyTitle": "Status Indication/NumericBadge",
          "description": "The default count. Keep it to what the reader can take in at a glance; a four-digit count is\na number they need to read, not see."
        },
        {
          "name": "Sizes",
          "code": "import { NumericBadge } from '@wallarm-org/design-system/NumericBadge';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Sizes = () => (\n  // One row per size, each holding its own label: parallel columns drift apart as soon as the\n  // label and the specimen have different heights.\n  <VStack gap={8} align='start'>\n    {(['small', 'default'] as const).map(size => (\n      <HStack key={size} gap={12} align='center'>\n        <NumericBadge size={size}>1</NumericBadge>\n      </HStack>\n    ))}\n  </VStack>\n);",
          "storyFile": "NumericBadge/NumericBadge.stories.tsx",
          "storyTitle": "Status Indication/NumericBadge",
          "description": "Two heights, chosen to sit inside the control they are attached to rather than beside it."
        },
        {
          "name": "Types",
          "code": "import { NumericBadge } from '@wallarm-org/design-system/NumericBadge';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Types = () => (\n  // One row per type, so the label always sits beside the badges it names.\n  <VStack gap={8} align='start'>\n    {combinations.map(({ type, color }) => (\n      <HStack key={`${type}-${color}`} gap={12} align='center'>\n        <div\n          className={`inline-flex items-center gap-12 p-8 ${color === 'neutral-alt' ? 'bg-component-tooltip-bg' : ''}`}\n        >\n          <NumericBadge type={type} color={color} size='default'>\n            1\n          </NumericBadge>\n          <NumericBadge type={type} color={color} size='small'>\n            1\n          </NumericBadge>\n        </div>\n      </HStack>\n    ))}\n  </VStack>\n);",
          "storyFile": "NumericBadge/NumericBadge.stories.tsx",
          "storyTitle": "Status Indication/NumericBadge",
          "description": "Every supported Type × Color combination, in Medium and Small."
        },
        {
          "name": "Content",
          "code": "import { Check } from '@wallarm-org/design-system/icons';\nimport { NumericBadge } from '@wallarm-org/design-system/NumericBadge';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Content = () => (\n  <VStack gap={16} align='start'>\n    {(['default', 'small'] as const).map(size => (\n      <HStack key={size} gap={12} align='center'>\n        <NumericBadge data-testid='numeric-badge' size={size}>\n          1\n        </NumericBadge>\n        <NumericBadge data-testid='numeric-badge' size={size}>\n          99\n        </NumericBadge>\n        <NumericBadge\n          data-testid='numeric-badge'\n          size={size}\n          color='danger'\n          aria-label='Needs attention'\n        >\n          !\n        </NumericBadge>\n        <NumericBadge data-testid='numeric-badge' size={size} color='info' aria-label='Unknown'>\n          ?\n        </NumericBadge>\n        <NumericBadge\n          data-testid='numeric-badge'\n          size={size}\n          color='success'\n          aria-label='Completed'\n        >\n          <Check />\n        </NumericBadge>\n      </HStack>\n    ))}\n  </VStack>\n);",
          "storyFile": "NumericBadge/NumericBadge.stories.tsx",
          "storyTitle": "Status Indication/NumericBadge",
          "description": "Numbers, short glyphs, and icons share the same badge heights."
        },
        {
          "name": "Clickable",
          "code": "import { useState } from 'react';\nimport { NumericBadge } from '@wallarm-org/design-system/NumericBadge';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Clickable = () => {\n  const [activations, setActivations] = useState(0);\n  return (\n    <VStack gap={12} align='start'>\n      {combinations.map(({ type, color }) => (\n        <HStack key={`${type}-${color}`} gap={12} align='center'>\n          <div className={color === 'neutral-alt' ? 'bg-component-tooltip-bg p-8' : 'p-8'}>\n            <NumericBadge\n              asChild\n              type={type}\n              color={color}\n              onClick={() => setActivations(count => count + 1)}\n            >\n              <button type='button' aria-label={`${type} ${color}`}>\n                1\n              </button>\n            </NumericBadge>\n          </div>\n        </HStack>\n      ))}\n      <output aria-label='Activations'>{activations}</output>\n    </VStack>\n  );\n};",
          "storyFile": "NumericBadge/NumericBadge.stories.tsx",
          "storyTitle": "Status Indication/NumericBadge",
          "description": "Use a native button for an action; Tab, Enter, and Space work as expected."
        }
      ]
    },
    {
      "name": "OverflowList",
      "description": "Lays a set of items out in one row and folds whatever will not fit into an overflow control — reach for `OverflowTooltip` instead when the thing overrunning is a single run of text rather than a set. By default the overflow is a `+N more` chip opening a popover of every item; compose it yourself from the `OverflowListMore` parts (`Trigger`, `Content`, `Header`, `Items`, `Count`), or pass any `overflowRenderer(hiddenItems, { allItems, visibleItems })` of your own. It re-measures whenever the container changes width.",
      "importPath": "@wallarm-org/design-system/OverflowList",
      "props": [
        {
          "name": "items",
          "type": "T[]",
          "required": true,
          "description": "Measurements are cached by array identity — keep it referentially stable."
        },
        {
          "name": "itemRenderer",
          "type": "(item: T, index: number) => ReactNode",
          "required": true
        },
        {
          "name": "overflowRenderer",
          "type": "OverflowListRenderer<T> | undefined",
          "required": false,
          "description": "Renders the overflow indicator. Also called once in the hidden measurement\nlayer with every item hidden, so it must be pure. Compose it from the\n`OverflowListMore` parts; defaults to `<OverflowListMore />`."
        },
        {
          "name": "minVisibleItems",
          "type": "number | undefined",
          "required": false,
          "description": "Keep at least this many items visible however narrow the row gets."
        },
        {
          "name": "onOverflow",
          "type": "((hiddenItems: T[]) => void) | undefined",
          "required": false
        },
        {
          "name": "collapseFrom",
          "type": "CollapseDirection | undefined",
          "required": false
        },
        {
          "name": "alwaysRenderOverflow",
          "type": "boolean | undefined",
          "required": false,
          "description": "Call `overflowRenderer` even when nothing is hidden. `OverflowListMore`\nitself renders nothing at zero hidden items."
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "dimmed",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        }
      ],
      "subComponents": [
        {
          "name": "OverflowListMore",
          "props": [
            {
              "name": "placement",
              "type": "\"trigger\" | \"cover\" | undefined",
              "required": false,
              "description": "`trigger` — the popover opens below the \"+N\" chip.\n`cover` — the popover opens over the row, from the list's left edge.",
              "defaultValue": "trigger"
            },
            {
              "name": "open",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "onOpenChange",
              "type": "((open: boolean) => void) | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "OverflowListMoreContent",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "minWidth",
              "type": "PopoverSizeDimension | undefined",
              "required": false
            },
            {
              "name": "maxWidth",
              "type": "PopoverSizeDimension | undefined",
              "required": false,
              "defaultValue": "360px"
            },
            {
              "name": "minHeight",
              "type": "PopoverSizeDimension | undefined",
              "required": false,
              "defaultValue": "auto"
            },
            {
              "name": "maxHeight",
              "type": "PopoverSizeDimension | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "OverflowListMoreCount",
          "props": [
            {
              "name": "of",
              "type": "\"hidden\" | \"total\" | undefined",
              "required": false,
              "description": "`hidden` — items folded into the overflow; `total` — every item.",
              "defaultValue": "hidden"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "OverflowListMoreHeader",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "align",
              "type": "{ left: string; center: string; right: string; }",
              "required": false
            },
            {
              "name": "inline",
              "type": "{ true: string; }",
              "required": false
            },
            {
              "name": "grow",
              "type": "{ true: string; }",
              "required": false
            },
            {
              "name": "truncate",
              "type": "{ true: string; false: string; }",
              "required": false
            },
            {
              "name": "decoration",
              "type": "{ dashed: string; }",
              "required": false
            },
            {
              "name": "lineHeight",
              "type": "{ none: string; tight: string; snug: string; normal: string; relaxed: string; }",
              "required": false
            },
            {
              "name": "textTransform",
              "type": "{ uppercase: string; lowercase: string; capitalize: string; none: string; }",
              "required": false
            },
            {
              "name": "lineClamp",
              "type": "number | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "OverflowListMoreItems",
          "props": [
            {
              "name": "show",
              "type": "\"hidden\" | \"all\" | undefined",
              "required": false,
              "description": "`all` lists every item (visible ones first); `hidden` only the folded ones.",
              "defaultValue": "all"
            },
            {
              "name": "dimVisible",
              "type": "boolean | undefined",
              "required": false,
              "description": "Fade the items that are already visible in the row. Only with `show='all'`.",
              "defaultValue": "true"
            },
            {
              "name": "renderItem",
              "type": "((item: T, index: number) => ReactNode) | undefined",
              "required": false,
              "description": "Item renderer for the popover. Defaults to the list's `itemRenderer`.\n`T` is not linked to the list's item type — annotate the parameter."
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "OverflowListMoreTrigger",
          "props": [
            {
              "name": "size",
              "type": "\"small\" | \"medium\" | \"large\" | null | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Basic",
          "code": "import { OverflowList } from '@wallarm-org/design-system/OverflowList';\nimport { Tag } from '@wallarm-org/design-system/Tag';\n\nexport const Basic = () => (\n  <div className='w-640'>\n    <OverflowList\n      className='gap-4'\n      items={TAGS}\n      itemRenderer={item => <Tag key={item}>{item}</Tag>}\n    />\n  </div>\n);",
          "storyFile": "OverflowList/OverflowList.stories.tsx",
          "storyTitle": "Data Display/OverflowList",
          "description": "All nine tags fit in 640px, so the overflow chip never appears."
        },
        {
          "name": "Collapsed",
          "code": "import { OverflowList } from '@wallarm-org/design-system/OverflowList';\nimport { Tag } from '@wallarm-org/design-system/Tag';\n\nexport const Collapsed = () => (\n  <div className='w-200'>\n    <OverflowList\n      className='gap-4'\n      items={TAGS}\n      itemRenderer={item => <Tag key={item}>{item}</Tag>}\n    />\n  </div>\n);",
          "storyFile": "OverflowList/OverflowList.stories.tsx",
          "storyTitle": "Data Display/OverflowList",
          "description": "The same nine in 200px: two survive and the `+N` takes the rest, which is the whole job."
        },
        {
          "name": "CollapseFromStart",
          "code": "import { OverflowList } from '@wallarm-org/design-system/OverflowList';\nimport { Tag } from '@wallarm-org/design-system/Tag';\n\nexport const CollapseFromStart = () => (\n  <div className='w-240'>\n    <OverflowList\n      className='gap-4'\n      collapseFrom='start'\n      items={TAGS}\n      itemRenderer={item => <Tag key={item}>{item}</Tag>}\n    />\n  </div>\n);",
          "storyFile": "OverflowList/OverflowList.stories.tsx",
          "storyTitle": "Data Display/OverflowList",
          "description": "`collapseFrom='start'` hides the beginning and keeps the end in view — for a path or a\nhistory where the most recent items are the ones that matter."
        },
        {
          "name": "MinVisibleItems",
          "code": "import { OverflowList } from '@wallarm-org/design-system/OverflowList';\nimport { Tag } from '@wallarm-org/design-system/Tag';\n\nexport const MinVisibleItems = () => (\n  <div className='w-160 overflow-hidden rounded-2 border border-border-primary p-12'>\n    <OverflowList\n      className='gap-4'\n      minVisibleItems={1}\n      items={TAGS}\n      itemRenderer={item => <Tag key={item}>{item}</Tag>}\n    />\n  </div>\n);",
          "storyFile": "OverflowList/OverflowList.stories.tsx",
          "storyTitle": "Data Display/OverflowList",
          "description": "`minVisibleItems` puts a floor under the measurement: however tight the column gets,\nthat many items stay and the rest go to the `+N` rather than the row emptying out."
        },
        {
          "name": "ResizableContainer",
          "code": "import { OverflowList } from '@wallarm-org/design-system/OverflowList';\nimport { Tag } from '@wallarm-org/design-system/Tag';\n\nexport const ResizableContainer = () => (\n  <div\n    data-testid='resizable-wrapper'\n    className='overflow-hidden rounded-2 border border-border-primary p-12'\n    style={{ width: 500, minWidth: 80, maxWidth: 800, resize: 'horizontal' }}\n  >\n    <OverflowList\n      className='gap-4'\n      data-testid='tags'\n      items={TAGS}\n      itemRenderer={item => <Tag key={item}>{item}</Tag>}\n    />\n  </div>\n);",
          "storyFile": "OverflowList/OverflowList.stories.tsx",
          "storyTitle": "Data Display/OverflowList",
          "description": "Drag the box's right edge: the split is re-measured as the width changes rather than at\nbreakpoints, which is what makes it safe inside a resizable panel."
        },
        {
          "name": "WithHeader",
          "code": "import { OverflowList, OverflowListMore, OverflowListMoreContent, OverflowListMoreCount, OverflowListMoreHeader, OverflowListMoreItems, OverflowListMoreTrigger } from '@wallarm-org/design-system/OverflowList';\nimport { Tag } from '@wallarm-org/design-system/Tag';\n\nexport const WithHeader = () => (\n  <div className='w-120'>\n    <OverflowList\n      className='gap-4'\n      data-testid='attacks'\n      items={ATTACK_TYPES}\n      itemRenderer={item => <Tag key={item}>{item}</Tag>}\n      overflowRenderer={() => (\n        <OverflowListMore>\n          <OverflowListMoreTrigger />\n          <OverflowListMoreContent>\n            <OverflowListMoreHeader>\n              <OverflowListMoreCount of='total' /> attack types\n            </OverflowListMoreHeader>\n            <OverflowListMoreItems />\n          </OverflowListMoreContent>\n        </OverflowListMore>\n      )}\n    />\n  </div>\n);",
          "storyFile": "OverflowList/OverflowList.stories.tsx",
          "storyTitle": "Data Display/OverflowList",
          "description": "The full composition: a header counting every item over the popover list, built from\n`OverflowListMoreHeader` and `OverflowListMoreCount` in plain JSX. Items already in the\nrow are listed first and faded."
        },
        {
          "name": "HiddenOnly",
          "code": "import { OverflowList, OverflowListMore, OverflowListMoreContent, OverflowListMoreCount, OverflowListMoreItems, OverflowListMoreTrigger } from '@wallarm-org/design-system/OverflowList';\nimport { Tag } from '@wallarm-org/design-system/Tag';\n\nexport const HiddenOnly = () => (\n  <div className='w-120'>\n    <OverflowList\n      className='gap-4'\n      data-testid='attacks'\n      items={ATTACK_TYPES}\n      itemRenderer={item => <Tag key={item}>{item}</Tag>}\n      overflowRenderer={() => (\n        <OverflowListMore>\n          <OverflowListMoreTrigger>\n            +<OverflowListMoreCount />\n          </OverflowListMoreTrigger>\n          <OverflowListMoreContent>\n            <OverflowListMoreItems show='hidden' />\n          </OverflowListMoreContent>\n        </OverflowListMore>\n      )}\n    />\n  </div>\n);",
          "storyFile": "OverflowList/OverflowList.stories.tsx",
          "storyTitle": "Data Display/OverflowList",
          "description": "`show='hidden'` lists only what the row folded away — the pattern for editable\ncontexts such as a multi-select input, where the visible chips are right there."
        },
        {
          "name": "CoverPlacement",
          "code": "import { OverflowList, OverflowListMore } from '@wallarm-org/design-system/OverflowList';\nimport { Tag } from '@wallarm-org/design-system/Tag';\n\nexport const CoverPlacement = () => (\n  <div className='w-120'>\n    <OverflowList\n      className='gap-4'\n      data-testid='attacks'\n      items={ATTACK_TYPES}\n      itemRenderer={item => <Tag key={item}>{item}</Tag>}\n      overflowRenderer={() => <OverflowListMore placement='cover' />}\n    />\n  </div>\n);",
          "storyFile": "OverflowList/OverflowList.stories.tsx",
          "storyTitle": "Data Display/OverflowList",
          "description": "`placement='cover'` opens the popover over the row itself, from its left edge."
        },
        {
          "name": "PluralizedHeader",
          "code": "import { OverflowList, OverflowListMore, OverflowListMoreContent, OverflowListMoreItems, OverflowListMoreTrigger } from '@wallarm-org/design-system/OverflowList';\nimport { Tag } from '@wallarm-org/design-system/Tag';\n\nexport const PluralizedHeader = () => (\n  <div className='w-120'>\n    <OverflowList\n      className='gap-4'\n      items={ATTACK_TYPES}\n      itemRenderer={item => <Tag key={item}>{item}</Tag>}\n      overflowRenderer={() => (\n        <OverflowListMore>\n          <OverflowListMoreTrigger />\n          <OverflowListMoreContent>\n            <PluralHeader />\n            <OverflowListMoreItems />\n          </OverflowListMoreContent>\n        </OverflowListMore>\n      )}\n    />\n  </div>\n);",
          "storyFile": "OverflowList/OverflowList.stories.tsx",
          "storyTitle": "Data Display/OverflowList",
          "description": "When the header needs the number as a value — pluralization, i18n — read it with\n`useOverflowListMore()` inside your own component instead of `OverflowListMoreCount`."
        },
        {
          "name": "CustomRenderer",
          "code": "import { OverflowList } from '@wallarm-org/design-system/OverflowList';\nimport { Tag } from '@wallarm-org/design-system/Tag';\n\nexport const CustomRenderer = () => (\n  <div className='w-120'>\n    <OverflowList\n      className='gap-4'\n      items={ATTACK_TYPES}\n      itemRenderer={item => <Tag key={item}>{item}</Tag>}\n      overflowRenderer={hidden => <Tag>and {hidden.length} others</Tag>}\n    />\n  </div>\n);",
          "storyFile": "OverflowList/OverflowList.stories.tsx",
          "storyTitle": "Data Display/OverflowList",
          "description": "`overflowRenderer` is just a function of the hidden items — anything goes, no popover\nrequired."
        }
      ]
    },
    {
      "name": "OverflowTooltip",
      "description": "Shows the full value only when it is actually truncated, so a reader who can already see the text is not given a tooltip that repeats it. It finds the truncating element itself, so wrap the content rather than pointing it at a node.",
      "importPath": "@wallarm-org/design-system/OverflowTooltip",
      "props": [
        {
          "name": "forceTooltip",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "positioning",
          "type": "PositioningOptions | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [
        {
          "name": "OverflowTooltipContent",
          "props": [
            {
              "name": "maxWidth",
              "type": "number | undefined",
              "required": false,
              "defaultValue": "400"
            }
          ]
        },
        {
          "name": "OverflowTooltipTrigger",
          "props": [
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "defaultValue": "true"
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "AutoDetection",
          "code": "import { OverflowTooltip, OverflowTooltipContent, OverflowTooltipTrigger } from '@wallarm-org/design-system/OverflowTooltip';\n\nexport const AutoDetection = () => {\n  return (\n    <div className='font-sans flex flex-col gap-16 w-300'>\n      <div>\n        <OverflowTooltip>\n          <OverflowTooltipTrigger>\n            <div className='truncate'>Short text</div>\n          </OverflowTooltipTrigger>\n          <OverflowTooltipContent>\n            This won't show because text isn't overflowing\n          </OverflowTooltipContent>\n        </OverflowTooltip>\n      </div>\n      <div>\n        <OverflowTooltip>\n          <OverflowTooltipTrigger>\n            <div className='truncate'>\n              This is a very long text that will be truncated and automatically show a tooltip when\n              hovered\n            </div>\n          </OverflowTooltipTrigger>\n          <OverflowTooltipContent>\n            This is a very long text that will be truncated and automatically show a tooltip when\n            hovered\n          </OverflowTooltipContent>\n        </OverflowTooltip>\n      </div>\n    </div>\n  );\n};",
          "storyFile": "OverflowTooltip/OverflowTooltip.stories.tsx",
          "storyTitle": "Overlay/OverflowTooltip",
          "description": "A single truncated line. The tooltip appears only when the text is cut — resize the frame and\nit stops offering one."
        },
        {
          "name": "MultiLineAutoDetection",
          "code": "import { OverflowTooltip, OverflowTooltipContent, OverflowTooltipTrigger } from '@wallarm-org/design-system/OverflowTooltip';\n\nexport const MultiLineAutoDetection = () => {\n  const longText =\n    'This is a very long text that demonstrates multi-line truncation. It keeps going and going to show how the component handles text that exceeds multiple lines. The tooltip will appear when you hover over the truncated content. And it continues even more to ensure we have enough content for demonstration purposes.';\n  return (\n    <div className='font-sans flex flex-col gap-16 w-300'>\n      <div>\n        <OverflowTooltip>\n          <OverflowTooltipTrigger>\n            <div className='line-clamp-2'>{longText}</div>\n          </OverflowTooltipTrigger>\n          <OverflowTooltipContent>{longText}</OverflowTooltipContent>\n        </OverflowTooltip>\n      </div>\n      <div>\n        <OverflowTooltip>\n          <OverflowTooltipTrigger>\n            <div className='line-clamp-3'>{longText}</div>\n          </OverflowTooltipTrigger>\n          <OverflowTooltipContent>{longText}</OverflowTooltipContent>\n        </OverflowTooltip>\n      </div>\n      <div>\n        <OverflowTooltip>\n          <OverflowTooltipTrigger>\n            <div className='line-clamp-4'>{longText}</div>\n          </OverflowTooltipTrigger>\n          <OverflowTooltipContent>{longText}</OverflowTooltipContent>\n        </OverflowTooltip>\n      </div>\n    </div>\n  );\n};",
          "storyFile": "OverflowTooltip/OverflowTooltip.stories.tsx",
          "storyTitle": "Overlay/OverflowTooltip",
          "description": "The same with `line-clamp`, where truncation happens at the block rather than the line."
        },
        {
          "name": "NestedElements",
          "code": "import { OverflowTooltip, OverflowTooltipContent, OverflowTooltipTrigger } from '@wallarm-org/design-system/OverflowTooltip';\n\nexport const NestedElements = () => {\n  return (\n    <div className='font-sans flex flex-col gap-16 w-300'>\n      <div>\n        <OverflowTooltip>\n          <OverflowTooltipTrigger>\n            <div className='border p-4'>\n              <h3 className='font-bold mb-2'>Card Title</h3>\n              <p className='truncate'>\n                This is a nested element with truncate that will be automatically detected for\n                overflow\n              </p>\n            </div>\n          </OverflowTooltipTrigger>\n          <OverflowTooltipContent>\n            This is a nested element with truncate that will be automatically detected for overflow\n          </OverflowTooltipContent>\n        </OverflowTooltip>\n      </div>\n      <div>\n        <OverflowTooltip>\n          <OverflowTooltipTrigger>\n            <div className='border p-4'>\n              <h3 className='font-bold mb-2 truncate'>\n                This is a very long title that might be truncated\n              </h3>\n              <p className='line-clamp-2'>\n                And this is a description that can span multiple lines but will be clamped to just\n                two lines. The component will detect if either of these elements overflow.\n              </p>\n            </div>\n          </OverflowTooltipTrigger>\n          <OverflowTooltipContent>\n            <div>\n              <strong>Title:</strong> This is a very long title that might be truncated\n              <br />\n              <strong>Description:</strong> And this is a description that can span multiple lines\n              but will be clamped to just two lines. The component will detect if either of these\n              elements overflow.\n            </div>\n          </OverflowTooltipContent>\n        </OverflowTooltip>\n      </div>\n    </div>\n  );\n};",
          "storyFile": "OverflowTooltip/OverflowTooltip.stories.tsx",
          "storyTitle": "Overlay/OverflowTooltip",
          "description": "The truncating element is somewhere inside the children, which is the usual case — it is\nfound rather than declared."
        },
        {
          "name": "CustomTooltipContent",
          "code": "import { OverflowTooltip, OverflowTooltipContent, OverflowTooltipTrigger } from '@wallarm-org/design-system/OverflowTooltip';\n\nexport const CustomTooltipContent = () => {\n  return (\n    <div className='font-sans flex flex-col gap-16 w-300'>\n      <div>\n        <OverflowTooltip>\n          <OverflowTooltipTrigger>\n            <div className='truncate'>\n              /api/v1/users/1234567890/sessions/abc-def-ghi-jkl-mno/tokens/refresh\n            </div>\n          </OverflowTooltipTrigger>\n          <OverflowTooltipContent>\n            <div className='flex flex-col gap-2'>\n              <div className='font-medium text-sm'>API Endpoint</div>\n              <code className='rounded-6 bg-component-kbi-tooltip-bg px-4 py-2 font-mono text-text-primary-alt text-xs'>\n                /api/v1/users/1234567890/sessions/abc-def-ghi-jkl-mno/tokens/refresh\n              </code>\n              <div className='text-xs text-text-secondary-alt'>\n                Method: POST\n                <br />\n                Auth: Bearer Token\n              </div>\n            </div>\n          </OverflowTooltipContent>\n        </OverflowTooltip>\n      </div>\n      <div>\n        <OverflowTooltip>\n          <OverflowTooltipTrigger>\n            <div className='truncate'>\n              user@example.com - Administrator - Last login: 2024-01-15\n            </div>\n          </OverflowTooltipTrigger>\n          <OverflowTooltipContent>\n            <div className='grid grid-cols-2 gap-2 text-sm'>\n              <span className='font-medium'>Email:</span>\n              <span>user@example.com</span>\n              <span className='font-medium'>Role:</span>\n              <span>Administrator</span>\n              <span className='font-medium'>Last Login:</span>\n              <span>2024-01-15</span>\n            </div>\n          </OverflowTooltipContent>\n        </OverflowTooltip>\n      </div>\n    </div>\n  );\n};",
          "storyFile": "OverflowTooltip/OverflowTooltip.stories.tsx",
          "storyTitle": "Overlay/OverflowTooltip",
          "description": "Overriding the content, for when the full value needs formatting the truncated one does not\nhave."
        },
        {
          "name": "ForceTooltip",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { OverflowTooltip, OverflowTooltipContent, OverflowTooltipTrigger } from '@wallarm-org/design-system/OverflowTooltip';\n\nexport const ForceTooltip = () => {\n  return (\n    <div className='font-sans flex flex-col gap-16 w-300'>\n      <div>\n        <OverflowTooltip forceTooltip>\n          <OverflowTooltipTrigger>\n            <div className='truncate w-fit'>Short text</div>\n          </OverflowTooltipTrigger>\n          <OverflowTooltipContent>\n            This tooltip is forced to show even though the text isn't truncated\n          </OverflowTooltipContent>\n        </OverflowTooltip>\n      </div>\n      <div>\n        <OverflowTooltip forceTooltip>\n          <OverflowTooltipTrigger>\n            <Button variant='outline' color='neutral'>\n              Click for info\n            </Button>\n          </OverflowTooltipTrigger>\n          <OverflowTooltipContent>\n            <div className='flex flex-col gap-2'>\n              <strong>Additional Information</strong>\n              <span className='text-sm'>\n                This tooltip provides extra context even when the trigger element doesn't have\n                overflow.\n              </span>\n            </div>\n          </OverflowTooltipContent>\n        </OverflowTooltip>\n      </div>\n    </div>\n  );\n};",
          "storyFile": "OverflowTooltip/OverflowTooltip.stories.tsx",
          "storyTitle": "Overlay/OverflowTooltip",
          "description": "Forcing it on regardless of truncation. Reach for a plain `Tooltip` instead if the answer is\nalways yes — this prop exists for the case that switches."
        },
        {
          "name": "DifferentSides",
          "code": "import { OverflowTooltip, OverflowTooltipContent, OverflowTooltipTrigger } from '@wallarm-org/design-system/OverflowTooltip';\n\nexport const DifferentSides = () => {\n  const text = 'This is a text that will be truncated and show tooltips on different sides';\n  return (\n    <div className='font-sans flex flex-col gap-32 w-300 py-32'>\n      <div>\n        <OverflowTooltip positioning={{ placement: 'top' }}>\n          <OverflowTooltipTrigger>\n            <div className='truncate'>{text}</div>\n          </OverflowTooltipTrigger>\n          <OverflowTooltipContent>{text}</OverflowTooltipContent>\n        </OverflowTooltip>\n      </div>\n      <div>\n        <OverflowTooltip positioning={{ placement: 'bottom' }}>\n          <OverflowTooltipTrigger>\n            <div className='truncate'>{text}</div>\n          </OverflowTooltipTrigger>\n          <OverflowTooltipContent>{text}</OverflowTooltipContent>\n        </OverflowTooltip>\n      </div>\n      <div>\n        <OverflowTooltip positioning={{ placement: 'left' }}>\n          <OverflowTooltipTrigger>\n            <div className='truncate'>{text}</div>\n          </OverflowTooltipTrigger>\n          <OverflowTooltipContent>{text}</OverflowTooltipContent>\n        </OverflowTooltip>\n      </div>\n      <div>\n        <OverflowTooltip positioning={{ placement: 'right' }}>\n          <OverflowTooltipTrigger>\n            <div className='truncate'>{text}</div>\n          </OverflowTooltipTrigger>\n          <OverflowTooltipContent>{text}</OverflowTooltipContent>\n        </OverflowTooltip>\n      </div>\n    </div>\n  );\n};",
          "storyFile": "OverflowTooltip/OverflowTooltip.stories.tsx",
          "storyTitle": "Overlay/OverflowTooltip",
          "description": "Placement around the trigger. In a table, keep it off the side the reader is scanning."
        },
        {
          "name": "DynamicContent",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { OverflowTooltip, OverflowTooltipContent, OverflowTooltipTrigger } from '@wallarm-org/design-system/OverflowTooltip';\n\nexport const DynamicContent = () => {\n  const [text, setText] = useState('Click the button to change this text');\n\n  return (\n    <div className='font-sans flex flex-col gap-16 w-300'>\n      <div>\n        <OverflowTooltip>\n          <OverflowTooltipTrigger>\n            <div className='truncate'>{text}</div>\n          </OverflowTooltipTrigger>\n          <OverflowTooltipContent>{text}</OverflowTooltipContent>\n        </OverflowTooltip>\n      </div>\n\n      <Button\n        variant='outline'\n        color='neutral'\n        onClick={() => {\n          const texts = [\n            'Short text',\n            'This is a medium length text that might overflow',\n            'This is a very long text that will definitely overflow and show a tooltip when you hover over it',\n            'Another short one',\n            'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt',\n          ];\n          setText(texts[Math.floor(Math.random() * texts.length)] ?? 'Short text');\n        }}\n      >\n        Change Text\n      </Button>\n    </div>\n  );\n};",
          "storyFile": "OverflowTooltip/OverflowTooltip.stories.tsx",
          "storyTitle": "Overlay/OverflowTooltip",
          "description": "Content that changes after mount. The measurement is re-taken rather than cached from first\nrender, so text that grows past its box gains a tooltip without being remounted."
        }
      ]
    },
    {
      "name": "Overlay",
      "description": "The house scrim — a fixed, dimmed, lightly blurred layer that mutes the page behind an elevated surface. `Dialog`, `Drawer` and `Tour` render it for you, so reach for those; a popover, tooltip or dropdown is non-modal and takes no scrim at all. It is presentation only: no focus trap, no click-to-dismiss, no scroll lock, and no `className`.",
      "importPath": "@wallarm-org/design-system/Overlay",
      "props": [
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Overlay } from '@wallarm-org/design-system/Overlay';\n\nexport const Basic = () => <Overlay />;",
          "storyFile": "Overlay/Overlay.stories.tsx",
          "storyTitle": "Primitives/Overlay",
          "description": "The scrim over a page of text, which is the whole of what it does. Its fade keys off a `data-state` the parent sets, so on its own it just sits there — the behaviour comes from the headless backdrop you wrap it in."
        }
      ]
    },
    {
      "name": "Page",
      "description": "The frame a microfrontend page renders into — a header carrying the title and its actions, then the content below. It tells the host shell how it wants to be laid out (`fullSize`, `fixedHeight`) through context and falls back to sensible behaviour when there is no host, so the same page works inside the console and on its own.",
      "importPath": "@wallarm-org/design-system/Page",
      "props": [
        {
          "name": "name",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "fullSize",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "fixedHeight",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "contained",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "active",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        }
      ],
      "subComponents": [
        {
          "name": "PageActions",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "PageContent",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "PageDescription",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "PageHeader",
          "props": [
            {
              "name": "sticky",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "PageHeaderGroup",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "PageTitle",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "PageToolbar",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Badge } from '@wallarm-org/design-system/Badge';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Page, PageActions, PageContent, PageHeader, PageTitle } from '@wallarm-org/design-system/Page';\n\nexport const Basic = () => {\n  return (\n    <Page name='full-featured' fullSize fixedHeight>\n      <PageHeader>\n        <PageTitle>Page title</PageTitle>\n\n        <Badge>1000</Badge>\n\n        <PageActions>\n          <Button variant='secondary' color='neutral' size='small'>\n            Export\n          </Button>\n          <Button size='small'>Settings</Button>\n        </PageActions>\n      </PageHeader>\n\n      <PageContent>\n        <p>Full-featured page with header actions, tabs (including disabled), and content area.</p>\n      </PageContent>\n    </Page>\n  );\n};",
          "storyFile": "Page/Page.stories.tsx",
          "storyTitle": "Layout/Page",
          "description": "The whole frame: `PageTitle` with a count beside it, `PageActions` on the right, `PageContent` below, asking the shell for the full width and a fixed height."
        },
        {
          "name": "StickyHeader",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Page, PageActions, PageContent, PageHeader, PageTitle } from '@wallarm-org/design-system/Page';\n\nexport const StickyHeader = () => {\n  return (\n    <Page name='sticky-header' contained>\n      <PageHeader sticky>\n        <PageTitle>Sticky header</PageTitle>\n\n        <PageActions>\n          <Button variant='secondary' color='neutral' size='small'>\n            Export\n          </Button>\n          <Button size='small'>Settings</Button>\n        </PageActions>\n      </PageHeader>\n\n      <PageContent>\n        {Array.from({ length: 40 }, (_, i) => (\n          <p key={`row-${i + 1}`} className='py-8'>\n            Content row {i + 1}\n          </p>\n        ))}\n      </PageContent>\n    </Page>\n  );\n};",
          "storyFile": "Page/Page.stories.tsx",
          "storyTitle": "Layout/Page",
          "description": "`contained` gives the page its own scroll container, which is what lets `PageHeader sticky` stick. Without it the shell does the scrolling and the header leaves with the content."
        },
        {
          "name": "WithDescriptionAndToolbar",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { NumericBadge } from '@wallarm-org/design-system/NumericBadge';\nimport { Page, PageActions, PageContent, PageDescription, PageHeader, PageHeaderGroup, PageTitle, PageToolbar } from '@wallarm-org/design-system/Page';\nimport { SearchInput } from '@wallarm-org/design-system/SearchInput';\nimport { SegmentedTabs, SegmentedTabsList, SegmentedTabsTrigger } from '@wallarm-org/design-system/SegmentedTabs';\n\nexport const WithDescriptionAndToolbar = () => {\n  const [search, setSearch] = useState('');\n\n  return (\n    <Page name='with-description-and-toolbar' fixedHeight>\n      <PageHeader>\n        <PageHeaderGroup>\n          <PageTitle>Service accounts</PageTitle>\n          <PageDescription>\n            Identities for automation and API access — they sign in with keys or tokens instead of a\n            password.\n          </PageDescription>\n        </PageHeaderGroup>\n\n        <PageActions>\n          <Button size='medium'>Create service account</Button>\n        </PageActions>\n      </PageHeader>\n\n      <PageToolbar>\n        <SearchInput\n          value={search}\n          onChange={setSearch}\n          placeholder='Search name'\n          className='w-[320px]'\n        />\n        <SegmentedTabs defaultValue='all'>\n          <SegmentedTabsList>\n            <SegmentedTabsTrigger value='all'>\n              All <NumericBadge>2</NumericBadge>\n            </SegmentedTabsTrigger>\n            <SegmentedTabsTrigger value='active'>\n              Active <NumericBadge>1</NumericBadge>\n            </SegmentedTabsTrigger>\n            <SegmentedTabsTrigger value='deactivated'>\n              Deactivated <NumericBadge>1</NumericBadge>\n            </SegmentedTabsTrigger>\n          </SegmentedTabsList>\n        </SegmentedTabs>\n      </PageToolbar>\n\n      <PageContent>\n        <p>Table goes here.</p>\n      </PageContent>\n    </Page>\n  );\n};",
          "storyFile": "Page/Page.stories.tsx",
          "storyTitle": "Layout/Page",
          "description": "`PageHeaderGroup` stacks the title over a `PageDescription`; `PageToolbar` adds a filter row between the header and the content."
        }
      ]
    },
    {
      "name": "Pagination",
      "description": "Page-through navigation for a bounded set — previous and next, numbered pages with automatic ellipsis, and an optional rows-per-page selector. Infinite scroll is the house default for long data, so this is the deliberate alternative: reach for it when knowing and controlling your position genuinely helps — jumping to a page, coming back to page two, choosing a page size. “Lots of rows” on its own is not the cue. It is compound, so render only the parts you want, in the order you want.",
      "importPath": "@wallarm-org/design-system/Pagination",
      "props": [
        {
          "name": "count",
          "type": "number | undefined",
          "required": false,
          "description": "Total number of data items (Ark `count`)."
        },
        {
          "name": "page",
          "type": "number | undefined",
          "required": false,
          "description": "Controlled current page (1-based)."
        },
        {
          "name": "defaultPage",
          "type": "number | undefined",
          "required": false,
          "description": "Uncontrolled initial page."
        },
        {
          "name": "pageSize",
          "type": "number | undefined",
          "required": false,
          "description": "Controlled items-per-page."
        },
        {
          "name": "defaultPageSize",
          "type": "number | undefined",
          "required": false,
          "description": "Uncontrolled initial items-per-page."
        },
        {
          "name": "siblingCount",
          "type": "number | undefined",
          "required": false,
          "description": "Pages shown beside the active page."
        },
        {
          "name": "boundaryCount",
          "type": "number | undefined",
          "required": false,
          "description": "Pages shown at the start/end."
        },
        {
          "name": "onPageChange",
          "type": "((details: PaginationPageChangeDetails) => void) | undefined",
          "required": false
        },
        {
          "name": "onPageSizeChange",
          "type": "((details: PaginationPageSizeChangeDetails) => void) | undefined",
          "required": false
        },
        {
          "name": "type",
          "type": "\"button\" | \"link\" | undefined",
          "required": false,
          "description": "Trigger element type."
        },
        {
          "name": "getPageUrl",
          "type": "((details: PaginationPageChangeDetails) => string) | undefined",
          "required": false
        },
        {
          "name": "size",
          "type": "PaginationSize | undefined",
          "required": false,
          "description": "Visual size.",
          "defaultValue": "medium"
        },
        {
          "name": "align",
          "type": "PaginationAlign | undefined",
          "required": false,
          "description": "Horizontal alignment of the row.",
          "defaultValue": "left"
        },
        {
          "name": "aria-label",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "align",
          "options": [
            "left",
            "center",
            "right"
          ],
          "defaultValue": "left"
        },
        {
          "name": "size",
          "options": [
            "medium",
            "small"
          ],
          "defaultValue": "medium"
        }
      ],
      "subComponents": [
        {
          "name": "PaginationEllipsis",
          "props": [
            {
              "name": "index",
              "type": "number",
              "required": true,
              "description": "Index of this ellipsis within the pages array (required by Ark)."
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "PaginationItem",
          "props": [
            {
              "name": "value",
              "type": "number",
              "required": true,
              "description": "1-based page number."
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "PaginationList",
          "props": []
        },
        {
          "name": "PaginationNext",
          "props": [
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "PaginationPageSize",
          "props": [
            {
              "name": "options",
              "type": "number[]",
              "required": true,
              "description": "Selectable items-per-page values."
            },
            {
              "name": "label",
              "type": "string | undefined",
              "required": false,
              "description": "Leading label.",
              "defaultValue": "PAGINATION_PAGE_SIZE_LABEL"
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "PaginationPrevious",
          "props": [
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Full",
          "code": "import { Pagination, PaginationList, PaginationNext, PaginationPrevious } from '@wallarm-org/design-system/Pagination';\n\nexport const Full = () => (\n  <Pagination count={120} pageSize={10} defaultPage={2} align='center' aria-label='Search results'>\n    <PaginationPrevious />\n    <PaginationList />\n    <PaginationNext />\n  </Pagination>\n);",
          "storyFile": "Pagination/Pagination.stories.tsx",
          "storyTitle": "Navigation/Pagination",
          "description": "The complete set — previous, the numbered list, next — which is what most collections want."
        },
        {
          "name": "Simple",
          "code": "import { Pagination, PaginationList } from '@wallarm-org/design-system/Pagination';\n\nexport const Simple = () => (\n  <Pagination count={120} pageSize={10} defaultPage={2} align='center'>\n    <PaginationList />\n  </Pagination>\n);",
          "storyFile": "Pagination/Pagination.stories.tsx",
          "storyTitle": "Navigation/Pagination",
          "description": "Numbers only. Fine where the reader is scanning to a known page rather than stepping through."
        },
        {
          "name": "LinksOnly",
          "code": "import { Pagination, PaginationNext, PaginationPrevious } from '@wallarm-org/design-system/Pagination';\n\nexport const LinksOnly = () => (\n  <Pagination count={120} pageSize={10} defaultPage={2} align='center'>\n    <PaginationPrevious />\n    <PaginationNext />\n  </Pagination>\n);",
          "storyFile": "Pagination/Pagination.stories.tsx",
          "storyTitle": "Navigation/Pagination",
          "description": "Previous and next with no numbers, for a set whose page count means nothing to the reader."
        },
        {
          "name": "WithPageSize",
          "code": "import { Pagination, PaginationList, PaginationNext, PaginationPageSize, PaginationPrevious } from '@wallarm-org/design-system/Pagination';\n\nexport const WithPageSize = () => (\n  <Pagination count={120} defaultPageSize={25} defaultPage={2} align='right'>\n    <PaginationPageSize options={[10, 25, 50]} />\n    <PaginationPrevious />\n    <PaginationList />\n    <PaginationNext />\n  </Pagination>\n);",
          "storyFile": "Pagination/Pagination.stories.tsx",
          "storyTitle": "Navigation/Pagination",
          "description": "`PaginationPageSize` puts rows-per-page in the same row. Offering it is the strongest reason to choose pagination over infinite scroll."
        },
        {
          "name": "Sizes",
          "code": "import { Pagination, PaginationList, PaginationNext, PaginationPrevious } from '@wallarm-org/design-system/Pagination';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Sizes = () => (\n  <VStack gap={24}>\n    <Pagination count={120} pageSize={10} defaultPage={2} size='medium' align='center'>\n      <PaginationPrevious />\n      <PaginationList />\n      <PaginationNext />\n    </Pagination>\n    <Pagination count={120} pageSize={10} defaultPage={2} size='small' align='center'>\n      <PaginationPrevious />\n      <PaginationList />\n      <PaginationNext />\n    </Pagination>\n  </VStack>\n);",
          "storyFile": "Pagination/Pagination.stories.tsx",
          "storyTitle": "Navigation/Pagination",
          "description": "`medium` and `small`. Small is the one to use in a `Table` footer, where the pager should not outweigh the data."
        },
        {
          "name": "Alignment",
          "code": "import { Pagination, PaginationList } from '@wallarm-org/design-system/Pagination';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Alignment = () => (\n  <VStack gap={24} className='w-600'>\n    {(['left', 'center', 'right'] as const).map(align => (\n      <Pagination key={align} count={120} pageSize={10} defaultPage={2} align={align}>\n        <PaginationList />\n      </Pagination>\n    ))}\n  </VStack>\n);",
          "storyFile": "Pagination/Pagination.stories.tsx",
          "storyTitle": "Navigation/Pagination",
          "description": "`align` places the row left, centre or right — right for a table footer, centre for a standalone list."
        },
        {
          "name": "ManyPages",
          "code": "import { Pagination, PaginationList, PaginationNext, PaginationPrevious } from '@wallarm-org/design-system/Pagination';\n\nexport const ManyPages = () => (\n  <Pagination\n    count={500}\n    pageSize={10}\n    defaultPage={6}\n    siblingCount={1}\n    boundaryCount={1}\n    align='center'\n  >\n    <PaginationPrevious />\n    <PaginationList />\n    <PaginationNext />\n  </Pagination>\n);",
          "storyFile": "Pagination/Pagination.stories.tsx",
          "storyTitle": "Navigation/Pagination",
          "description": "`siblingCount` and `boundaryCount` decide how much of a 50-page set stays visible; the ellipsis is inserted for you."
        },
        {
          "name": "Playground",
          "code": "import { useState } from 'react';\nimport { Pagination, PaginationList, PaginationNext, PaginationPageSize, PaginationPrevious } from '@wallarm-org/design-system/Pagination';\n\nexport const Playground = () => {\n  const [page, setPage] = useState(1);\n  const [pageSize, setPageSize] = useState(10);\n  return (\n    <Pagination\n      count={120}\n      page={page}\n      pageSize={pageSize}\n      align='left'\n      onPageChange={({ page }) => setPage(page)}\n      onPageSizeChange={({ pageSize }) => setPageSize(pageSize)}\n    >\n      <PaginationPageSize options={[10, 25, 50]} />\n      <PaginationPrevious />\n      <PaginationList />\n      <PaginationNext />\n    </Pagination>\n  );\n};",
          "storyFile": "Pagination/Pagination.stories.tsx",
          "storyTitle": "Navigation/Pagination",
          "description": "Controlled mode with both `page` and `pageSize` held outside, which is how it behaves against a real query."
        },
        {
          "name": "InTable",
          "code": "import { useClientPagination, Pagination, PaginationList, PaginationNext, PaginationPageSize, PaginationPrevious } from '@wallarm-org/design-system/Pagination';\nimport { VStack } from '@wallarm-org/design-system/Stack';\nimport { Table } from '@wallarm-org/design-system/Table';\n\nexport const InTable = () => {\n  const { pageData, ...pagination } = useClientPagination(apiEndpoints, 10);\n\n  return (\n    <div className='w-800'>\n      <VStack gap={12}>\n        <Table data={pageData} columns={endpointColumns} getRowId={row => row.id} />\n        <Pagination {...pagination} align='right' aria-label='API endpoints'>\n          <PaginationPageSize options={[5, 10, 25]} />\n          <PaginationPrevious />\n          <PaginationList />\n          <PaginationNext />\n        </Pagination>\n      </VStack>\n    </div>\n  );\n};",
          "storyFile": "Pagination/Pagination.stories.tsx",
          "storyTitle": "Navigation/Pagination",
          "description": "The pager below a `Table`, sharing its state through `useClientPagination` — the composition to copy for a paged grid."
        }
      ]
    },
    {
      "name": "ParameterPath",
      "description": "Shows where in a request a parameter lives — the method, then each container down to the parameter itself, with the last segment highlighted and carrying a bolt when `attack` marks it as the one that was hit. Copying a path yields a `FilterInput` query rather than the text on screen — `method = \"POST\" AND parameter = \"JSON.nginx_config\"` — so a finding can be pasted straight into a search.",
      "importPath": "@wallarm-org/design-system/ParameterPath",
      "props": [
        {
          "name": "method",
          "type": "HttpMethodName | undefined",
          "required": false
        },
        {
          "name": "segments",
          "type": "string[]",
          "required": true
        },
        {
          "name": "encoding",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "attack",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "expandable",
          "type": "boolean | undefined",
          "required": false,
          "description": "Opt in to click-to-expand. When `true`, a *truncated* path becomes\ninteractive: clicking the `…` collapse indicator (or the path) expands it\ninline to show every segment, and clicking again collapses it back to\n`first … last`. No effect when the path already fits without truncation.\n\n`expandable` only controls the affordance (whether the user can toggle);\nthe open/closed state is owned by `expanded` / `defaultExpanded`.",
          "defaultValue": "false"
        },
        {
          "name": "expanded",
          "type": "boolean | undefined",
          "required": false,
          "description": "Controlled expanded state. When provided, the component does not manage its\nown state — pair it with {@link onExpandedChange}."
        },
        {
          "name": "defaultExpanded",
          "type": "boolean | undefined",
          "required": false,
          "description": "Initial expanded state for the uncontrolled case. Ignored when `expanded`\nis provided. Defaults to `false`.",
          "defaultValue": "false"
        },
        {
          "name": "onExpandedChange",
          "type": "((expanded: boolean) => void) | undefined",
          "required": false,
          "description": "Called with the next expanded state whenever the user toggles the path.\nRequired for controlled usage; also useful for analytics in the\nuncontrolled case."
        },
        {
          "name": "copyFormat",
          "type": "((data: CopyFormatData) => string) | undefined",
          "required": false,
          "defaultValue": "formatAsFilter"
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "expanded",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        },
        {
          "name": "variant",
          "options": [
            "default",
            "highlighted"
          ],
          "defaultValue": "default"
        }
      ],
      "subComponents": [],
      "examples": [
        {
          "name": "FullPath",
          "code": "import { ParameterPath } from '@wallarm-org/design-system/ParameterPath';\n\nexport const FullPath = () => (\n  <ParameterPath\n    data-testid='parameter-path'\n    method='POST'\n    segments={['JSON', 'nginx_config']}\n    encoding='BASE64'\n    attack\n  />\n);",
          "storyFile": "ParameterPath/ParameterPath.stories.tsx",
          "storyTitle": "Data Display/ParameterPath",
          "description": "Every part at once: a method, two segments, an encoding, and the `attack` bolt on the\nparameter that was hit."
        },
        {
          "name": "NoEncoding",
          "code": "import { ParameterPath } from '@wallarm-org/design-system/ParameterPath';\n\nexport const NoEncoding = () => (\n  <ParameterPath method='GET' segments={['query', 'filter']} attack />\n);",
          "storyFile": "ParameterPath/ParameterPath.stories.tsx",
          "storyTitle": "Data Display/ParameterPath",
          "description": "With no `encoding` the trailing chip simply goes, and the path ends on the parameter."
        },
        {
          "name": "PathIndexBola",
          "code": "import { ParameterPath } from '@wallarm-org/design-system/ParameterPath';\n\nexport const PathIndexBola = () => (\n  <ParameterPath method='GET' segments={['path', '2']} attack />\n);",
          "storyFile": "ParameterPath/ParameterPath.stories.tsx",
          "storyTitle": "Data Display/ParameterPath",
          "description": "A numeric segment: `path › 2` is the second element of the URL path, which is how a BOLA\nfinding points at a resource id rather than a named field."
        },
        {
          "name": "Header",
          "code": "import { ParameterPath } from '@wallarm-org/design-system/ParameterPath';\n\nexport const Header = () => (\n  <ParameterPath method='GET' segments={['header', 'X-Forwarded-For']} attack />\n);",
          "storyFile": "ParameterPath/ParameterPath.stories.tsx",
          "storyTitle": "Data Display/ParameterPath",
          "description": "The container need not be a body — here the parameter is a request header, and the first\nsegment is what says so."
        },
        {
          "name": "Cookie",
          "code": "import { ParameterPath } from '@wallarm-org/design-system/ParameterPath';\n\nexport const Cookie = () => (\n  <ParameterPath method='POST' segments={['cookie', 'session_id']} attack />\n);",
          "storyFile": "ParameterPath/ParameterPath.stories.tsx",
          "storyTitle": "Data Display/ParameterPath",
          "description": "The same shape for a cookie: first segment names where the value came from, last names\nthe value."
        },
        {
          "name": "DeepNestedTruncated",
          "code": "import { ParameterPath } from '@wallarm-org/design-system/ParameterPath';\n\nexport const DeepNestedTruncated = () => (\n  <div style={{ width: 280 }}>\n    <ParameterPath\n      data-testid='parameter-path'\n      method='POST'\n      segments={['multipart', 'json_abc', 'json_doc', 'qwerty_doc', 'hash', 'formData', 'get']}\n      attack\n    />\n  </div>\n);",
          "storyFile": "ParameterPath/ParameterPath.stories.tsx",
          "storyTitle": "Data Display/ParameterPath",
          "description": "Seven segments in 280px: the middle collapses to an ellipsis and the full path moves into\na tooltip. The truncation is measured, not a CSS clip, so it reacts to the real width."
        },
        {
          "name": "NoMethod",
          "code": "import { ParameterPath } from '@wallarm-org/design-system/ParameterPath';\n\nexport const NoMethod = () => (\n  <ParameterPath segments={['cookie', 'session_id']} attack />\n);",
          "storyFile": "ParameterPath/ParameterPath.stories.tsx",
          "storyTitle": "Data Display/ParameterPath",
          "description": "`method` is optional — leave it out where the row around the path already says which\nrequest this belongs to."
        },
        {
          "name": "ExpandableTruncated",
          "code": "import { ParameterPath } from '@wallarm-org/design-system/ParameterPath';\n\nexport const ExpandableTruncated = () => (\n  <div style={{ width: 600 }}>\n    {/* The root is w-full (it must span the available space to measure it),\n        so centering happens inside the component, not on the container. */}\n    <ParameterPath\n      data-testid='parameter-path'\n      className='justify-center'\n      method='POST'\n      segments={[\n        'multipart',\n        'json_abc',\n        'json_doc',\n        'qwerty_doc',\n        'hash',\n        'formData',\n        'session_token',\n        'nested_payload',\n        'get',\n      ]}\n      attack\n      expandable\n    />\n  </div>\n);",
          "storyFile": "ParameterPath/ParameterPath.stories.tsx",
          "storyTitle": "Data Display/ParameterPath",
          "description": "`expandable` makes a truncated path clickable and focusable: it opens inline to show every\nsegment, and the tooltip stands down while it is open."
        },
        {
          "name": "ExpandableFitsInline",
          "code": "import { ParameterPath } from '@wallarm-org/design-system/ParameterPath';\n\nexport const ExpandableFitsInline = () => (\n  <div style={{ width: 720, display: 'flex', justifyContent: 'center' }}>\n    <ParameterPath\n      data-testid='parameter-path'\n      method='POST'\n      segments={['multipart', 'json_abc', 'json_doc', 'qwerty_doc', 'hash', 'formData', 'get']}\n      attack\n      expandable\n    />\n  </div>\n);",
          "storyFile": "ParameterPath/ParameterPath.stories.tsx",
          "storyTitle": "Data Display/ParameterPath",
          "description": "The same path given room to fit. `expandable` leaves no affordance behind when there is\nnothing to expand — no ellipsis, no cursor, no focus stop."
        },
        {
          "name": "Playground",
          "code": "import { ParameterPath } from '@wallarm-org/design-system/ParameterPath';\n\nexport const Playground = () => <ParameterPath />;",
          "storyFile": "ParameterPath/ParameterPath.stories.tsx",
          "storyTitle": "Data Display/ParameterPath",
          "description": "The props on controls, for trying a segment list or a method the stories above skip."
        },
        {
          "name": "Gallery",
          "code": "import { ParameterPath } from '@wallarm-org/design-system/ParameterPath';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Gallery = () => (\n  <VStack gap={16}>\n    <ParameterPath method='POST' segments={['JSON', 'nginx_config']} encoding='BASE64' attack />\n    <ParameterPath method='GET' segments={['query', 'filter']} attack />\n    <ParameterPath method='GET' segments={['path', '2']} attack />\n    <ParameterPath method='GET' segments={['header', 'X-Forwarded-For']} attack />\n    <ParameterPath method='POST' segments={['cookie', 'session_id']} attack />\n    <div style={{ width: 280 }}>\n      <ParameterPath method='POST' segments={['multipart', 'a', 'b', 'c', 'd', 'get']} attack />\n    </div>\n  </VStack>\n);",
          "storyFile": "ParameterPath/ParameterPath.stories.tsx",
          "storyTitle": "Data Display/ParameterPath",
          "description": "The shapes together, as they would read down a column of findings — with a narrow cell at\nthe bottom to show what happens when the column is the constraint."
        }
      ]
    },
    {
      "name": "PasswordComplexity",
      "description": "The rules a password has to meet, ticked off as it meets them — show them from the moment the field appears rather than after a failed submit, and keep the same set everywhere a password is created. The component only paints: you compute each rule's `met` and pass it in, with `passwordValidators` shipped alongside for that. A satisfied rule is struck through and steps back, so what is left to do is what stands out.",
      "importPath": "@wallarm-org/design-system/PasswordComplexity",
      "props": [
        {
          "name": "items",
          "type": "PasswordComplexityItem[]",
          "required": true
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "spacing",
          "type": "ListSpacing | undefined",
          "required": false,
          "defaultValue": "4"
        }
      ],
      "variants": [
        {
          "name": "met",
          "options": [
            "true",
            "false"
          ]
        }
      ],
      "subComponents": [],
      "examples": [
        {
          "name": "AllUnmet",
          "code": "import { PasswordComplexity } from '@wallarm-org/design-system/PasswordComplexity';\n\nexport const AllUnmet = () => <PasswordComplexity items={defaultItems} />;",
          "storyFile": "PasswordComplexity/PasswordComplexity.stories.tsx",
          "storyTitle": "Data Display/PasswordComplexity",
          "description": "The opening state — every rule still outstanding, marked with a muted dot and left in\nfull-strength type."
        },
        {
          "name": "AllMet",
          "code": "import { PasswordComplexity } from '@wallarm-org/design-system/PasswordComplexity';\n\nexport const AllMet = () => (\n  <PasswordComplexity items={defaultItems.map(item => ({ ...item, met: true }))} />\n);",
          "storyFile": "PasswordComplexity/PasswordComplexity.stories.tsx",
          "storyTitle": "Data Display/PasswordComplexity",
          "description": "Everything satisfied: green checks with the labels struck through, which reads as done\nwithout needing a success message on top."
        },
        {
          "name": "PartiallyMet",
          "code": "import { PasswordComplexity } from '@wallarm-org/design-system/PasswordComplexity';\n\nexport const PartiallyMet = () => (\n  <PasswordComplexity\n    items={[\n      { id: 'length', label: 'At least 8 characters', met: true },\n      { id: 'uppercase', label: 'Contains an uppercase letter', met: true },\n      { id: 'lowercase', label: 'Contains a lowercase letter', met: true },\n      { id: 'number', label: 'Contains a number', met: false },\n      { id: 'symbol', label: 'Contains a special character', met: false },\n    ]}\n  />\n);",
          "storyFile": "PasswordComplexity/PasswordComplexity.stories.tsx",
          "storyTitle": "Data Display/PasswordComplexity",
          "description": "The state actually seen most of the time. Three rules are struck through and two are not,\nand the two are what the eye goes to."
        },
        {
          "name": "Interactive",
          "code": "import { useState } from 'react';\nimport { Input } from '@wallarm-org/design-system/Input';\nimport { PasswordComplexity, type PasswordComplexityItem, passwordValidators } from '@wallarm-org/design-system/PasswordComplexity';\n\nexport const Interactive = () => {\n  const [password, setPassword] = useState('');\n  const [confirmPassword, setConfirmPassword] = useState('');\n\n  const items: PasswordComplexityItem[] = [\n    {\n      id: 'length',\n      label: 'At least 8 characters',\n      met: passwordValidators.minLength(8)(password),\n    },\n    {\n      id: 'uppercase',\n      label: 'One uppercase letter (A–Z)',\n      met: passwordValidators.hasUppercase(password),\n    },\n    {\n      id: 'lowercase',\n      label: 'One lowercase letter (a–z)',\n      met: passwordValidators.hasLowercase(password),\n    },\n    { id: 'number', label: 'One number (0–9)', met: passwordValidators.hasNumber(password) },\n    {\n      id: 'symbol',\n      label: 'One symbol (e.g. ! ? @ #)',\n      met: passwordValidators.hasSymbol(password),\n    },\n    {\n      id: 'match',\n      label: 'Both passwords match',\n      met: passwordValidators.passwordsMatch(password, confirmPassword),\n    },\n  ];\n\n  return (\n    <div className='flex flex-col gap-16 w-[320px]'>\n      <Input\n        type='password'\n        placeholder='New password...'\n        value={password}\n        onChange={e => setPassword(e.target.value)}\n      />\n      <Input\n        type='password'\n        placeholder='Confirm password...'\n        value={confirmPassword}\n        onChange={e => setConfirmPassword(e.target.value)}\n      />\n      <PasswordComplexity items={items} />\n    </div>\n  );\n};",
          "storyFile": "PasswordComplexity/PasswordComplexity.stories.tsx",
          "storyTitle": "Data Display/PasswordComplexity",
          "description": "Two fields wired to `passwordValidators`, `passwordsMatch` included, recomputed on every\nkeystroke — the real-time checking the rules are meant to be shown with."
        }
      ]
    },
    {
      "name": "PasswordInput",
      "description": "A password field with a reveal toggle, which is the whole point of reaching for it over an `Input` of type password. Where rules are enforced, pair it with `PasswordComplexity` so the reader watches them being met rather than discovering them on submit.",
      "importPath": "@wallarm-org/design-system/PasswordInput",
      "props": [
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "pattern",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, HTMLInputElement> | undefined",
          "required": false
        },
        {
          "name": "disabled",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "name",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "value",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "size",
          "type": "{ default: string; medium: string; small: string; 'inline-edit': string; }",
          "required": false,
          "defaultValue": "default"
        },
        {
          "name": "alt",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "height",
          "type": "string | number | undefined",
          "required": false
        },
        {
          "name": "src",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "width",
          "type": "string | number | undefined",
          "required": false
        },
        {
          "name": "error",
          "type": "{ true: string; false: string; }",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "autoComplete",
          "type": "HTMLInputAutoCompleteAttribute | undefined",
          "required": false
        },
        {
          "name": "maxLength",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "minLength",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "placeholder",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "readOnly",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "required",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "checked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "step",
          "type": "string | number | undefined",
          "required": false
        },
        {
          "name": "accept",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "max",
          "type": "string | number | undefined",
          "required": false
        },
        {
          "name": "min",
          "type": "string | number | undefined",
          "required": false
        },
        {
          "name": "multiple",
          "type": "boolean | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [],
      "examples": [
        {
          "name": "Basic",
          "code": "import { PasswordInput } from '@wallarm-org/design-system/PasswordInput';\n\n<PasswordInput placeholder=\"Enter\" />",
          "storyFile": "PasswordInput/PasswordInput.stories.tsx",
          "storyTitle": "Inputs/PasswordInput",
          "description": "Masked by default, with the eye toggling to plain text. The toggle is a real button, so it\nis reachable by keyboard rather than being a mouse-only affordance."
        },
        {
          "name": "WithField",
          "code": "import { Field, FieldAction, FieldIndicator, FieldLabel } from '@wallarm-org/design-system/Field';\nimport { PasswordInput } from '@wallarm-org/design-system/PasswordInput';\n\nexport const WithField = () => (\n  <Field required>\n    <FieldLabel>\n      Password\n      <FieldIndicator />\n      <FieldAction type='muted'>Forgot password?</FieldAction>\n    </FieldLabel>\n    <PasswordInput placeholder='Enter' />\n  </Field>\n);",
          "storyFile": "PasswordInput/PasswordInput.stories.tsx",
          "storyTitle": "Inputs/PasswordInput",
          "description": "Inside `Field`, which supplies the label and description above it."
        },
        {
          "name": "WithError",
          "code": "import { Field, FieldError, FieldIndicator, FieldLabel } from '@wallarm-org/design-system/Field';\nimport { PasswordInput } from '@wallarm-org/design-system/PasswordInput';\n\nexport const WithError = () => (\n  <Field required>\n    <FieldLabel>\n      Password\n      <FieldIndicator />\n    </FieldLabel>\n    <PasswordInput placeholder='Enter' error />\n    <FieldError>Password is incorrect</FieldError>\n  </Field>\n);",
          "storyFile": "PasswordInput/PasswordInput.stories.tsx",
          "storyTitle": "Inputs/PasswordInput",
          "description": "`error` on the field. Say what is wrong in `FieldError` — a red border on a masked field\nleaves the reader guessing at something they cannot see."
        },
        {
          "name": "WithRequirements",
          "code": "import { useState } from 'react';\nimport { Field, FieldLabel } from '@wallarm-org/design-system/Field';\nimport { PasswordComplexity, type PasswordComplexityItem, passwordValidators } from '@wallarm-org/design-system/PasswordComplexity';\nimport { PasswordInput } from '@wallarm-org/design-system/PasswordInput';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const WithRequirements = () => {\n  const [password, setPassword] = useState('');\n  const [confirmPassword, setConfirmPassword] = useState('');\n\n  const items: PasswordComplexityItem[] = [\n    {\n      id: 'length',\n      label: 'At least 8 characters',\n      met: passwordValidators.minLength(8)(password),\n    },\n    {\n      id: 'uppercase',\n      label: 'One uppercase letter (A\\u2013Z)',\n      met: passwordValidators.hasUppercase(password),\n    },\n    {\n      id: 'lowercase',\n      label: 'One lowercase letter (a\\u2013z)',\n      met: passwordValidators.hasLowercase(password),\n    },\n    { id: 'number', label: 'One number (0\\u20139)', met: passwordValidators.hasNumber(password) },\n    {\n      id: 'symbol',\n      label: 'One symbol (e.g. ! ? @ #)',\n      met: passwordValidators.hasSymbol(password),\n    },\n    {\n      id: 'match',\n      label: 'Both passwords match',\n      met: passwordValidators.passwordsMatch(password, confirmPassword),\n    },\n  ];\n\n  return (\n    <VStack gap={16} className='w-[320px]'>\n      <Field>\n        <FieldLabel>New password</FieldLabel>\n        <PasswordInput\n          placeholder='New password...'\n          value={password}\n          onChange={e => setPassword(e.target.value)}\n        />\n      </Field>\n\n      <VStack gap={6}>\n        <Field>\n          <FieldLabel>Confirm password</FieldLabel>\n          <PasswordInput\n            placeholder='Confirm password...'\n            value={confirmPassword}\n            onChange={e => setConfirmPassword(e.target.value)}\n          />\n        </Field>\n        <PasswordComplexity items={items} />\n      </VStack>\n    </VStack>\n  );\n};",
          "storyFile": "PasswordInput/PasswordInput.stories.tsx",
          "storyTitle": "Inputs/PasswordInput",
          "description": "`PasswordComplexity` fed by the exported `passwordValidators`, ticking off each rule as it\nis met. Show the rules from the start rather than revealing them after a failure."
        },
        {
          "name": "Disabled",
          "code": "import { PasswordInput } from '@wallarm-org/design-system/PasswordInput';\n\n<PasswordInput placeholder=\"Enter\" disabled />",
          "storyFile": "PasswordInput/PasswordInput.stories.tsx",
          "storyTitle": "Inputs/PasswordInput",
          "description": "Dimmed, with the reveal toggle out as well — there is nothing to reveal that the reader can\nact on."
        },
        {
          "name": "Sizes",
          "code": "import { PasswordInput } from '@wallarm-org/design-system/PasswordInput';\nimport { HStack } from '@wallarm-org/design-system/Stack';\n\nexport const Sizes = () => (\n  <HStack gap={16} align='start'>\n    <PasswordInput placeholder='Default' size='default' />\n    <PasswordInput placeholder='Medium' size='medium' />\n    <PasswordInput placeholder='Small' size='small' />\n  </HStack>\n);",
          "storyFile": "PasswordInput/PasswordInput.stories.tsx",
          "storyTitle": "Inputs/PasswordInput",
          "description": "The same height scale as `Input`, so a password field lines up with the fields around it."
        }
      ]
    },
    {
      "name": "Polymorphic",
      "importPath": "@wallarm-org/design-system/Polymorphic",
      "props": [],
      "variants": [],
      "subComponents": [],
      "examples": []
    },
    {
      "name": "Popover",
      "description": "A small panel anchored to what opened it, for content the reader can act on — a form, a set of controls, a detail with a link in it. Reach for `Tooltip` when the content is only a label, and `Drawer` when it is a task rather than a detail.",
      "importPath": "@wallarm-org/design-system/Popover",
      "props": [
        {
          "name": "open",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "onOpenChange",
          "type": "((open: boolean) => void) | undefined",
          "required": false
        },
        {
          "name": "ids",
          "type": "ElementIds | undefined",
          "required": false,
          "description": "Override the trigger element's id. Pass the same id to another\ncompound component's `ids.trigger` (e.g. `Tooltip`, `DropdownMenu`) to\ncompose their triggers on one element via nested `asChild` without an\nextra wrapper node — otherwise the outer trigger's id wins and the\nother component can't find its own anchor."
        },
        {
          "name": "positioning",
          "type": "PositioningOptions | undefined",
          "required": false,
          "description": "Custom positioning configuration. When provided, overrides the default positioning."
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [
        {
          "name": "PopoverContent",
          "props": [
            {
              "name": "minHeight",
              "type": "PopoverSizeDimension | undefined",
              "required": false
            },
            {
              "name": "maxHeight",
              "type": "PopoverSizeDimension | undefined",
              "required": false,
              "defaultValue": "POPOVER_MAX_HEIGHT"
            },
            {
              "name": "minWidth",
              "type": "PopoverSizeDimension | undefined",
              "required": false,
              "defaultValue": "POPOVER_MIN_WIDTH"
            },
            {
              "name": "maxWidth",
              "type": "PopoverSizeDimension | undefined",
              "required": false,
              "defaultValue": "POPOVER_MAX_WIDTH"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "PopoverTrigger",
          "props": [
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "defaultValue": "false"
            },
            {
              "name": "value",
              "type": "string | undefined",
              "required": false,
              "description": "A real `<button>`'s `value` DOM attribute is always a string at runtime."
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Alert, AlertContent, AlertControls, AlertDescription, AlertIcon, AlertTitle } from '@wallarm-org/design-system/Alert';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Popover, PopoverContent, PopoverTrigger } from '@wallarm-org/design-system/Popover';\nimport { VStack } from '@wallarm-org/design-system/Stack';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const Basic = () => (\n  <Popover data-testid='popover'>\n    <PopoverTrigger asChild>\n      <Button variant='outline' color='neutral'>\n        Click me\n      </Button>\n    </PopoverTrigger>\n    <PopoverContent>\n      <VStack gap={12}>\n        <Text size='sm'>This action will remove all and every bit!</Text>\n\n        <Alert color='warning'>\n          <AlertIcon />\n          <AlertContent>\n            <AlertTitle>Message goes here</AlertTitle>\n            <AlertDescription>\n              {'Description goes here \\nDescription goes here \\nDescription goes here'}\n            </AlertDescription>\n            <AlertControls>\n              <Button variant='secondary' color='neutral' size='small'>\n                Button\n              </Button>\n              <Button variant='secondary' color='neutral' size='small'>\n                Button\n              </Button>\n            </AlertControls>\n          </AlertContent>\n        </Alert>\n      </VStack>\n    </PopoverContent>\n  </Popover>\n);",
          "storyFile": "Popover/Popover.stories.tsx",
          "storyTitle": "Overlay/Popover",
          "description": "Trigger and content. It takes focus, which is the whole difference from a tooltip."
        },
        {
          "name": "WithTooltip",
          "code": "import { useId, useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Popover, PopoverContent, PopoverTrigger } from '@wallarm-org/design-system/Popover';\nimport { Text } from '@wallarm-org/design-system/Text';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@wallarm-org/design-system/Tooltip';\n\nexport const WithTooltip = () => {\n  const triggerId = useId();\n  const [open, setOpen] = useState(false);\n\n  return (\n    <Popover\n      data-testid='with-tooltip-popover'\n      open={open}\n      onOpenChange={setOpen}\n      ids={{ trigger: triggerId }}\n    >\n      {/* Sharing `ids.trigger` lets both machines resolve the same DOM node as\n          their own anchor, so the tooltip positions correctly with no wrapper. */}\n      <Tooltip data-testid='with-tooltip-tooltip' disabled={open} ids={{ trigger: triggerId }}>\n        <PopoverTrigger asChild>\n          <TooltipTrigger asChild>\n            <Button data-testid='popover-tooltip-trigger' variant='outline' color='neutral'>\n              Actions\n            </Button>\n          </TooltipTrigger>\n        </PopoverTrigger>\n        <TooltipContent>More actions</TooltipContent>\n      </Tooltip>\n      <PopoverContent>\n        <Text size='sm'>Popover content</Text>\n      </PopoverContent>\n    </Popover>\n  );\n};",
          "storyFile": "Popover/Popover.stories.tsx",
          "storyTitle": "Overlay/Popover",
          "description": "A tooltip on the popover's own trigger — the label explains what opens, the popover holds\nwhat you do."
        },
        {
          "name": "MinMaxWidth",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Popover, PopoverContent, PopoverTrigger } from '@wallarm-org/design-system/Popover';\nimport { VStack } from '@wallarm-org/design-system/Stack';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const MinMaxWidth = () => (\n  <VStack gap={32}>\n    <Popover>\n      <PopoverTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Min Width\n        </Button>\n      </PopoverTrigger>\n      <PopoverContent>\n        <Text size='xs' weight='medium'>\n          Lorem Ipsum\n        </Text>\n      </PopoverContent>\n    </Popover>\n\n    <Popover>\n      <PopoverTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Max Width\n        </Button>\n      </PopoverTrigger>\n      <PopoverContent>\n        <Text size='xs' weight='medium'>\n          Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has\n          been the industry's standard dummy text ever since the 1500s, when an unknown printer took\n          a galley of type and scrambled it to make a type specimen book. It has survived not only\n          five centuries, but also the leap into electronic typesetting, remaining essentially\n          unchanged. It was popularised in the 1960s with the release of Letraset sheets containing\n          Lorem Ipsum passages, and more recently with desktop publishing software like Aldus\n          PageMaker including versions of Lorem Ipsum. Why do we use it? It is a long established\n          fact that a reader will be distracted by the readable content of a page when looking at\n          its layout.\n        </Text>\n      </PopoverContent>\n    </Popover>\n  </VStack>\n);",
          "storyFile": "Popover/Popover.stories.tsx",
          "storyTitle": "Overlay/Popover",
          "description": "Width bounds, for content that varies. Let it size to the content rather than pinning it, or\nshort content sits in an empty box."
        },
        {
          "name": "MinMaxHeight",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Popover, PopoverContent, PopoverTrigger } from '@wallarm-org/design-system/Popover';\nimport { VStack } from '@wallarm-org/design-system/Stack';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const MinMaxHeight = () => (\n  <VStack gap={32}>\n    <Popover>\n      <PopoverTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Min Height\n        </Button>\n      </PopoverTrigger>\n      <PopoverContent>\n        <Text size='xs' weight='medium'>\n          Lorem Ipsum\n        </Text>\n      </PopoverContent>\n    </Popover>\n\n    <Popover>\n      <PopoverTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Max Height\n        </Button>\n      </PopoverTrigger>\n      <PopoverContent>\n        <VStack gap={12}>\n          <Text size='xs' weight='medium'>\n            Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum\n            has been the industry's standard dummy text ever since the 1500s, when an unknown\n            printer took a galley of type and scrambled it to make a type specimen book. It has\n            survived not only five centuries, but also the leap into electronic typesetting,\n            remaining essentially unchanged. It was popularised in the 1960s with the release of\n            Letraset sheets containing Lorem Ipsum passages, and more recently with desktop\n            publishing software like Aldus PageMaker including versions of Lorem Ipsum. Why do we\n            use it? It is a long established fact that a reader will be distracted by the readable\n            content of a page when looking at its layout. The point of using Lorem Ipsum is that it\n            has a more-or-less normal distribution of letters, as opposed to using 'Content here,\n            content here', making it look like readable English. Many desktop publishing packages\n            and web page editors now use Lorem Ipsum as their default model text, and a search for\n            'lorem ipsum' will uncover many web sites still in their infancy. Various versions have\n            evolved over the years, sometimes by accident, sometimes on purpose (injected humour and\n            the like). Where does it come from? Contrary to popular belief, Lorem Ipsum is not\n            simply random text. It has roots in a piece of classical Latin literature from 45 BC,\n            making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney\n            College in Virginia, looked up one of the more obscure Latin words, consectetur, from a\n            Lorem Ipsum passage, and going through the cites of the word in classical literature,\n            discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33\n            of \"de Finibus Bonorum et Malorum\" (The Extremes of Good and Evil) by Cicero, written in\n            45 BC. This book is a treatise on the theory of ethics, very popular during the\n            Renaissance. The first line of Lorem Ipsum, \"Lorem ipsum dolor sit amet..\", comes from a\n            line in section 1.10.32. The standard chunk of Lorem Ipsum used since the 1500s is\n            reproduced below for those interested. Sections 1.10.32 and 1.10.33 from \"de Finibus\n            Bonorum et Malorum\" by Cicero are also reproduced in their exact original form,\n            accompanied by English versions from the 1914 translation by H. Rackham.\n          </Text>\n\n          <Text size='xs' weight='medium'>\n            Where does it come from? Contrary to popular belief, Lorem Ipsum is not simply random\n            text. It has roots in a piece of classical Latin literature from 45 BC, making it over\n            2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in\n            Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum\n            passage, and going through the cites of the word in classical literature, discovered the\n            undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of \"de Finibus\n            Bonorum et Malorum\" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This\n            book is a treatise on the theory of ethics, very popular during the Renaissance. The\n            first line of Lorem Ipsum, \"Lorem ipsum dolor sit amet..\", comes from a line in section\n            1.10.32. The standard chunk of Lorem Ipsum used since the 1500s is reproduced below for\n            those interested. Sections 1.10.32 and 1.10.33 from \"de Finibus Bonorum et Malorum\" by\n            Cicero are also reproduced in their exact original form, accompanied by English versions\n            from the 1914 translation by H. Rackham.\n          </Text>\n        </VStack>\n      </PopoverContent>\n    </Popover>\n  </VStack>\n);",
          "storyFile": "Popover/Popover.stories.tsx",
          "storyTitle": "Overlay/Popover",
          "description": "Height bounds with scrolling past the cap. If it scrolls often, the content has outgrown a\npopover."
        }
      ]
    },
    {
      "name": "Progress",
      "description": "A linear bar for an operation you can measure, or a long or multi-step one where watching it advance is the reassurance — a short in-context wait is a `Loader`, and a page loading a known layout is `Skeleton`. `value={null}` makes it indeterminate: use that rather than a spinner for a long wait you cannot measure, switch to a real number the moment you can, and never fake a percentage. Linear only — the system has no circular progress, so do not hand-roll a ring.",
      "importPath": "@wallarm-org/design-system/Progress",
      "props": [
        {
          "name": "value",
          "type": "number | null | undefined",
          "required": false,
          "description": "Progress value (0–max). Pass `null` for indeterminate state."
        },
        {
          "name": "min",
          "type": "number | undefined",
          "required": false,
          "defaultValue": "0"
        },
        {
          "name": "max",
          "type": "number | undefined",
          "required": false,
          "defaultValue": "100"
        },
        {
          "name": "size",
          "type": "ProgressSize | undefined",
          "required": false,
          "defaultValue": "xs"
        },
        {
          "name": "color",
          "type": "ProgressColor | undefined",
          "required": false,
          "defaultValue": "brand"
        },
        {
          "name": "showLabel",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "size",
          "options": [
            "xs",
            "sm",
            "md",
            "lg"
          ],
          "defaultValue": "xs"
        },
        {
          "name": "color",
          "options": [],
          "defaultValue": "brand"
        }
      ],
      "subComponents": [],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Progress } from '@wallarm-org/design-system/Progress';\n\nexport const Basic = () => (\n  <div className='w-280'>\n    <Progress />\n  </div>\n);",
          "storyFile": "Progress/Progress.stories.tsx",
          "storyTitle": "Loading/Progress",
          "description": "The determinate bar: `value` against `min` and `max`. The controls are live, so this is also the place to try a size or a colour."
        },
        {
          "name": "Sizes",
          "code": "import { Progress } from '@wallarm-org/design-system/Progress';\n\nexport const Sizes = () => (\n  <div className='flex w-[360px] flex-col gap-16'>\n    {sizeRows.map(({ size, label, value }) => (\n      <div key={size} className='flex items-center gap-16'>\n        <Progress value={value} size={size} className='flex-1' />\n      </div>\n    ))}\n  </div>\n);",
          "storyFile": "Progress/Progress.stories.tsx",
          "storyTitle": "Loading/Progress",
          "description": "`xs` through `lg`. A thin bar belongs in an inline row; the heavier ones are for an operation the screen is actually about."
        },
        {
          "name": "WithLabel",
          "code": "import { Progress } from '@wallarm-org/design-system/Progress';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const WithLabel = () => (\n  <div className='w-280'>\n    <VStack>\n      <Progress value={20} showLabel />\n      <Progress value={40} showLabel size='sm' />\n      <Progress value={60} showLabel size='md' />\n      <Progress value={80} showLabel size='lg' />\n    </VStack>\n  </div>\n);",
          "storyFile": "Progress/Progress.stories.tsx",
          "storyTitle": "Loading/Progress",
          "description": "`showLabel` prints the percentage — worth it on a long or standalone job where the number reassures, noise on a thin inline bar."
        },
        {
          "name": "Colors",
          "code": "import { ProgressColorEnum, Progress } from '@wallarm-org/design-system/Progress';\n\nexport const Colors = () => (\n  <div className='flex w-[360px] flex-col gap-16'>\n    {Object.entries(ProgressColorEnum).map(([key, color], index) => (\n      <div key={color} className='flex items-center gap-16'>\n        <Progress\n          value={index + 1}\n          max={Object.entries(ProgressColorEnum).length}\n          color={color}\n          size='sm'\n          className='flex-1'\n        />\n      </div>\n    ))}\n  </div>\n);",
          "storyFile": "Progress/Progress.stories.tsx",
          "storyTitle": "Loading/Progress",
          "description": "The full palette, though `brand` is the default for a reason: reach for another only when the colour says something true about the job, such as red for one that is failing."
        },
        {
          "name": "Indeterminate",
          "code": "import { Progress } from '@wallarm-org/design-system/Progress';\n\nexport const Indeterminate = () => (\n  <div className='w-280'>\n    <Progress value={null} />\n  </div>\n);",
          "storyFile": "Progress/Progress.stories.tsx",
          "storyTitle": "Loading/Progress",
          "description": "`value={null}` cycles the range instead of filling it, which is the honest way to show a long wait you cannot measure."
        }
      ]
    },
    {
      "name": "Radio",
      "description": "Picks exactly one option from a set — reach for `Checkbox` when several answers can be true at once, and `Select` past roughly ten options. Radios cannot be cleared once chosen, so include the neutral answer as an option rather than expecting the reader to undo.",
      "importPath": "@wallarm-org/design-system/Radio",
      "props": [
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "disabled",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "value",
          "type": "string",
          "required": true
        },
        {
          "name": "asChild",
          "type": "boolean | undefined",
          "required": false,
          "description": "Use the provided child element as the default rendered element, combining their props and behavior."
        },
        {
          "name": "htmlFor",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "invalid",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [
        {
          "name": "RadioDescription",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "RadioGroup",
          "props": [
            {
              "name": "form",
              "type": "string | undefined",
              "required": false,
              "description": "The associate form of the underlying input."
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | null | undefined",
              "required": false,
              "description": "The initial value of the checked radio when rendered.\nUse when you don't need to control the value of the radio group."
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string",
              "required": false,
              "description": "The unique identifier of the machine."
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false,
              "description": "If `true`, the radio group will be disabled"
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false,
              "description": "The name of the input fields in the radio\n(Useful for form submission)."
            },
            {
              "name": "value",
              "type": "string | null | undefined",
              "required": false,
              "description": "The controlled value of the radio group"
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "description": "Use the provided child element as the default rendered element, combining their props and behavior."
            },
            {
              "name": "ids",
              "type": "ElementIds | undefined",
              "required": false,
              "description": "The ids of the elements in the radio. Useful for composition."
            },
            {
              "name": "readOnly",
              "type": "boolean | undefined",
              "required": false,
              "description": "Whether the radio group is read-only"
            },
            {
              "name": "required",
              "type": "boolean | undefined",
              "required": false,
              "description": "If `true`, the radio group is marked as required."
            },
            {
              "name": "invalid",
              "type": "boolean | undefined",
              "required": false,
              "description": "If `true`, the radio group is marked as invalid."
            },
            {
              "name": "onValueChange",
              "type": "complex",
              "required": false,
              "description": "Function called once a radio is checked"
            },
            {
              "name": "orientation",
              "type": "\"vertical\" | \"horizontal\" | undefined",
              "required": false,
              "description": "Orientation of the radio group"
            },
            {
              "name": "variant",
              "type": "{ default: string; card: string; }",
              "required": false,
              "defaultValue": "default"
            }
          ]
        },
        {
          "name": "RadioLabel",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "description": "Use the provided child element as the default rendered element, combining their props and behavior."
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Info } from '@wallarm-org/design-system/icons';\nimport { Radio, RadioDescription, RadioGroup, RadioIndicator, RadioLabel } from '@wallarm-org/design-system/Radio';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@wallarm-org/design-system/Tooltip';\n\nexport const Basic = () => (\n  <RadioGroup name='framework' defaultValue='svelte'>\n    <Radio value='react' data-testid='radio-react'>\n      <RadioIndicator />\n      <RadioLabel>React</RadioLabel>\n      <RadioDescription>\n        By selected this value, you agree to the terms and conditions.\n      </RadioDescription>\n    </Radio>\n\n    <Radio value='solid'>\n      <RadioIndicator />\n      <RadioLabel>\n        Solid\n        <Tooltip>\n          <TooltipTrigger>\n            <Info />\n          </TooltipTrigger>\n          <TooltipContent>Additional information</TooltipContent>\n        </Tooltip>\n      </RadioLabel>\n    </Radio>\n\n    <Radio value='vue' disabled>\n      <RadioIndicator />\n      <RadioLabel>Vue</RadioLabel>\n    </Radio>\n\n    <Radio value='svelte'>\n      <RadioIndicator />\n      <RadioLabel>Svelte</RadioLabel>\n    </Radio>\n  </RadioGroup>\n);",
          "storyFile": "Radio/Radio.stories.tsx",
          "storyTitle": "Inputs/Radio",
          "description": "`RadioGroup` ties the options to one `name` and one value; each `Radio` composes\n`RadioIndicator` and `RadioLabel`. Give the group a `defaultValue` — an unset group makes the\nreader answer a question they may not have."
        },
        {
          "name": "Card",
          "code": "import { Info } from '@wallarm-org/design-system/icons';\nimport { Radio, RadioDescription, RadioGroup, RadioIndicator, RadioLabel } from '@wallarm-org/design-system/Radio';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@wallarm-org/design-system/Tooltip';\n\nexport const Card = () => (\n  <RadioGroup variant='card' name='framework' defaultValue='vue'>\n    <Radio value='react'>\n      <RadioIndicator />\n      <RadioLabel>React</RadioLabel>\n      <RadioDescription>\n        By selected this value, you agree to the terms and conditions.\n      </RadioDescription>\n    </Radio>\n\n    <Radio value='solid'>\n      <RadioIndicator />\n      <RadioLabel>\n        Solid\n        <Tooltip>\n          <TooltipTrigger>\n            <Info />\n          </TooltipTrigger>\n          <TooltipContent>Additional information</TooltipContent>\n        </Tooltip>\n      </RadioLabel>\n    </Radio>\n\n    <Radio value='vue' disabled>\n      <RadioIndicator />\n      <RadioLabel>Vue</RadioLabel>\n      <RadioDescription>\n        By selected this value, you agree to the terms and conditions.\n      </RadioDescription>\n    </Radio>\n\n    <Radio value='svelte'>\n      <RadioIndicator />\n      <RadioLabel>Svelte</RadioLabel>\n    </Radio>\n  </RadioGroup>\n);",
          "storyFile": "Radio/Radio.stories.tsx",
          "storyTitle": "Inputs/Radio",
          "description": "`variant='card'` gives every option its own bordered surface. As with `Checkbox`, cards\nexist to carry a `RadioDescription` — a card holding a bare label wastes the room it asks for."
        },
        {
          "name": "FormField",
          "code": "import { Field, FieldDescription, FieldLabel } from '@wallarm-org/design-system/Field';\nimport { Info } from '@wallarm-org/design-system/icons';\nimport { Radio, RadioDescription, RadioGroup, RadioIndicator, RadioLabel } from '@wallarm-org/design-system/Radio';\nimport { HStack } from '@wallarm-org/design-system/Stack';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@wallarm-org/design-system/Tooltip';\n\nexport const FormField = () => (\n  <HStack align='start' gap={40}>\n    <Field>\n      <FieldLabel>\n        Label\n        <Tooltip>\n          <TooltipTrigger>\n            <Info />\n          </TooltipTrigger>\n          <TooltipContent>Additional information</TooltipContent>\n        </Tooltip>\n      </FieldLabel>\n\n      <FieldDescription>This is an input description.</FieldDescription>\n\n      <RadioGroup name='framework' defaultValue='svelte'>\n        <Radio value='react'>\n          <RadioIndicator />\n          <RadioLabel>React</RadioLabel>\n          <RadioDescription>\n            By selected this value, you agree to the terms and conditions.\n          </RadioDescription>\n        </Radio>\n\n        <Radio value='solid'>\n          <RadioIndicator />\n          <RadioLabel>Solid</RadioLabel>\n        </Radio>\n\n        <Radio value='vue' disabled>\n          <RadioIndicator />\n          <RadioLabel>Vue</RadioLabel>\n        </Radio>\n\n        <Radio value='svelte'>\n          <RadioIndicator />\n          <RadioLabel>Svelte</RadioLabel>\n        </Radio>\n      </RadioGroup>\n    </Field>\n\n    <Field>\n      <FieldLabel>\n        Label\n        <Tooltip>\n          <TooltipTrigger>\n            <Info />\n          </TooltipTrigger>\n          <TooltipContent>Additional information</TooltipContent>\n        </Tooltip>\n      </FieldLabel>\n\n      <FieldDescription>This is an input description.</FieldDescription>\n\n      <RadioGroup variant='card' name='framework' defaultValue='svelte'>\n        <Radio value='react'>\n          <RadioIndicator />\n          <RadioLabel>React</RadioLabel>\n          <RadioDescription>\n            By selected this value, you agree to the terms and conditions.\n          </RadioDescription>\n        </Radio>\n\n        <Radio value='solid'>\n          <RadioIndicator />\n          <RadioLabel>Solid</RadioLabel>\n        </Radio>\n\n        <Radio value='vue' disabled>\n          <RadioIndicator />\n          <RadioLabel>Vue</RadioLabel>\n        </Radio>\n\n        <Radio value='svelte'>\n          <RadioIndicator />\n          <RadioLabel>Svelte</RadioLabel>\n        </Radio>\n      </RadioGroup>\n    </Field>\n  </HStack>\n);",
          "storyFile": "Radio/Radio.stories.tsx",
          "storyTitle": "Inputs/Radio",
          "description": "Wrapped in `Field`, so the question above the options comes from `FieldLabel` and\n`FieldDescription`. Shown as plain rows and as cards."
        }
      ]
    },
    {
      "name": "RemoteShell",
      "description": "The frame of one product inside `AppShell` — its navigation panel, breadcrumbs and content area, all driven by a single `NavConfig`. The URL is the state: the active item, the drill level and the breadcrumbs are matched from the pathname. When a router owns the URL, hand the shell the router’s pathname through `pathname` and take its navigations back through `onNavigate` — then links in the page, the host rail or `router.navigate` keep the menu in sync. Without `pathname` the shell reads `window.location` and only notices `popstate` and its own navigations.",
      "importPath": "@wallarm-org/design-system/RemoteShell",
      "props": [
        {
          "name": "config",
          "type": "NavConfig",
          "required": true,
          "description": "Navigation config used to build nav state for sub-components."
        },
        {
          "name": "basePath",
          "type": "string | undefined",
          "required": false,
          "description": "URL prefix stripped before matching and prepended when navigating (e.g. `\"/edge\"`)."
        },
        {
          "name": "pathname",
          "type": "string | undefined",
          "required": false,
          "description": "Current pathname. When set, it is the single source of truth for the active nav\nitem, drill level and breadcrumbs, and `window.location` is ignored.\n\nPass it — **together with `onNavigate`** — whenever a router owns the URL: router\nnavigations (links in page content, `router.navigate`, memory history, the host's\nrail) do not fire `popstate`, so without it the shell can go stale. Without\n`onNavigate` the shell's own navigations would only reach `window.history`, which\na controlled shell ignores (a dev warning flags this).\n\nEither form is accepted: with the `basePath` prefix (what `onNavigate` receives) or\nwithout it — the prefix is stripped only when the pathname starts with a whole\n`basePath` segment. With TanStack Router, `useRouterState({ select: s =>\ns.location.pathname })` is router-relative: it excludes the router's own\n`basepath`. So when the router has `basepath`:\n- omit `basePath` here — `pathname` and `onNavigate` are then both router-relative\n  and `onNavigate={to => navigate({ to })}` is correct; or\n- keep `basePath` and strip it in `onNavigate`\n  (`to => navigate({ to: to.slice(basePath.length) || '/' })`), otherwise the\n  router prefixes it a second time.\n\nOmit it to read `window.location.pathname` (updated on `popstate` and on the\nshell's own navigations)."
        },
        {
          "name": "onNavigate",
          "type": "((pathname: string) => void) | undefined",
          "required": false,
          "description": "Navigation handler for router integration (TanStack Router, React Router,\nNext.js, …). Receives the target pathname, prefixed with `basePath` when one is\nset. Without it the shell pushes to `window.history` itself."
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [
        {
          "name": "RemoteShellBreadcrumb",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "RemoteShellContent",
          "props": [
            {
              "name": "isLoading",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "RemoteShellPanel",
          "props": [
            {
              "name": "resizable",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "isLoading",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "loaderCount",
              "type": "number | undefined",
              "required": false,
              "defaultValue": "6"
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Basic",
          "code": "import { useNavigate, useRouterState } from '@tanstack/react-router';\nimport { RemoteShell, RemoteShellBreadcrumb, RemoteShellContent, RemoteShellPanel } from '@wallarm-org/design-system/RemoteShell';\nimport { edgeNavConfig } from '../AppShell/story-content';\n\nexport const Basic = () => {\n  const navigate = useNavigate();\n  const pathname = useRouterState({ select: state => state.location.pathname });\n\n  return (\n    <div className='h-screen bg-bg-page-bg'>\n      <RemoteShell\n        config={edgeNavConfig}\n        basePath='/edge'\n        pathname={pathname}\n        onNavigate={to => navigate({ to })}\n      >\n        <RemoteShellPanel resizable />\n        <RemoteShellBreadcrumb />\n        <RemoteShellContent>\n          <EdgePage />\n        </RemoteShellContent>\n      </RemoteShell>\n    </div>\n  );\n};",
          "storyFile": "RemoteShell/RemoteShell.stories.tsx",
          "storyTitle": "Navigation/RemoteShell",
          "description": "A standalone product on TanStack Router — the recommended integration. `pathname` is\nthe router’s `location.pathname` and `onNavigate` calls `navigate`, so the menu, drill\nlevel and breadcrumbs follow every navigation: the panel, the breadcrumbs and the\nrouter links in the page. This router has no `basepath` (its routes include `/edge`),\nso both sides use the full pathname. If your router sets `basepath`, its\n`location.pathname` is router-relative: omit `basePath` on `RemoteShell` (or keep it\nand strip it in `onNavigate`), otherwise `navigate` prefixes it twice."
        }
      ]
    },
    {
      "name": "Resizable",
      "description": "A layout primitive that splits a view into resizable panels separated by draggable handles. Wraps `react-resizable-panels` with design-system styling.",
      "importPath": "@wallarm-org/design-system/Resizable",
      "props": [],
      "variants": [
        {
          "name": "orientation",
          "options": [
            "horizontal",
            "vertical"
          ],
          "defaultValue": "horizontal"
        }
      ],
      "subComponents": [
        {
          "name": "ResizableHandle",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false,
              "description": "When disabled, the separator cannot be used to resize its neighboring panels.\r\n\r\nℹ️ The panels may still be resized indirectly (while other panels are being resized).\r\nTo prevent a panel from being resized at all, it needs to also be disabled."
            },
            {
              "name": "disableDoubleClick",
              "type": "boolean | undefined",
              "required": false,
              "description": "When true, double-clicking this `Separator` will not reset its `Panel` to its default size."
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "ResizablePanel",
          "props": [
            {
              "name": "id",
              "type": "string | undefined",
              "required": false,
              "description": "Unique panel identity for layout persistence."
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false,
              "description": "When disabled, a panel cannot be resized either directly or indirectly (by resizing another panel)."
            },
            {
              "name": "onResize",
              "type": "complex",
              "required": false,
              "description": "Called when panel sizes change."
            },
            {
              "name": "collapsedSize",
              "type": "string | number | undefined",
              "required": false,
              "description": "Panel size when collapsed; defaults to 0%."
            },
            {
              "name": "collapsible",
              "type": "boolean | undefined",
              "required": false,
              "description": "This panel can be collapsed.\r\n\r\nℹ️ A collapsible panel will collapse when it's size is less than of the specified `minSize`"
            },
            {
              "name": "defaultSize",
              "type": "string | number | undefined",
              "required": false,
              "description": "Default size of Panel within its parent group; default is auto-assigned based on the total number of Panels.\r\n\r\nℹ️ Interpretation rules:\r\n- Numbers are interpreted as pixels (e.g. `defaultSize={200}` is 200 pixels)\r\n- Strings without explicit units are interpreted as percentage (e.g. `defaultSize=\"50\"` is 50 percent)\r\n- Use explicit units (e.g. \"px\", \"%\", \"em\", \"rem\", \"vh\", or \"vw\") to change interpretation\r\n\r\n⚠️ Percentage based sizes may cause slight layout shift when server-rendering.\r\nFor more information see the documentation."
            },
            {
              "name": "groupResizeBehavior",
              "type": "\"preserve-relative-size\" | \"preserve-pixel-size\" | undefined",
              "required": false,
              "description": "How should this Panel behave if the parent Group is resized?\r\nDefaults to `preserve-relative-size`.\r\n\r\n- `preserve-relative-size`: Retain the current relative size (as a percentage of the Group)\r\n- `preserve-pixel-size`: Retain its current size (in pixels)\r\n\r\nℹ️ Panel min/max size constraints may impact this behavior.\r\n\r\n⚠️ A Group must contain at least one Panel with `preserve-relative-size` resize behavior."
            },
            {
              "name": "maxSize",
              "type": "string | number | undefined",
              "required": false,
              "description": "Maximum size of Panel within its parent group; defaults to `\"100%\"`.\r\n\r\nℹ️ Interpretation rules:\r\n- Numbers are interpreted as pixels (e.g. `maxSize={200}` is 200 pixels)\r\n- Strings without explicit units are interpreted as percentage (e.g. `maxSize=\"50\"` is 50 percent)\r\n- Use explicit units (e.g. \"px\", \"%\", \"em\", \"rem\", \"vh\", or \"vw\") to change interpretation"
            },
            {
              "name": "minSize",
              "type": "string | number | undefined",
              "required": false,
              "description": "Minimum size of Panel within its parent group; defaults to 0%.\r\n\r\nℹ️ Interpretation rules:\r\n- Numbers are interpreted as pixels (e.g. `minSize={200}` is 200 pixels)\r\n- Strings without explicit units are interpreted as percentage (e.g. `minSize=\"50\"` is 50 percent)\r\n- Use explicit units (e.g. \"px\", \"%\", \"em\", \"rem\", \"vh\", or \"vw\") to change interpretation"
            },
            {
              "name": "panelRef",
              "type": "complex",
              "required": false,
              "description": "Exposes the following imperative API:\r\n- `collapse(): void`\r\n- `expand(): void`\r\n- `getSize(): number`\r\n- `isCollapsed(): boolean`\r\n- `resize(size: number): void`\r\n\r\nℹ️ The `usePanelRef` and `usePanelCallbackRef` hooks are exported for convenience use in TypeScript projects."
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "ResizablePanelGroup",
          "props": [
            {
              "name": "autoSaveId",
              "type": "string | undefined",
              "required": false,
              "description": "Unique id for layout persistence via localStorage."
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false,
              "description": "Disable resize functionality."
            },
            {
              "name": "orientation",
              "type": "\"vertical\" | \"horizontal\" | undefined",
              "required": false,
              "description": "Specifies the resizable orientation (\"horizontal\" or \"vertical\"); defaults to \"horizontal\"",
              "defaultValue": "horizontal"
            },
            {
              "name": "defaultLayout",
              "type": "complex",
              "required": false,
              "description": "Default layout for the Group.\r\n\r\nℹ️ This value allows layouts to be remembered between page reloads.\r\n\r\n⚠️ Slight layout shift may occur when server-rendering panels with percentage-based default sizes.\r\nRefer to the documentation for suggestions on how to minimize the impact of this."
            },
            {
              "name": "groupRef",
              "type": "complex",
              "required": false,
              "description": "Exposes the following imperative API:\r\n- `getLayout(): Layout`\r\n- `setLayout(layout: Layout): void`\r\n\r\nℹ️ The `useGroupRef` and `useGroupCallbackRef` hooks are exported for convenience use in TypeScript projects."
            },
            {
              "name": "onLayoutChange",
              "type": "complex",
              "required": false,
              "description": "Called when the Group's layout is changing.\r\n\r\n⚠️ For layout changes caused by pointer events, this method is called each time the pointer is moved.\r\nFor most cases, it is recommended to use the `onLayoutChanged` callback instead."
            },
            {
              "name": "onLayoutChanged",
              "type": "complex",
              "required": false,
              "description": "Called after the Group's layout has  been changed.\r\n\r\nℹ️ For layout changes caused by pointer events, this method is not called until the pointer has been released.\r\nThis method is recommended when saving layouts to some storage api.\r\n\r\nℹ️ The second argument contains meta information about the layout change.\r\nThe `isUserInteraction` attribute signals whether the resize was caused by direct user input.\r\nIt is true for resizes caused by pointer or keyboard input\r\nand false for other triggers (e.g. imperative API calls, initial mount, etc.)\r\nThe `requestedLayout` attribute is the layout before constraints were applied for the current Group size;\r\nprefer it when persisting layouts."
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Horizontal",
          "code": "import { ResizableHandle, ResizablePanel, ResizablePanelGroup } from '@wallarm-org/design-system/Resizable';\n\nexport const Horizontal = () => (\n  <div className='h-[320px] w-[600px] rounded-8 border border-border-primary'>\n    <ResizablePanelGroup orientation='horizontal'>\n      <ResizablePanel id='left' defaultSize='50%'>\n        <div className='flex h-full items-center justify-center p-24'>\n          <span className='text-text-secondary'>Panel A</span>\n        </div>\n      </ResizablePanel>\n      <ResizableHandle />\n      <ResizablePanel id='right' defaultSize='50%'>\n        <div className='flex h-full items-center justify-center p-24'>\n          <span className='text-text-secondary'>Panel B</span>\n        </div>\n      </ResizablePanel>\n    </ResizablePanelGroup>\n  </div>\n);",
          "storyFile": "Resizable/Resizable.stories.tsx",
          "storyTitle": "Layout/Resizable",
          "description": "Two panels side by side with a resizable divider."
        },
        {
          "name": "Vertical",
          "code": "import { ResizableHandle, ResizablePanel, ResizablePanelGroup } from '@wallarm-org/design-system/Resizable';\n\nexport const Vertical = () => (\n  <div className='h-[400px] w-[400px] rounded-8 border border-border-primary'>\n    <ResizablePanelGroup orientation='vertical'>\n      <ResizablePanel id='top' defaultSize='50%'>\n        <div className='flex h-full items-center justify-center p-24'>\n          <span className='text-text-secondary'>Top</span>\n        </div>\n      </ResizablePanel>\n      <ResizableHandle />\n      <ResizablePanel id='bottom' defaultSize='50%'>\n        <div className='flex h-full items-center justify-center p-24'>\n          <span className='text-text-secondary'>Bottom</span>\n        </div>\n      </ResizablePanel>\n    </ResizablePanelGroup>\n  </div>\n);",
          "storyFile": "Resizable/Resizable.stories.tsx",
          "storyTitle": "Layout/Resizable",
          "description": "Two panels stacked vertically."
        },
        {
          "name": "ThreePanels",
          "code": "import { ResizableHandle, ResizablePanel, ResizablePanelGroup } from '@wallarm-org/design-system/Resizable';\n\nexport const ThreePanels = () => (\n  <div className='h-[320px] w-[800px] rounded-8 border border-border-primary'>\n    <ResizablePanelGroup orientation='horizontal'>\n      <ResizablePanel id='left' defaultSize='25%'>\n        <div className='flex h-full items-center justify-center p-24'>\n          <span className='text-text-secondary'>Sidebar</span>\n        </div>\n      </ResizablePanel>\n      <ResizableHandle />\n      <ResizablePanel id='center' defaultSize='50%'>\n        <div className='flex h-full items-center justify-center p-24'>\n          <span className='text-text-secondary'>Content</span>\n        </div>\n      </ResizablePanel>\n      <ResizableHandle />\n      <ResizablePanel id='right' defaultSize='25%'>\n        <div className='flex h-full items-center justify-center p-24'>\n          <span className='text-text-secondary'>Inspector</span>\n        </div>\n      </ResizablePanel>\n    </ResizablePanelGroup>\n  </div>\n);",
          "storyFile": "Resizable/Resizable.stories.tsx",
          "storyTitle": "Layout/Resizable",
          "description": "Three panels with two resize handles."
        },
        {
          "name": "Nested",
          "code": "import { ResizableHandle, ResizablePanel, ResizablePanelGroup } from '@wallarm-org/design-system/Resizable';\n\nexport const Nested = () => (\n  <div className='h-[400px] w-[700px] rounded-8 border border-border-primary'>\n    <ResizablePanelGroup orientation='horizontal'>\n      <ResizablePanel id='left' defaultSize='40%'>\n        <div className='flex h-full items-center justify-center p-24'>\n          <span className='text-text-secondary'>Sidebar</span>\n        </div>\n      </ResizablePanel>\n      <ResizableHandle />\n      <ResizablePanel id='right' defaultSize='60%'>\n        <ResizablePanelGroup orientation='vertical'>\n          <ResizablePanel id='top' defaultSize='60%'>\n            <div className='flex h-full items-center justify-center p-24'>\n              <span className='text-text-secondary'>Editor</span>\n            </div>\n          </ResizablePanel>\n          <ResizableHandle />\n          <ResizablePanel id='bottom' defaultSize='40%'>\n            <div className='flex h-full items-center justify-center p-24'>\n              <span className='text-text-secondary'>Terminal</span>\n            </div>\n          </ResizablePanel>\n        </ResizablePanelGroup>\n      </ResizablePanel>\n    </ResizablePanelGroup>\n  </div>\n);",
          "storyFile": "Resizable/Resizable.stories.tsx",
          "storyTitle": "Layout/Resizable",
          "description": "A horizontal group with a vertical sub-group nested inside one panel."
        },
        {
          "name": "Collapsible",
          "code": "import { ResizableHandle, ResizablePanel, ResizablePanelGroup } from '@wallarm-org/design-system/Resizable';\n\nexport const Collapsible = () => (\n  <div className='h-[320px] w-[600px] rounded-8 border border-border-primary'>\n    <ResizablePanelGroup orientation='horizontal'>\n      <ResizablePanel id='sidebar' defaultSize='30%' collapsible minSize='15%' collapsedSize='0%'>\n        <div className='flex h-full items-center justify-center p-24'>\n          <span className='text-text-secondary'>Collapsible</span>\n        </div>\n      </ResizablePanel>\n      <ResizableHandle />\n      <ResizablePanel id='content' defaultSize='70%'>\n        <div className='flex h-full items-center justify-center p-24'>\n          <span className='text-text-secondary'>Content</span>\n        </div>\n      </ResizablePanel>\n    </ResizablePanelGroup>\n  </div>\n);",
          "storyFile": "Resizable/Resizable.stories.tsx",
          "storyTitle": "Layout/Resizable",
          "description": "A panel that can be collapsed by dragging past its minimum size. Double-click the handle to reset."
        },
        {
          "name": "WithConstraints",
          "code": "import { ResizableHandle, ResizablePanel, ResizablePanelGroup } from '@wallarm-org/design-system/Resizable';\n\nexport const WithConstraints = () => (\n  <div className='h-[320px] w-[600px] rounded-8 border border-border-primary'>\n    <ResizablePanelGroup orientation='horizontal'>\n      <ResizablePanel id='constrained' defaultSize='40%' minSize='20%' maxSize='60%'>\n        <div className='flex h-full items-center justify-center p-24'>\n          <span className='text-text-secondary'>Min 20% / Max 60%</span>\n        </div>\n      </ResizablePanel>\n      <ResizableHandle />\n      <ResizablePanel id='flexible' defaultSize='60%'>\n        <div className='flex h-full items-center justify-center p-24'>\n          <span className='text-text-secondary'>Flexible</span>\n        </div>\n      </ResizablePanel>\n    </ResizablePanelGroup>\n  </div>\n);",
          "storyFile": "Resizable/Resizable.stories.tsx",
          "storyTitle": "Layout/Resizable",
          "description": "Panels with minimum and maximum size constraints."
        },
        {
          "name": "WithTooltip",
          "code": "import { ResizableHandle, ResizablePanel, ResizablePanelGroup } from '@wallarm-org/design-system/Resizable';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@wallarm-org/design-system/Tooltip';\n\nexport const WithTooltip = () => (\n  <div className='h-[320px] w-[600px] rounded-8 border border-border-primary'>\n    <ResizablePanelGroup orientation='horizontal'>\n      <ResizablePanel id='left' defaultSize='50%'>\n        <div className='flex h-full items-center justify-center p-24'>\n          <span className='text-text-secondary'>Panel A</span>\n        </div>\n      </ResizablePanel>\n      <Tooltip positioning={{ placement: 'right' }}>\n        <TooltipTrigger asChild>\n          <ResizableHandle />\n        </TooltipTrigger>\n        <TooltipContent>Drag to resize</TooltipContent>\n      </Tooltip>\n      <ResizablePanel id='right' defaultSize='50%'>\n        <div className='flex h-full items-center justify-center p-24'>\n          <span className='text-text-secondary'>Panel B</span>\n        </div>\n      </ResizablePanel>\n    </ResizablePanelGroup>\n  </div>\n);",
          "storyFile": "Resizable/Resizable.stories.tsx",
          "storyTitle": "Layout/Resizable",
          "description": "A \"Drag to resize\" tooltip appears on hover, like the Drawer resize handle."
        },
        {
          "name": "WithOverflowList",
          "code": "import { OverflowList } from '@wallarm-org/design-system/OverflowList';\nimport { ResizableHandle, ResizablePanel, ResizablePanelGroup } from '@wallarm-org/design-system/Resizable';\nimport { Tag } from '@wallarm-org/design-system/Tag';\n\nexport const WithOverflowList = () => (\n  <div className='h-[320px] w-[600px] rounded-8 border border-border-primary'>\n    <ResizablePanelGroup orientation='horizontal'>\n      <ResizablePanel id='tags' defaultSize='50%' minSize='20%'>\n        <div className='flex h-full items-center p-16'>\n          <OverflowList\n            className='gap-4'\n            items={OVERFLOW_TAGS}\n            itemRenderer={item => <Tag key={item}>{item}</Tag>}\n          />\n        </div>\n      </ResizablePanel>\n      <ResizableHandle />\n      <ResizablePanel id='content' defaultSize='50%'>\n        <div className='flex h-full items-center justify-center p-24'>\n          <span className='text-text-secondary'>Content</span>\n        </div>\n      </ResizablePanel>\n    </ResizablePanelGroup>\n  </div>\n);",
          "storyFile": "Resizable/Resizable.stories.tsx",
          "storyTitle": "Layout/Resizable",
          "description": "Resizing with content that reflows — the tag list adapts live as the panel width changes. Overflow items appear in a popover."
        }
      ]
    },
    {
      "name": "ResponseCode",
      "description": "Renders an HTTP status code as a code `Badge` coloured by its class — green for success, blue for a redirect, amber for a client error, red for a server error, slate for informational. A mask counts as well as a number, so `2XX` or `40X` from a filter suggestion takes the colour of its leading digit, and anything outside 100–599 falls back to slate rather than guessing. Pairs with `HttpMethod`.",
      "importPath": "@wallarm-org/design-system/ResponseCode",
      "props": [
        {
          "name": "code",
          "type": "string | number",
          "required": true,
          "description": "HTTP response status code. The category (1xx/2xx/3xx/4xx/5xx) is derived\nfrom the first digit and decides the Badge color via `RESPONSE_CODE_COLOR`.\nValues outside 100–599 render in slate as the \"unknown\" fallback."
        },
        {
          "name": "size",
          "type": "\"small\" | \"medium\" | \"large\" | null | undefined",
          "required": false,
          "description": "Badge size — defaults to `medium`.",
          "defaultValue": "medium"
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [],
      "examples": [
        {
          "name": "Playground",
          "code": "import { ResponseCode } from '@wallarm-org/design-system/ResponseCode';\n\nexport const Playground = () => <ResponseCode />;",
          "storyFile": "ResponseCode/ResponseCode.stories.tsx",
          "storyTitle": "Data Display/ResponseCode",
          "description": "One badge on the controls, for checking which class a particular code lands in."
        },
        {
          "name": "AllCategories",
          "code": "import { ResponseCode } from '@wallarm-org/design-system/ResponseCode';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const AllCategories = () => (\n  <VStack align='start' gap={8}>\n    <ResponseCode code={100} />\n    <ResponseCode code={200} />\n    <ResponseCode code={300} />\n    <ResponseCode code={400} />\n    <ResponseCode code={500} />\n  </VStack>\n);",
          "storyFile": "ResponseCode/ResponseCode.stories.tsx",
          "storyTitle": "Data Display/ResponseCode",
          "description": "The five classes at their round numbers. This is the colour vocabulary, and like\n`HttpMethod` it is fixed rather than chosen per screen."
        },
        {
          "name": "RealWorldCodes",
          "code": "import { ResponseCode } from '@wallarm-org/design-system/ResponseCode';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const RealWorldCodes = () => (\n  <VStack align='start' gap={8}>\n    <HStack gap={8}>\n      <ResponseCode code={100} />\n      <ResponseCode code={101} />\n    </HStack>\n    <HStack gap={8}>\n      <ResponseCode code={200} />\n      <ResponseCode code={201} />\n      <ResponseCode code={204} />\n    </HStack>\n    <HStack gap={8}>\n      <ResponseCode code={301} />\n      <ResponseCode code={302} />\n      <ResponseCode code={304} />\n    </HStack>\n    <HStack gap={8}>\n      <ResponseCode code={400} />\n      <ResponseCode code={401} />\n      <ResponseCode code={403} />\n      <ResponseCode code={404} />\n      <ResponseCode code={429} />\n    </HStack>\n    <HStack gap={8}>\n      <ResponseCode code={500} />\n      <ResponseCode code={502} />\n      <ResponseCode code={503} />\n      <ResponseCode code={504} />\n    </HStack>\n  </VStack>\n);",
          "storyFile": "ResponseCode/ResponseCode.stories.tsx",
          "storyTitle": "Data Display/ResponseCode",
          "description": "The codes that actually turn up in logs, a row per class — every code in a row shares its\ncolour, so the eye sorts by severity before it reads the number."
        },
        {
          "name": "Sizes",
          "code": "import { ResponseCode } from '@wallarm-org/design-system/ResponseCode';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Sizes = () => (\n  <VStack gap={16}>\n    <HStack align='center' gap={8}>\n      <ResponseCode code={100} size='medium' />\n      <ResponseCode code={200} size='medium' />\n      <ResponseCode code={301} size='medium' />\n      <ResponseCode code={404} size='medium' />\n      <ResponseCode code={500} size='medium' />\n    </HStack>\n    <HStack align='center' gap={8}>\n      <ResponseCode code={100} size='large' />\n      <ResponseCode code={200} size='large' />\n      <ResponseCode code={301} size='large' />\n      <ResponseCode code={404} size='large' />\n      <ResponseCode code={500} size='large' />\n    </HStack>\n  </VStack>\n);",
          "storyFile": "ResponseCode/ResponseCode.stories.tsx",
          "storyTitle": "Data Display/ResponseCode",
          "description": "`medium` is the default; `large` adds vertical padding and leaves the code type where it\nis, exactly as on `HttpMethod`."
        },
        {
          "name": "WildcardGroups",
          "code": "import { ResponseCode } from '@wallarm-org/design-system/ResponseCode';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const WildcardGroups = () => (\n  <VStack align='start' gap={8}>\n    <ResponseCode code='1XX' />\n    <ResponseCode code='2XX' />\n    <ResponseCode code='3XX' />\n    <ResponseCode code='4XX' />\n    <ResponseCode code='5XX' />\n  </VStack>\n);",
          "storyFile": "ResponseCode/ResponseCode.stories.tsx",
          "storyTitle": "Data Display/ResponseCode",
          "description": "The wildcard forms, which is what a filter chip shows when the query matches a whole\nclass rather than one code."
        },
        {
          "name": "UnknownCodeFallsBackToSlate",
          "code": "import { ResponseCode } from '@wallarm-org/design-system/ResponseCode';\nimport { HStack } from '@wallarm-org/design-system/Stack';\n\nexport const UnknownCodeFallsBackToSlate = () => (\n  <HStack align='center' gap={8}>\n    <ResponseCode code={0} />\n    <ResponseCode code={42} />\n    <ResponseCode code={999} />\n    <ResponseCode code='???' />\n  </HStack>\n);",
          "storyFile": "ResponseCode/ResponseCode.stories.tsx",
          "storyTitle": "Data Display/ResponseCode",
          "description": "`0`, `42`, `999` and `???` all fall outside 100–599, so each is printed verbatim in slate\n— an unrecognised code is shown, never swallowed."
        }
      ]
    },
    {
      "name": "ScrollArea",
      "description": "A scroll container with the house scrollbar instead of the browser’s: compose `ScrollAreaViewport` › `ScrollAreaContent`, then one `ScrollAreaScrollbar` per axis and a `ScrollAreaCorner` where two of them meet. It can only scroll inside a bounded parent, so give the wrapper a height or a width — with nothing to overflow, the content simply grows.",
      "importPath": "@wallarm-org/design-system/ScrollArea",
      "props": [
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "ids",
          "type": "ElementIds | undefined",
          "required": false,
          "description": "The ids of the scroll area elements"
        },
        {
          "name": "asChild",
          "type": "boolean | undefined",
          "required": false,
          "description": "Use the provided child element as the default rendered element, combining their props and behavior."
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [
        {
          "name": "ScrollAreaContent",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "description": "Use the provided child element as the default rendered element, combining their props and behavior."
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "ScrollAreaCorner",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "description": "Use the provided child element as the default rendered element, combining their props and behavior."
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "ScrollAreaScrollbar",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "description": "Use the provided child element as the default rendered element, combining their props and behavior."
            },
            {
              "name": "orientation",
              "type": "Orientation | undefined",
              "required": false,
              "defaultValue": "vertical"
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "ScrollAreaViewport",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "description": "Use the provided child element as the default rendered element, combining their props and behavior."
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Vertical",
          "code": "import { ScrollArea, ScrollAreaContent, ScrollAreaCorner, ScrollAreaScrollbar, ScrollAreaViewport } from '@wallarm-org/design-system/ScrollArea';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Vertical = () => (\n  <div className='w-320 h-320 overflow-hidden'>\n    <ScrollArea>\n      <ScrollAreaViewport>\n        <ScrollAreaContent>\n          <VStack>\n            {new Array(50).fill(null).map((_, index) => {\n              const value = `${index + 1}`;\n\n              return (\n                <Box key={value} className='h-40 w-full'>\n                  {value}\n                </Box>\n              );\n            })}\n          </VStack>\n        </ScrollAreaContent>\n      </ScrollAreaViewport>\n\n      <ScrollAreaScrollbar />\n\n      <ScrollAreaCorner />\n    </ScrollArea>\n  </div>\n);",
          "storyFile": "ScrollArea/ScrollArea.stories.tsx",
          "storyTitle": "Layout/ScrollArea",
          "description": "The default vertical bar, inside a 320px box that gives the fifty rows something to overflow."
        },
        {
          "name": "Horizontal",
          "code": "import { ScrollArea, ScrollAreaContent, ScrollAreaCorner, ScrollAreaScrollbar, ScrollAreaViewport } from '@wallarm-org/design-system/ScrollArea';\nimport { HStack } from '@wallarm-org/design-system/Stack';\n\nexport const Horizontal = () => (\n  <div className='w-320 h-320 overflow-hidden'>\n    <ScrollArea>\n      <ScrollAreaViewport>\n        <ScrollAreaContent>\n          <HStack>\n            {new Array(50).fill(null).map((_, index) => {\n              const value = `${index + 1}`;\n\n              return (\n                <Box key={value} className='h-320 w-40'>\n                  {value}\n                </Box>\n              );\n            })}\n          </HStack>\n        </ScrollAreaContent>\n      </ScrollAreaViewport>\n\n      <ScrollAreaScrollbar orientation='horizontal' />\n\n      <ScrollAreaCorner />\n    </ScrollArea>\n  </div>\n);",
          "storyFile": "ScrollArea/ScrollArea.stories.tsx",
          "storyTitle": "Layout/ScrollArea",
          "description": "`orientation='horizontal'` puts the bar along the bottom edge, for a row that runs past its container rather than a column that runs below it."
        },
        {
          "name": "Virtualized",
          "code": "import { useRef } from 'react';\nimport { useVirtualizer } from '@tanstack/react-virtual';\nimport { ScrollArea, ScrollAreaContent, ScrollAreaCorner, ScrollAreaScrollbar, ScrollAreaViewport } from '@wallarm-org/design-system/ScrollArea';\n\nexport const Virtualized = () => {\n  const scrollRef = useRef<HTMLDivElement>(null);\n  const virtualizer = useVirtualizer({\n    count: 10_000,\n    getScrollElement: () => scrollRef.current,\n    estimateSize: () => 44,\n    overscan: 8,\n  });\n\n  return (\n    <div className='w-320 h-320 overflow-hidden'>\n      <ScrollArea>\n        <ScrollAreaViewport ref={scrollRef}>\n          <ScrollAreaContent className='h-auto min-h-full'>\n            <div className='relative w-full' style={{ height: virtualizer.getTotalSize() }}>\n              {virtualizer.getVirtualItems().map(item => (\n                <div\n                  key={item.key}\n                  className='absolute top-0 left-0 w-full pb-4'\n                  style={{ height: item.size, transform: `translateY(${item.start}px)` }}\n                >\n                  <Box className='h-full w-full'>{item.index + 1}</Box>\n                </div>\n              ))}\n            </div>\n          </ScrollAreaContent>\n        </ScrollAreaViewport>\n\n        <ScrollAreaScrollbar />\n\n        <ScrollAreaCorner />\n      </ScrollArea>\n    </div>\n  );\n};",
          "storyFile": "ScrollArea/ScrollArea.stories.tsx",
          "storyTitle": "Layout/ScrollArea",
          "description": "`ScrollAreaViewport` forwards its `ref` to the scrolling element itself, so a row\nvirtualiser such as `@tanstack/react-virtual` can track scroll position inside the\nhouse scrollbar instead of falling back to a bare `overflow-y: auto` div. Ten thousand\nrows here, a few dozen in the DOM.\n\nTwo things this story is deliberately showing:\n\n- `useVirtualizer` is called in the same component that declares the ref. Called from a\n  component rendered *inside* the viewport, `getScrollElement()` runs once — before React\n  has attached the host element's ref — returns `null`, and nothing ever re-runs it, so the\n  list stays permanently empty.\n- `ScrollAreaContent` gets `h-auto min-h-full` so it grows with the virtual sizer. The\n  scrollbar is only rendered while the viewport reports `data-overflow-y`, and that flag is\n  recomputed from a `ResizeObserver` watching the content box — which at its default `h-full`\n  stays the height of the viewport. A list that grows *after* mount therefore keeps its\n  scrollbar hidden until something else forces a remeasure."
        }
      ]
    },
    {
      "name": "SearchInput",
      "description": "A search field with a magnifying-glass icon and a clear button that appears once there is a value. Controlled only — pass `value` and `onChange`, and optionally `onClear` to react to the clear button specifically.",
      "importPath": "@wallarm-org/design-system/SearchInput",
      "props": [
        {
          "name": "value",
          "type": "string",
          "required": true,
          "description": "Current search value (controlled)."
        },
        {
          "name": "onChange",
          "type": "(value: string) => void",
          "required": true,
          "description": "Called when the value changes (typing or clearing)."
        },
        {
          "name": "onClear",
          "type": "(() => void) | undefined",
          "required": false,
          "description": "Called when the clear button is clicked. Fires before onChange('')."
        },
        {
          "name": "size",
          "type": "SearchInputSize | undefined",
          "required": false,
          "description": "Input size variant.",
          "defaultValue": "default"
        },
        {
          "name": "disabled",
          "type": "boolean | undefined",
          "required": false,
          "description": "@default false",
          "defaultValue": "false"
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "pattern",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "name",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "alt",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "height",
          "type": "string | number | undefined",
          "required": false
        },
        {
          "name": "src",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "width",
          "type": "string | number | undefined",
          "required": false
        },
        {
          "name": "autoComplete",
          "type": "HTMLInputAutoCompleteAttribute | undefined",
          "required": false
        },
        {
          "name": "maxLength",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "minLength",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "placeholder",
          "type": "string | undefined",
          "required": false,
          "defaultValue": "Search"
        },
        {
          "name": "readOnly",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "required",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "checked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "step",
          "type": "string | number | undefined",
          "required": false
        },
        {
          "name": "accept",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "max",
          "type": "string | number | undefined",
          "required": false
        },
        {
          "name": "min",
          "type": "string | number | undefined",
          "required": false
        },
        {
          "name": "multiple",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [],
      "examples": [
        {
          "name": "Basic",
          "code": "import { useState } from 'react';\nimport { SearchInput } from '@wallarm-org/design-system/SearchInput';\n\nexport const Basic = () => {\n  const [value, setValue] = useState('');\n  return <SearchInput value={value} onChange={setValue} />;\n};",
          "storyFile": "SearchInput/SearchInput.stories.tsx",
          "storyTitle": "Inputs/SearchInput",
          "description": "Empty by default — the search icon is always visible, and the placeholder reads \"Search\"."
        },
        {
          "name": "WithValue",
          "code": "import { useState } from 'react';\nimport { SearchInput } from '@wallarm-org/design-system/SearchInput';\n\nexport const WithValue = () => {\n  const [value, setValue] = useState('attacks');\n  return <SearchInput value={value} onChange={setValue} onClear={fn()} />;\n};",
          "storyFile": "SearchInput/SearchInput.stories.tsx",
          "storyTitle": "Inputs/SearchInput",
          "description": "When the field has a value the clear button appears at the inline end.\nClicking it fires `onClear`, then `onChange('')`."
        },
        {
          "name": "CustomPlaceholder",
          "code": "import { useState } from 'react';\nimport { SearchInput } from '@wallarm-org/design-system/SearchInput';\n\nexport const CustomPlaceholder = () => {\n  const [value, setValue] = useState('');\n  return <SearchInput value={value} onChange={setValue} placeholder='Filter by name…' />;\n};",
          "storyFile": "SearchInput/SearchInput.stories.tsx",
          "storyTitle": "Inputs/SearchInput",
          "description": "A custom placeholder when \"Search\" is not descriptive enough."
        },
        {
          "name": "Disabled",
          "code": "import { useState } from 'react';\nimport { SearchInput } from '@wallarm-org/design-system/SearchInput';\n\nexport const Disabled = () => {\n  const [value, setValue] = useState('locked query');\n  return <SearchInput value={value} onChange={setValue} disabled />;\n};",
          "storyFile": "SearchInput/SearchInput.stories.tsx",
          "storyTitle": "Inputs/SearchInput",
          "description": "Dimmed, with the clear button hidden even when a value is present — there is nothing the\nreader can act on."
        },
        {
          "name": "Sizes",
          "code": "import { useState } from 'react';\nimport { SearchInput } from '@wallarm-org/design-system/SearchInput';\nimport { HStack } from '@wallarm-org/design-system/Stack';\n\nexport const Sizes = () => {\n  const [d, setD] = useState('');\n  const [m, setM] = useState('');\n  const [s, setS] = useState('');\n\n  return (\n    <HStack gap={16} align='start'>\n      <SearchInput value={d} onChange={setD} placeholder='Default' size='default' />\n      <SearchInput value={m} onChange={setM} placeholder='Medium' size='medium' />\n      <SearchInput value={s} onChange={setS} placeholder='Small' size='small' />\n    </HStack>\n  );\n};",
          "storyFile": "SearchInput/SearchInput.stories.tsx",
          "storyTitle": "Inputs/SearchInput",
          "description": "The same height scale as `Input`, so a search field lines up with the fields around it."
        }
      ]
    },
    {
      "name": "SearchModal",
      "description": "A command-palette dialog opened with Cmd+K (Ctrl+K on Windows/Linux). Provides a search input, grouped item lists, keyboard navigation, and a footer with keyboard hints. Content is consumer-assembled: the component is a composable shell, not a hard-wired feature.",
      "importPath": "@wallarm-org/design-system/SearchModal",
      "props": [
        {
          "name": "open",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "onOpenChange",
          "type": "((open: boolean) => void) | undefined",
          "required": false
        },
        {
          "name": "onQueryChange",
          "type": "((query: string) => void) | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "active",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        },
        {
          "name": "disabled",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        }
      ],
      "subComponents": [
        {
          "name": "SearchModalBody",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "SearchModalContent",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "SearchModalEmpty",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "SearchModalFooter",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "SearchModalGroup",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "SearchModalGroupLabel",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "SearchModalInput",
          "props": [
            {
              "name": "loading",
              "type": "boolean | undefined",
              "required": false,
              "description": "Show a loading spinner replacing the search icon",
              "defaultValue": "false"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "pattern",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "HTMLInputTypeAttribute | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "alt",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "height",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "src",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "width",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "autoComplete",
              "type": "HTMLInputAutoCompleteAttribute | undefined",
              "required": false
            },
            {
              "name": "maxLength",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "minLength",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "placeholder",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "readOnly",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "required",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "checked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "step",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "accept",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "max",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "min",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "multiple",
              "type": "boolean | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "SearchModalItem",
          "props": [
            {
              "name": "onSelect",
              "type": "(() => void) | undefined",
              "required": false,
              "description": "Called when the item is selected (Enter key or click)"
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false,
              "description": "Whether this item is disabled",
              "defaultValue": "false"
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "description": "Render as child element (e.g. for <a> links)",
              "defaultValue": "false"
            },
            {
              "name": "closeOnSelect",
              "type": "boolean | undefined",
              "required": false,
              "description": "Whether selecting this item closes the modal (default: true)",
              "defaultValue": "true"
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "SearchModalTrigger",
          "props": [
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "description": "Render as child element"
            },
            {
              "name": "value",
              "type": "string | undefined",
              "required": false,
              "description": "Native button value attribute (string only, matching Ark UI's Dialog.Trigger)"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Basic",
          "code": "import { useMemo, useState } from 'react';\nimport { ChevronRight, Plus, Search, Users } from '@wallarm-org/design-system/icons';\nimport { SearchModal, SearchModalBody, SearchModalContent, SearchModalEmpty, SearchModalFooter, SearchModalGroup, SearchModalGroupLabel, SearchModalInput, SearchModalItem } from '@wallarm-org/design-system/SearchModal';\nimport { Text } from '@wallarm-org/design-system/Text';\nimport { WallyIcon } from '@wallarm-org/design-system/WallyIcon';\n\nexport const Basic = () => {\n  const [open, setOpen] = useState(false);\n  const [query, setQuery] = useState('');\n\n  const filteredRecents = useMemo(() => filterItems(RECENT_ITEMS, query), [query]);\n  const filteredJumpTo = useMemo(() => filterItems(JUMP_TO_ITEMS, query), [query]);\n  const hasResults = filteredRecents.length > 0 || filteredJumpTo.length > 0;\n\n  return (\n    <SearchModal open={open} onOpenChange={setOpen} onQueryChange={setQuery} data-testid='search'>\n      <SearchTriggerButton />\n      <SearchModalContent>\n        <SearchModalInput placeholder='Search products, features, and more\\u2026' />\n        <SearchModalBody>\n          <SearchModalGroup>\n            <SearchModalGroupLabel>\n              <Text size='xs' color='secondary' weight='medium'>\n                Quick actions\n              </Text>\n            </SearchModalGroupLabel>\n            <SearchModalItem onSelect={noop}>\n              <WallyIcon variant='circle' size='sm' />\n              <Text size='sm'>{query ? `Ask Wally \"${query}\"` : 'Ask Wally'}</Text>\n            </SearchModalItem>\n            {!query && (\n              <>\n                <SearchModalItem onSelect={noop}>\n                  <Users className='!icon-md' />\n                  <Text size='sm'>Switch tenant</Text>\n                </SearchModalItem>\n                <SearchModalItem onSelect={noop}>\n                  <Plus className='!icon-md' />\n                  <Text size='sm'>Create&hellip;</Text>\n                </SearchModalItem>\n              </>\n            )}\n          </SearchModalGroup>\n\n          {filteredRecents.length > 0 && (\n            <SearchModalGroup>\n              <SearchModalGroupLabel>\n                <Text size='xs' color='secondary' weight='medium'>\n                  Recent\n                </Text>\n              </SearchModalGroupLabel>\n              {filteredRecents.map(item => (\n                <SearchModalItem key={item.id} onSelect={noop}>\n                  {item.icon}\n                  <Text size='sm'>{item.label}</Text>\n                  <span className='ml-auto'>\n                    <Text size='xs' color='secondary'>\n                      {item.date}\n                    </Text>\n                  </span>\n                </SearchModalItem>\n              ))}\n            </SearchModalGroup>\n          )}\n\n          {(hasResults || !query) && (\n            <SearchModalGroup>\n              <SearchModalGroupLabel>\n                <Text size='xs' color='secondary' weight='medium'>\n                  {query ? 'Go to' : 'Jump to'}\n                </Text>\n              </SearchModalGroupLabel>\n              {(query ? filteredJumpTo : JUMP_TO_ITEMS).map(item => (\n                <SearchModalItem key={item.id} onSelect={noop}>\n                  {item.icon}\n                  <Text size='sm'>{item.label}</Text>\n                  <ChevronRight className='text-text-tertiary ml-auto !icon-sm' />\n                </SearchModalItem>\n              ))}\n            </SearchModalGroup>\n          )}\n\n          {query && !hasResults && (\n            <SearchModalGroup>\n              <SearchModalEmpty>\n                <Text size='sm' color='secondary'>\n                  No results\n                </Text>\n              </SearchModalEmpty>\n            </SearchModalGroup>\n          )}\n        </SearchModalBody>\n        <SearchModalFooter />\n      </SearchModalContent>\n    </SearchModal>\n  );\n};",
          "storyFile": "SearchModal/SearchModal.stories.tsx",
          "storyTitle": "Navigation/SearchModal",
          "description": "The full palette with recent history. Type to filter: \"Jump to\" relabels to\n\"Go to\", recents hide when nothing matches, and a no-results fallback offers\nAsk Wally. Covers PRD states 1, 3, 4 and 5."
        },
        {
          "name": "EmptyRecents",
          "code": "import { useMemo, useState } from 'react';\nimport { ChevronRight, Plus, Search, Users } from '@wallarm-org/design-system/icons';\nimport { SearchModal, SearchModalBody, SearchModalContent, SearchModalEmpty, SearchModalFooter, SearchModalGroup, SearchModalGroupLabel, SearchModalInput, SearchModalItem } from '@wallarm-org/design-system/SearchModal';\nimport { Text } from '@wallarm-org/design-system/Text';\nimport { WallyIcon } from '@wallarm-org/design-system/WallyIcon';\n\nexport const EmptyRecents = () => {\n  const [open, setOpen] = useState(false);\n  const [query, setQuery] = useState('');\n\n  const filteredJumpTo = useMemo(() => filterItems(JUMP_TO_ITEMS, query), [query]);\n\n  return (\n    <SearchModal open={open} onOpenChange={setOpen} onQueryChange={setQuery}>\n      <SearchTriggerButton />\n      <SearchModalContent>\n        <SearchModalInput placeholder='Search products, features, and more\\u2026' />\n        <SearchModalBody>\n          <SearchModalGroup>\n            <SearchModalGroupLabel>\n              <Text size='xs' color='secondary' weight='medium'>\n                Quick actions\n              </Text>\n            </SearchModalGroupLabel>\n            <SearchModalItem onSelect={noop}>\n              <WallyIcon variant='circle' size='sm' />\n              <Text size='sm'>{query ? `Ask Wally \"${query}\"` : 'Ask Wally'}</Text>\n            </SearchModalItem>\n            {!query && (\n              <>\n                <SearchModalItem onSelect={noop}>\n                  <Users className='!icon-md' />\n                  <Text size='sm'>Switch tenant</Text>\n                </SearchModalItem>\n                <SearchModalItem onSelect={noop}>\n                  <Plus className='!icon-md' />\n                  <Text size='sm'>Create&hellip;</Text>\n                </SearchModalItem>\n              </>\n            )}\n          </SearchModalGroup>\n\n          {!query && (\n            <SearchModalGroup>\n              <SearchModalGroupLabel>\n                <Text size='xs' color='secondary' weight='medium'>\n                  Recent\n                </Text>\n              </SearchModalGroupLabel>\n              <SearchModalEmpty>\n                <Text size='sm' color='secondary'>\n                  Nothing recent yet\n                </Text>\n              </SearchModalEmpty>\n            </SearchModalGroup>\n          )}\n\n          {filteredJumpTo.length > 0 && (\n            <SearchModalGroup>\n              <SearchModalGroupLabel>\n                <Text size='xs' color='secondary' weight='medium'>\n                  {query ? 'Go to' : 'Jump to'}\n                </Text>\n              </SearchModalGroupLabel>\n              {filteredJumpTo.map(item => (\n                <SearchModalItem key={item.id} onSelect={noop}>\n                  {item.icon}\n                  <Text size='sm'>{item.label}</Text>\n                  <ChevronRight className='text-text-tertiary ml-auto !icon-sm' />\n                </SearchModalItem>\n              ))}\n            </SearchModalGroup>\n          )}\n\n          {query && filteredJumpTo.length === 0 && (\n            <SearchModalGroup>\n              <SearchModalEmpty>\n                <Text size='sm' color='secondary'>\n                  No results\n                </Text>\n              </SearchModalEmpty>\n            </SearchModalGroup>\n          )}\n        </SearchModalBody>\n        <SearchModalFooter />\n      </SearchModalContent>\n    </SearchModal>\n  );\n};",
          "storyFile": "SearchModal/SearchModal.stories.tsx",
          "storyTitle": "Navigation/SearchModal",
          "description": "A new user with no history. The Recent section shows \"Nothing recent yet\"\ninstead of items. Matches PRD state 2."
        },
        {
          "name": "SubList",
          "code": "import { useMemo, useState } from 'react';\nimport { Kbd } from '@wallarm-org/design-system/Kbd';\nimport { SearchModal, SearchModalBody, SearchModalContent, SearchModalEmpty, SearchModalFooter, SearchModalGroup, SearchModalGroupLabel, SearchModalInput, SearchModalItem } from '@wallarm-org/design-system/SearchModal';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const SubList = () => {\n  const [open, setOpen] = useState(false);\n  const [query, setQuery] = useState('');\n\n  const filtered = useMemo(() => filterItems(CREATE_ITEMS, query), [query]);\n  const grouped = useMemo(() => {\n    const map = new Map<string, NavItem[]>();\n    for (const item of filtered) {\n      const key = item.section ?? 'Other';\n      const list = map.get(key);\n      if (list) list.push(item);\n      else map.set(key, [item]);\n    }\n    return map;\n  }, [filtered]);\n\n  return (\n    <SearchModal open={open} onOpenChange={setOpen} onQueryChange={setQuery}>\n      <SearchTriggerButton />\n      <SearchModalContent>\n        <SearchModalInput placeholder='Filter creatable items\\u2026' />\n        <SearchModalBody>\n          {filtered.length > 0 ? (\n            [...grouped.entries()].map(([section, items]) => (\n              <SearchModalGroup key={section}>\n                <SearchModalGroupLabel>\n                  <Text size='xs' color='secondary' weight='medium'>\n                    {section}\n                  </Text>\n                </SearchModalGroupLabel>\n                {items.map(item => (\n                  <SearchModalItem key={item.id} onSelect={noop}>\n                    {item.icon}\n                    <Text size='sm'>{item.label}</Text>\n                  </SearchModalItem>\n                ))}\n              </SearchModalGroup>\n            ))\n          ) : (\n            <SearchModalGroup>\n              <SearchModalEmpty>\n                <Text size='sm' color='secondary'>\n                  No results\n                </Text>\n              </SearchModalEmpty>\n            </SearchModalGroup>\n          )}\n        </SearchModalBody>\n        <SearchModalFooter>\n          <span className='inline-flex items-center gap-4'>\n            <Kbd size='xsmall'>esc</Kbd>\n            <Text size='xs' color='secondary'>\n              back\n            </Text>\n          </span>\n          <span className='inline-flex items-center gap-4'>\n            <Kbd size='xsmall'>&crarr;</Kbd>\n            <Text size='xs' color='secondary'>\n              to select\n            </Text>\n          </span>\n        </SearchModalFooter>\n      </SearchModalContent>\n    </SearchModal>\n  );\n};",
          "storyFile": "SearchModal/SearchModal.stories.tsx",
          "storyTitle": "Navigation/SearchModal",
          "description": "A sub-list page pushed in place of the main body. Used for \"Create\\u2026\" and\n\"Switch tenant\". The footer changes to show \"esc back\" and \"enter to select\".\nDemonstrates PRD states 6 and 7."
        },
        {
          "name": "ItemsAsLinks",
          "code": "import { useMemo, useState } from 'react';\nimport { ChevronRight, Search } from '@wallarm-org/design-system/icons';\nimport { SearchModal, SearchModalBody, SearchModalContent, SearchModalEmpty, SearchModalFooter, SearchModalGroup, SearchModalGroupLabel, SearchModalInput, SearchModalItem } from '@wallarm-org/design-system/SearchModal';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const ItemsAsLinks = () => {\n  const [open, setOpen] = useState(false);\n  const [query, setQuery] = useState('');\n\n  const filtered = useMemo(() => filterItems(JUMP_TO_ITEMS, query), [query]);\n\n  return (\n    <SearchModal open={open} onOpenChange={setOpen} onQueryChange={setQuery}>\n      <SearchTriggerButton />\n      <SearchModalContent>\n        <SearchModalInput placeholder='Search products, features, and more\\u2026' />\n        <SearchModalBody>\n          {filtered.length > 0 ? (\n            <SearchModalGroup>\n              <SearchModalGroupLabel>\n                <Text size='xs' color='secondary' weight='medium'>\n                  {query ? 'Go to' : 'Jump to'}\n                </Text>\n              </SearchModalGroupLabel>\n              {filtered.map(item => (\n                <SearchModalItem key={item.id} asChild onSelect={noop}>\n                  <a href={`#${item.id}`}>\n                    {item.icon}\n                    <Text size='sm'>{item.label}</Text>\n                    <ChevronRight className='text-text-tertiary ml-auto !icon-sm' />\n                  </a>\n                </SearchModalItem>\n              ))}\n            </SearchModalGroup>\n          ) : (\n            <SearchModalGroup>\n              <SearchModalEmpty>\n                <Text size='sm' color='secondary'>\n                  No results\n                </Text>\n              </SearchModalEmpty>\n            </SearchModalGroup>\n          )}\n        </SearchModalBody>\n        <SearchModalFooter />\n      </SearchModalContent>\n    </SearchModal>\n  );\n};",
          "storyFile": "SearchModal/SearchModal.stories.tsx",
          "storyTitle": "Navigation/SearchModal",
          "description": "Items rendered as links via `asChild`, for cases where results navigate to a URL."
        },
        {
          "name": "DisabledItems",
          "code": "import { useMemo, useState } from 'react';\nimport { Plus, Search, Users } from '@wallarm-org/design-system/icons';\nimport { SearchModal, SearchModalBody, SearchModalContent, SearchModalEmpty, SearchModalFooter, SearchModalGroup, SearchModalGroupLabel, SearchModalInput, SearchModalItem } from '@wallarm-org/design-system/SearchModal';\nimport { Text } from '@wallarm-org/design-system/Text';\nimport { WallyIcon } from '@wallarm-org/design-system/WallyIcon';\n\nexport const DisabledItems = () => {\n  const [open, setOpen] = useState(false);\n  const [query, setQuery] = useState('');\n\n  const actions = useMemo(\n    () =>\n      filterItems(\n        [\n          { id: 'ask-wally', label: 'Ask Wally', icon: <WallyIcon variant='circle' size='sm' /> },\n          { id: 'switch-tenant', label: 'Switch tenant', icon: <Users className='!icon-md' /> },\n          { id: 'create', label: 'Create\\u2026', icon: <Plus className='!icon-md' /> },\n        ],\n        query,\n      ),\n    [query],\n  );\n\n  return (\n    <SearchModal open={open} onOpenChange={setOpen} onQueryChange={setQuery}>\n      <SearchTriggerButton />\n      <SearchModalContent>\n        <SearchModalInput placeholder='Search products, features, and more\\u2026' />\n        <SearchModalBody>\n          {actions.length > 0 ? (\n            <SearchModalGroup>\n              <SearchModalGroupLabel>\n                <Text size='xs' color='secondary' weight='medium'>\n                  Quick actions\n                </Text>\n              </SearchModalGroupLabel>\n              {actions.map(item => (\n                <SearchModalItem\n                  key={item.id}\n                  onSelect={item.id === 'switch-tenant' ? undefined : noop}\n                  disabled={item.id === 'switch-tenant'}\n                >\n                  {item.icon}\n                  <Text size='sm'>{item.label}</Text>\n                  {item.id === 'switch-tenant' && (\n                    <span className='ml-auto'>\n                      <Text size='xs' color='secondary'>\n                        Unavailable\n                      </Text>\n                    </span>\n                  )}\n                </SearchModalItem>\n              ))}\n            </SearchModalGroup>\n          ) : (\n            <SearchModalGroup>\n              <SearchModalEmpty>\n                <Text size='sm' color='secondary'>\n                  No results\n                </Text>\n              </SearchModalEmpty>\n            </SearchModalGroup>\n          )}\n        </SearchModalBody>\n        <SearchModalFooter />\n      </SearchModalContent>\n    </SearchModal>\n  );\n};",
          "storyFile": "SearchModal/SearchModal.stories.tsx",
          "storyTitle": "Navigation/SearchModal",
          "description": "Disabled items are excluded from keyboard navigation and cannot be selected."
        },
        {
          "name": "CloseOnSelectFalse",
          "code": "import { useCallback, useMemo, useState } from 'react';\nimport { SearchModal, SearchModalBody, SearchModalContent, SearchModalEmpty, SearchModalFooter, SearchModalGroup, SearchModalGroupLabel, SearchModalInput, SearchModalItem } from '@wallarm-org/design-system/SearchModal';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const CloseOnSelectFalse = () => {\n  const [open, setOpen] = useState(false);\n  const [query, setQuery] = useState('');\n  const [selected, setSelected] = useState<string[]>([]);\n\n  const filtered = useMemo(() => filterItems(JUMP_TO_ITEMS, query), [query]);\n\n  const toggleItem = useCallback(\n    (id: string) =>\n      setSelected(prev => (prev.includes(id) ? prev.filter(v => v !== id) : [...prev, id])),\n    [],\n  );\n\n  return (\n    <SearchModal open={open} onOpenChange={setOpen} onQueryChange={setQuery}>\n      <SearchTriggerButton />\n      <SearchModalContent>\n        <SearchModalInput placeholder='Pick items (modal stays open)\\u2026' />\n        <SearchModalBody>\n          {filtered.length > 0 ? (\n            <SearchModalGroup>\n              <SearchModalGroupLabel>\n                <Text size='xs' color='secondary' weight='medium'>\n                  Products {selected.length > 0 && `(${selected.length} selected)`}\n                </Text>\n              </SearchModalGroupLabel>\n              {filtered.map(item => (\n                <SearchModalItem\n                  key={item.id}\n                  closeOnSelect={false}\n                  onSelect={() => toggleItem(item.id)}\n                >\n                  {item.icon}\n                  <Text size='sm'>{item.label}</Text>\n                  {selected.includes(item.id) && (\n                    <span className='ml-auto'>\n                      <Text size='xs' color='primary-alt'>\n                        Selected\n                      </Text>\n                    </span>\n                  )}\n                </SearchModalItem>\n              ))}\n            </SearchModalGroup>\n          ) : (\n            <SearchModalGroup>\n              <SearchModalEmpty>\n                <Text size='sm' color='secondary'>\n                  No results\n                </Text>\n              </SearchModalEmpty>\n            </SearchModalGroup>\n          )}\n        </SearchModalBody>\n        <SearchModalFooter />\n      </SearchModalContent>\n    </SearchModal>\n  );\n};",
          "storyFile": "SearchModal/SearchModal.stories.tsx",
          "storyTitle": "Navigation/SearchModal",
          "description": "`closeOnSelect={false}` keeps the modal open after selecting an item, useful\nfor multi-step flows like the sub-list mechanic."
        },
        {
          "name": "Controlled",
          "code": "import { useMemo, useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Search } from '@wallarm-org/design-system/icons';\nimport { SearchModal, SearchModalBody, SearchModalContent, SearchModalEmpty, SearchModalFooter, SearchModalGroup, SearchModalGroupLabel, SearchModalInput, SearchModalItem } from '@wallarm-org/design-system/SearchModal';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const Controlled = () => {\n  const [open, setOpen] = useState(false);\n  const [query, setQuery] = useState('');\n\n  const filtered = useMemo(() => filterItems(JUMP_TO_ITEMS, query), [query]);\n\n  return (\n    <>\n      <Button variant='outline' color='neutral' onClick={() => setOpen(true)}>\n        Open Programmatically\n      </Button>\n      <SearchModal open={open} onOpenChange={setOpen} onQueryChange={setQuery}>\n        <SearchModalContent>\n          <SearchModalInput placeholder='Search products, features, and more\\u2026' />\n          <SearchModalBody>\n            {filtered.length > 0 ? (\n              <SearchModalGroup>\n                <SearchModalGroupLabel>\n                  <Text size='xs' color='secondary' weight='medium'>\n                    {query ? 'Go to' : 'Jump to'}\n                  </Text>\n                </SearchModalGroupLabel>\n                {filtered.map(item => (\n                  <SearchModalItem key={item.id} onSelect={noop}>\n                    {item.icon}\n                    <Text size='sm'>{item.label}</Text>\n                  </SearchModalItem>\n                ))}\n              </SearchModalGroup>\n            ) : (\n              <SearchModalGroup>\n                <SearchModalEmpty>\n                  <Text size='sm' color='secondary'>\n                    No results\n                  </Text>\n                </SearchModalEmpty>\n              </SearchModalGroup>\n            )}\n          </SearchModalBody>\n          <SearchModalFooter />\n        </SearchModalContent>\n      </SearchModal>\n    </>\n  );\n};",
          "storyFile": "SearchModal/SearchModal.stories.tsx",
          "storyTitle": "Navigation/SearchModal",
          "description": "Controlled open state, driven entirely from outside the component.\nNo `SearchModalTrigger` — the button calls `setOpen` directly."
        },
        {
          "name": "Scrollable",
          "code": "import { useMemo, useState } from 'react';\nimport { Compass, Search } from '@wallarm-org/design-system/icons';\nimport { SearchModal, SearchModalBody, SearchModalContent, SearchModalEmpty, SearchModalFooter, SearchModalGroup, SearchModalGroupLabel, SearchModalInput, SearchModalItem } from '@wallarm-org/design-system/SearchModal';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const Scrollable = () => {\n  const [open, setOpen] = useState(false);\n  const [query, setQuery] = useState('');\n\n  const allItems = useMemo(\n    () =>\n      Array.from({ length: 30 }, (_, i) => ({\n        id: `item-${i}`,\n        label: `Feature ${i + 1}`,\n        icon: <Compass className='text-text-primary !icon-md' />,\n      })),\n    [],\n  );\n\n  const filtered = useMemo(() => filterItems(allItems, query), [allItems, query]);\n\n  return (\n    <SearchModal open={open} onOpenChange={setOpen} onQueryChange={setQuery}>\n      <SearchTriggerButton />\n      <SearchModalContent>\n        <SearchModalInput placeholder='Search products, features, and more\\u2026' />\n        <SearchModalBody>\n          {filtered.length > 0 ? (\n            <SearchModalGroup>\n              <SearchModalGroupLabel>\n                <Text size='xs' color='secondary' weight='medium'>\n                  All features\n                </Text>\n              </SearchModalGroupLabel>\n              {filtered.map(item => (\n                <SearchModalItem key={item.id} onSelect={noop}>\n                  {item.icon}\n                  <Text size='sm'>{item.label}</Text>\n                </SearchModalItem>\n              ))}\n            </SearchModalGroup>\n          ) : (\n            <SearchModalGroup>\n              <SearchModalEmpty>\n                <Text size='sm' color='secondary'>\n                  No results\n                </Text>\n              </SearchModalEmpty>\n            </SearchModalGroup>\n          )}\n        </SearchModalBody>\n        <SearchModalFooter />\n      </SearchModalContent>\n    </SearchModal>\n  );\n};",
          "storyFile": "SearchModal/SearchModal.stories.tsx",
          "storyTitle": "Navigation/SearchModal",
          "description": "The scrollable body when there are many items. The input and footer stay fixed\nwhile the body scrolls."
        }
      ]
    },
    {
      "name": "SegmentedControl",
      "description": "Switches between renditions of the same content, with every option visible — reach for `Tabs` when the sections are distinct places rather than views of one thing, and `Radio` when the choice is an answer a form submits. It owns no panel: it reports the chosen value and you re-render the content yourself.",
      "importPath": "@wallarm-org/design-system/SegmentedControl",
      "props": [
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "fullWidth",
          "type": "{ true: string; false: string; }",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "value",
          "type": "string | undefined",
          "required": false,
          "description": "The currently selected value"
        },
        {
          "name": "defaultValue",
          "type": "string | undefined",
          "required": false,
          "description": "The default selected value"
        },
        {
          "name": "onChange",
          "type": "((value: string) => void) | undefined",
          "required": false,
          "description": "Callback function called when the selection changes"
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "fullWidth",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        }
      ],
      "subComponents": [
        {
          "name": "SegmentedControlButton",
          "props": [
            {
              "name": "size",
              "type": "{ small: string; medium: string; large: string; 'inline-edit': string; }",
              "required": false,
              "defaultValue": "medium"
            },
            {
              "name": "loading",
              "type": "{ true: string; }",
              "required": false
            },
            {
              "name": "fullWidth",
              "type": "{ true: string; false: string; }",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "as",
              "type": "C | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "SegmentedControlItem",
          "props": [
            {
              "name": "value",
              "type": "string",
              "required": true,
              "description": "Unique value that identifies this item"
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false,
              "description": "Whether this item is disabled"
            },
            {
              "name": "onKeyDown",
              "type": "((event: KeyboardEvent<HTMLLabelElement>) => void) | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "htmlFor",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "SegmentedControlSeparator",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "orientation",
              "type": "{ horizontal: string; vertical: string; }",
              "required": false
            },
            {
              "name": "spacing",
              "type": "complex",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "decorative",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "mx",
              "type": "complex",
              "required": false,
              "defaultValue": "2"
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Basic",
          "code": "import { NumericBadge } from '@wallarm-org/design-system/NumericBadge';\nimport { SegmentedControl, SegmentedControlItem } from '@wallarm-org/design-system/SegmentedControl';\n\nexport const Basic = () => (\n  <SegmentedControl defaultValue='1' data-testid='segmented-control'>\n    <SegmentedControlItem value='1'>\n      Headers\n      <NumericBadge>33</NumericBadge>\n    </SegmentedControlItem>\n    <SegmentedControlItem value='2'>\n      Parameters\n      <NumericBadge>100</NumericBadge>\n    </SegmentedControlItem>\n    <SegmentedControlItem value='3'>Schema</SegmentedControlItem>\n  </SegmentedControl>\n);",
          "storyFile": "SegmentedControl/SegmentedControl.stories.tsx",
          "storyTitle": "Inputs/SegmentedControl",
          "description": "Two to five options, all visible at once. Past that the control gets cramped and the\ncomparison it exists to offer stops working."
        },
        {
          "name": "Disabled",
          "code": "import { SegmentedControl, SegmentedControlItem } from '@wallarm-org/design-system/SegmentedControl';\n\nexport const Disabled = () => (\n  <SegmentedControl defaultValue='1'>\n    <SegmentedControlItem value='1'>Active</SegmentedControlItem>\n    <SegmentedControlItem value='2' disabled>\n      Disabled\n    </SegmentedControlItem>\n    <SegmentedControlItem value='3'>Normal</SegmentedControlItem>\n  </SegmentedControl>\n);",
          "storyFile": "SegmentedControl/SegmentedControl.stories.tsx",
          "storyTitle": "Inputs/SegmentedControl",
          "description": "A disabled option stays visible rather than disappearing, so the set of choices doesn't\nchange shape between visits."
        },
        {
          "name": "Icons",
          "code": "import { ChevronLeft, ChevronRight, Search } from '@wallarm-org/design-system/icons';\nimport { SegmentedControl, SegmentedControlItem } from '@wallarm-org/design-system/SegmentedControl';\n\nexport const Icons = () => (\n  <SegmentedControl defaultValue='1'>\n    <SegmentedControlItem value='1'>\n      <ChevronLeft />\n      Previous\n    </SegmentedControlItem>\n    <SegmentedControlItem value='2'>\n      <Search />\n      Search\n    </SegmentedControlItem>\n    <SegmentedControlItem value='3'>\n      Next\n      <ChevronRight />\n    </SegmentedControlItem>\n  </SegmentedControl>\n);",
          "storyFile": "SegmentedControl/SegmentedControl.stories.tsx",
          "storyTitle": "Inputs/SegmentedControl",
          "description": "Icons beside the labels, which helps when the options are renditions — a list against a\ngrid — rather than categories."
        },
        {
          "name": "IconOnly",
          "code": "import { Home, Search, SlidersHorizontal } from '@wallarm-org/design-system/icons';\nimport { NumericBadge } from '@wallarm-org/design-system/NumericBadge';\nimport { SegmentedControl, SegmentedControlItem } from '@wallarm-org/design-system/SegmentedControl';\n\nexport const IconOnly = () => (\n  <SegmentedControl defaultValue='user'>\n    <SegmentedControlItem value='user'>\n      <Home />\n      <NumericBadge>1</NumericBadge>\n    </SegmentedControlItem>\n    <SegmentedControlItem value='settings'>\n      <SlidersHorizontal />\n    </SegmentedControlItem>\n    <SegmentedControlItem value='search'>\n      <Search />\n    </SegmentedControlItem>\n  </SegmentedControl>\n);",
          "storyFile": "SegmentedControl/SegmentedControl.stories.tsx",
          "storyTitle": "Inputs/SegmentedControl",
          "description": "Icon-only segments for a toolbar. Each still needs an accessible name; the icon is the\nlabel only visually."
        },
        {
          "name": "MoreButton",
          "code": "import { Ellipsis } from '@wallarm-org/design-system/icons';\nimport { NumericBadge } from '@wallarm-org/design-system/NumericBadge';\nimport { SegmentedControl, SegmentedControlButton, SegmentedControlItem, SegmentedControlSeparator } from '@wallarm-org/design-system/SegmentedControl';\n\nexport const MoreButton = () => (\n  <SegmentedControl defaultValue='1'>\n    <SegmentedControlItem value='1'>\n      Headers\n      <NumericBadge>33</NumericBadge>\n    </SegmentedControlItem>\n    <SegmentedControlItem value='2'>\n      Parameters\n      <NumericBadge>100</NumericBadge>\n    </SegmentedControlItem>\n    <SegmentedControlItem value='3'>Schema</SegmentedControlItem>\n    <SegmentedControlSeparator />\n    <SegmentedControlButton onClick={onShowMore}>\n      <Ellipsis />\n      More\n    </SegmentedControlButton>\n  </SegmentedControl>\n);",
          "storyFile": "SegmentedControl/SegmentedControl.stories.tsx",
          "storyTitle": "Inputs/SegmentedControl",
          "description": "An overflow trigger for the options that didn't fit. If you need this often, the choice\nprobably wants a `Select`."
        },
        {
          "name": "Many",
          "code": "import { Ellipsis } from '@wallarm-org/design-system/icons';\nimport { SegmentedControl, SegmentedControlButton, SegmentedControlItem, SegmentedControlSeparator } from '@wallarm-org/design-system/SegmentedControl';\n\nexport const Many = () => {\n  const items = Array.from({ length: 10 }, (_, i) => ({\n    id: String(i + 1),\n    text: `Item ${i + 1}`,\n  }));\n\n  return (\n    <SegmentedControl defaultValue='1'>\n      {items.slice(0, 7).map(item => (\n        <SegmentedControlItem key={item.id} value={item.id}>\n          {item.text}\n        </SegmentedControlItem>\n      ))}\n      <SegmentedControlSeparator />\n      <SegmentedControlButton onClick={onShowMore}>\n        <Ellipsis />\n        More\n      </SegmentedControlButton>\n    </SegmentedControl>\n  );\n};",
          "storyFile": "SegmentedControl/SegmentedControl.stories.tsx",
          "storyTitle": "Inputs/SegmentedControl",
          "description": "What too many options looks like — worth seeing so the limit is a judgement rather than a\nrule you took on trust."
        },
        {
          "name": "Badge",
          "code": "import { CircleDashed } from '@wallarm-org/design-system/icons';\nimport { NumericBadge } from '@wallarm-org/design-system/NumericBadge';\nimport { SegmentedControl, SegmentedControlItem } from '@wallarm-org/design-system/SegmentedControl';\n\nexport const Badge = () => (\n  <SegmentedControl defaultValue='icon-badge'>\n    <SegmentedControlItem value='icon-only'>\n      <CircleDashed />\n    </SegmentedControlItem>\n    <SegmentedControlItem value='icon-badge'>\n      <CircleDashed />\n      <NumericBadge>1</NumericBadge>\n    </SegmentedControlItem>\n    <SegmentedControlItem value='text-badge'>\n      Items\n      <NumericBadge>99</NumericBadge>\n    </SegmentedControlItem>\n  </SegmentedControl>\n);",
          "storyFile": "SegmentedControl/SegmentedControl.stories.tsx",
          "storyTitle": "Inputs/SegmentedControl",
          "description": "A count on a segment, for when each view holds a different number of things and the reader\nwould otherwise have to switch to find out."
        },
        {
          "name": "FullWidth",
          "code": "import { NumericBadge } from '@wallarm-org/design-system/NumericBadge';\nimport { SegmentedControl, SegmentedControlItem } from '@wallarm-org/design-system/SegmentedControl';\n\nexport const FullWidth = () => (\n  <div className='min-w-800'>\n    <SegmentedControl defaultValue='1' fullWidth>\n      <SegmentedControlItem value='1'>\n        Overview\n        <NumericBadge>12</NumericBadge>\n      </SegmentedControlItem>\n      <SegmentedControlItem value='2'>Analytics</SegmentedControlItem>\n      <SegmentedControlItem value='3'>\n        Reports\n        <NumericBadge>5</NumericBadge>\n      </SegmentedControlItem>\n      <SegmentedControlItem value='4'>Settings</SegmentedControlItem>\n    </SegmentedControl>\n  </div>\n);",
          "storyFile": "SegmentedControl/SegmentedControl.stories.tsx",
          "storyTitle": "Inputs/SegmentedControl",
          "description": "Stretches to its container, dividing the width evenly. Suits a narrow panel; in a wide one\nit leaves the segments floating far apart."
        },
        {
          "name": "Controlled",
          "code": "import { useState } from 'react';\nimport { NumericBadge } from '@wallarm-org/design-system/NumericBadge';\nimport { SegmentedControl, SegmentedControlItem } from '@wallarm-org/design-system/SegmentedControl';\n\nexport const Controlled = () => {\n  const [value, setValue] = useState<string>('1');\n\n  return (\n    <SegmentedControl value={value} onChange={setValue}>\n      <SegmentedControlItem value='1'>\n        Headers\n        <NumericBadge>33</NumericBadge>\n      </SegmentedControlItem>\n      <SegmentedControlItem value='2'>\n        Parameters\n        <NumericBadge>100</NumericBadge>\n      </SegmentedControlItem>\n      <SegmentedControlItem value='3'>Schema</SegmentedControlItem>\n    </SegmentedControl>\n  );\n};",
          "storyFile": "SegmentedControl/SegmentedControl.stories.tsx",
          "storyTitle": "Inputs/SegmentedControl",
          "description": "Own the value when something else has to move with it, which is the usual case, since the\ncontrol renders no panel of its own."
        },
        {
          "name": "FormField",
          "code": "import { Field, FieldDescription, FieldLabel } from '@wallarm-org/design-system/Field';\nimport { Info } from '@wallarm-org/design-system/icons';\nimport { NumericBadge } from '@wallarm-org/design-system/NumericBadge';\nimport { SegmentedControl, SegmentedControlItem } from '@wallarm-org/design-system/SegmentedControl';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@wallarm-org/design-system/Tooltip';\n\nexport const FormField = () => (\n  <Field>\n    <FieldLabel>\n      Label\n      <Tooltip>\n        <TooltipTrigger>\n          <Info />\n        </TooltipTrigger>\n        <TooltipContent>Additional information</TooltipContent>\n      </Tooltip>\n    </FieldLabel>\n\n    <FieldDescription>This is an input description.</FieldDescription>\n\n    <SegmentedControl defaultValue='1'>\n      <SegmentedControlItem value='1'>\n        Headers\n        <NumericBadge>33</NumericBadge>\n      </SegmentedControlItem>\n      <SegmentedControlItem value='2'>\n        Parameters\n        <NumericBadge>100</NumericBadge>\n      </SegmentedControlItem>\n      <SegmentedControlItem value='3'>Schema</SegmentedControlItem>\n    </SegmentedControl>\n  </Field>\n);",
          "storyFile": "SegmentedControl/SegmentedControl.stories.tsx",
          "storyTitle": "Inputs/SegmentedControl",
          "description": "Inside `Field`, for when the choice really is a form answer — the case where `Radio` is\noften the better call."
        }
      ]
    },
    {
      "name": "SegmentedTabs",
      "description": "The pill-skinned tab set: it owns its panels like `Tabs` but wears `SegmentedControl`’s look. Reach for it for scoped views of a single collection — All / Active / Blocked — or as a second level under primary `Tabs`, never as a page’s main tabs. The line against `SegmentedControl` is whether selecting changes *which* content shows (here) or only *how the same content looks* (there). Keep the set short: overflow goes to a “More” menu, since these pills do not scroll.",
      "importPath": "@wallarm-org/design-system/SegmentedTabs",
      "props": [
        {
          "name": "fullWidth",
          "type": "{ true: string; false: string; }",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "value",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "lazyMount",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "true"
        },
        {
          "name": "unmountOnExit",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "true"
        },
        {
          "name": "onChange",
          "type": "((value: string) => void) | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "fullWidth",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        }
      ],
      "subComponents": [
        {
          "name": "SegmentedTabsTrigger",
          "props": [
            {
              "name": "value",
              "type": "string",
              "required": true
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "defaultValue": "false"
            },
            {
              "name": "indicator",
              "type": "boolean | undefined",
              "required": false,
              "description": "Show a small brand-colored dot indicator next to the tab label",
              "defaultValue": "false"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false,
              "defaultValue": "false"
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Basic",
          "code": "import { SegmentedTabs, SegmentedTabsContent, SegmentedTabsList, SegmentedTabsTrigger } from '@wallarm-org/design-system/SegmentedTabs';\n\nexport const Basic = () => (\n  <SegmentedTabs defaultValue='react' data-testid='segmented-tabs'>\n    <SegmentedTabsList>\n      <SegmentedTabsTrigger value='react'>React</SegmentedTabsTrigger>\n      <SegmentedTabsTrigger value='vue'>Vue</SegmentedTabsTrigger>\n      <SegmentedTabsTrigger value='solid'>Solid</SegmentedTabsTrigger>\n      <SegmentedTabsTrigger value='svelte'>Svelte</SegmentedTabsTrigger>\n    </SegmentedTabsList>\n    <SegmentedTabsContent value='react'>React Content</SegmentedTabsContent>\n    <SegmentedTabsContent value='vue'>Vue Content</SegmentedTabsContent>\n    <SegmentedTabsContent value='solid'>Solid Content</SegmentedTabsContent>\n    <SegmentedTabsContent value='svelte'>Svelte Content</SegmentedTabsContent>\n  </SegmentedTabs>\n);",
          "storyFile": "SegmentedTabs/SegmentedTabs.stories.tsx",
          "storyTitle": "Navigation/SegmentedTabs",
          "description": "The smallest set — pills and their panels, with the selected pill sliding under the label."
        },
        {
          "name": "Disabled",
          "code": "import { SegmentedTabs, SegmentedTabsContent, SegmentedTabsList, SegmentedTabsTrigger } from '@wallarm-org/design-system/SegmentedTabs';\n\nexport const Disabled = () => (\n  <SegmentedTabs defaultValue='react'>\n    <SegmentedTabsList>\n      <SegmentedTabsTrigger value='react' disabled>\n        React\n      </SegmentedTabsTrigger>\n      <SegmentedTabsTrigger value='vue'>Vue</SegmentedTabsTrigger>\n      <SegmentedTabsTrigger value='solid'>Solid</SegmentedTabsTrigger>\n      <SegmentedTabsTrigger value='svelte'>Svelte</SegmentedTabsTrigger>\n    </SegmentedTabsList>\n    <SegmentedTabsContent value='react'>React Content</SegmentedTabsContent>\n    <SegmentedTabsContent value='vue'>Vue Content</SegmentedTabsContent>\n    <SegmentedTabsContent value='solid'>Solid Content</SegmentedTabsContent>\n    <SegmentedTabsContent value='svelte'>Svelte Content</SegmentedTabsContent>\n  </SegmentedTabs>\n);",
          "storyFile": "SegmentedTabs/SegmentedTabs.stories.tsx",
          "storyTitle": "Navigation/SegmentedTabs",
          "description": "A disabled pill stays visible but unselectable, for a scope that exists and currently has nothing to show."
        },
        {
          "name": "WithNumericBadge",
          "code": "import { NumericBadge } from '@wallarm-org/design-system/NumericBadge';\nimport { SegmentedTabs, SegmentedTabsContent, SegmentedTabsList, SegmentedTabsTrigger } from '@wallarm-org/design-system/SegmentedTabs';\n\nexport const WithNumericBadge = () => (\n  <SegmentedTabs defaultValue='react'>\n    <SegmentedTabsList>\n      <SegmentedTabsTrigger value='react'>React</SegmentedTabsTrigger>\n      <SegmentedTabsTrigger value='vue'>\n        Vue\n        <NumericBadge>1</NumericBadge>\n      </SegmentedTabsTrigger>\n      <SegmentedTabsTrigger value='solid'>Solid</SegmentedTabsTrigger>\n      <SegmentedTabsTrigger value='svelte'>Svelte</SegmentedTabsTrigger>\n    </SegmentedTabsList>\n    <SegmentedTabsContent value='react'>React Content</SegmentedTabsContent>\n    <SegmentedTabsContent value='vue'>Vue Content</SegmentedTabsContent>\n    <SegmentedTabsContent value='solid'>Solid Content</SegmentedTabsContent>\n    <SegmentedTabsContent value='svelte'>Svelte Content</SegmentedTabsContent>\n  </SegmentedTabs>\n);",
          "storyFile": "SegmentedTabs/SegmentedTabs.stories.tsx",
          "storyTitle": "Navigation/SegmentedTabs",
          "description": "A `NumericBadge` in the pill turns a scope into a count, which is most of the value of this pattern over plain tabs."
        },
        {
          "name": "WithIcons",
          "code": "import { CircleDashed } from '@wallarm-org/design-system/icons';\nimport { NumericBadge } from '@wallarm-org/design-system/NumericBadge';\nimport { SegmentedTabs, SegmentedTabsContent, SegmentedTabsList, SegmentedTabsTrigger } from '@wallarm-org/design-system/SegmentedTabs';\n\nexport const WithIcons = () => (\n  <SegmentedTabs defaultValue='react'>\n    <SegmentedTabsList>\n      <SegmentedTabsTrigger value='react'>\n        <CircleDashed />\n        React\n      </SegmentedTabsTrigger>\n      <SegmentedTabsTrigger value='vue'>\n        <CircleDashed />\n      </SegmentedTabsTrigger>\n      <SegmentedTabsTrigger value='solid'>\n        <CircleDashed />\n        Solid\n        <NumericBadge>1</NumericBadge>\n      </SegmentedTabsTrigger>\n      <SegmentedTabsTrigger value='svelte'>\n        <CircleDashed />\n        <NumericBadge>1</NumericBadge>\n      </SegmentedTabsTrigger>\n    </SegmentedTabsList>\n    <SegmentedTabsContent value='react'>React Content</SegmentedTabsContent>\n    <SegmentedTabsContent value='vue'>Vue Content</SegmentedTabsContent>\n    <SegmentedTabsContent value='solid'>Solid Content</SegmentedTabsContent>\n    <SegmentedTabsContent value='svelte'>Svelte Content</SegmentedTabsContent>\n  </SegmentedTabs>\n);",
          "storyFile": "SegmentedTabs/SegmentedTabs.stories.tsx",
          "storyTitle": "Navigation/SegmentedTabs",
          "description": "An icon beside the label, for scopes that read faster as symbols."
        },
        {
          "name": "WithContextAction",
          "code": "import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { NumericBadge } from '@wallarm-org/design-system/NumericBadge';\nimport { SegmentedTabs, SegmentedTabsContent, SegmentedTabsList, SegmentedTabsTrigger, SegmentedTabsTriggerButton } from '@wallarm-org/design-system/SegmentedTabs';\n\nexport const WithContextAction = () => (\n  <SegmentedTabs defaultValue='react'>\n    <SegmentedTabsList>\n      <SegmentedTabsTrigger value='react'>\n        React\n        <DropdownMenu>\n          <DropdownMenuTrigger asChild>\n            <SegmentedTabsTriggerButton />\n          </DropdownMenuTrigger>\n          <DropdownMenuContent>\n            <DropdownMenuItem>Action 1</DropdownMenuItem>\n            <DropdownMenuItem>Action 2</DropdownMenuItem>\n          </DropdownMenuContent>\n        </DropdownMenu>\n      </SegmentedTabsTrigger>\n\n      <SegmentedTabsTrigger value='vue'>\n        Vue\n        <NumericBadge>1</NumericBadge>\n        <DropdownMenu>\n          <DropdownMenuTrigger asChild>\n            <SegmentedTabsTriggerButton />\n          </DropdownMenuTrigger>\n          <DropdownMenuContent>\n            <DropdownMenuItem>Action 1</DropdownMenuItem>\n            <DropdownMenuItem>Action 2</DropdownMenuItem>\n          </DropdownMenuContent>\n        </DropdownMenu>\n      </SegmentedTabsTrigger>\n\n      <SegmentedTabsTrigger value='solid'>\n        Solid\n        <DropdownMenu>\n          <DropdownMenuTrigger asChild>\n            <SegmentedTabsTriggerButton />\n          </DropdownMenuTrigger>\n          <DropdownMenuContent>\n            <DropdownMenuItem>Action 1</DropdownMenuItem>\n            <DropdownMenuItem>Action 2</DropdownMenuItem>\n          </DropdownMenuContent>\n        </DropdownMenu>\n      </SegmentedTabsTrigger>\n\n      <SegmentedTabsTrigger value='svelte'>\n        Svelte\n        <DropdownMenu>\n          <DropdownMenuTrigger asChild>\n            <SegmentedTabsTriggerButton />\n          </DropdownMenuTrigger>\n          <DropdownMenuContent>\n            <DropdownMenuItem>Action 1</DropdownMenuItem>\n            <DropdownMenuItem>Action 2</DropdownMenuItem>\n          </DropdownMenuContent>\n        </DropdownMenu>\n      </SegmentedTabsTrigger>\n    </SegmentedTabsList>\n    <SegmentedTabsContent value='react'>React Content</SegmentedTabsContent>\n    <SegmentedTabsContent value='vue'>Vue Content</SegmentedTabsContent>\n    <SegmentedTabsContent value='solid'>Solid Content</SegmentedTabsContent>\n    <SegmentedTabsContent value='svelte'>Svelte Content</SegmentedTabsContent>\n  </SegmentedTabs>\n);",
          "storyFile": "SegmentedTabs/SegmentedTabs.stories.tsx",
          "storyTitle": "Navigation/SegmentedTabs",
          "description": "A pill can carry its own action button — the three-dot menu appears on hover, which is how a saved view gets rename and delete without leaving the row."
        },
        {
          "name": "WithSeparator",
          "code": "import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { Ellipsis } from '@wallarm-org/design-system/icons';\nimport { NumericBadge } from '@wallarm-org/design-system/NumericBadge';\nimport { SegmentedTabs, SegmentedTabsButton, SegmentedTabsContent, SegmentedTabsList, SegmentedTabsSeparator, SegmentedTabsTrigger } from '@wallarm-org/design-system/SegmentedTabs';\n\nexport const WithSeparator = () => (\n  <SegmentedTabs defaultValue='react'>\n    <SegmentedTabsList>\n      <SegmentedTabsTrigger value='react'>React</SegmentedTabsTrigger>\n\n      <SegmentedTabsTrigger value='vue'>\n        Vue\n        <NumericBadge>1</NumericBadge>\n      </SegmentedTabsTrigger>\n\n      <SegmentedTabsTrigger value='svelte'>Svelte</SegmentedTabsTrigger>\n\n      <SegmentedTabsSeparator />\n\n      <DropdownMenu>\n        <DropdownMenuTrigger asChild>\n          <SegmentedTabsButton>\n            <Ellipsis />\n            More\n          </SegmentedTabsButton>\n        </DropdownMenuTrigger>\n        <DropdownMenuContent>\n          <DropdownMenuItem>Action 1</DropdownMenuItem>\n          <DropdownMenuItem>Action 2</DropdownMenuItem>\n        </DropdownMenuContent>\n      </DropdownMenu>\n    </SegmentedTabsList>\n    <SegmentedTabsContent value='react'>React Content</SegmentedTabsContent>\n    <SegmentedTabsContent value='vue'>Vue Content</SegmentedTabsContent>\n    <SegmentedTabsContent value='solid'>Solid Content</SegmentedTabsContent>\n    <SegmentedTabsContent value='svelte'>Svelte Content</SegmentedTabsContent>\n  </SegmentedTabs>\n);",
          "storyFile": "SegmentedTabs/SegmentedTabs.stories.tsx",
          "storyTitle": "Navigation/SegmentedTabs",
          "description": "`SegmentedTabsSeparator` splits the fixed presets from what follows, which is the seam the overflow menu sits behind."
        },
        {
          "name": "WithIndicator",
          "code": "import { SegmentedTabs, SegmentedTabsContent, SegmentedTabsList, SegmentedTabsTrigger } from '@wallarm-org/design-system/SegmentedTabs';\n\nexport const WithIndicator = () => (\n  <SegmentedTabs defaultValue='all'>\n    <SegmentedTabsList>\n      <SegmentedTabsTrigger value='all'>All Attacks</SegmentedTabsTrigger>\n      <SegmentedTabsTrigger value='critical' indicator>\n        Critical\n      </SegmentedTabsTrigger>\n      <SegmentedTabsTrigger value='api'>API Abuse</SegmentedTabsTrigger>\n      <SegmentedTabsTrigger value='custom' indicator>\n        Custom View\n      </SegmentedTabsTrigger>\n    </SegmentedTabsList>\n    <SegmentedTabsContent value='all'>All Attacks Content</SegmentedTabsContent>\n    <SegmentedTabsContent value='critical'>Critical Content</SegmentedTabsContent>\n    <SegmentedTabsContent value='api'>API Abuse Content</SegmentedTabsContent>\n    <SegmentedTabsContent value='custom'>Custom View Content</SegmentedTabsContent>\n  </SegmentedTabs>\n);",
          "storyFile": "SegmentedTabs/SegmentedTabs.stories.tsx",
          "storyTitle": "Navigation/SegmentedTabs",
          "description": "The `indicator` dot marks a saved or custom view, so a user-made scope is distinguishable from the built-in ones."
        },
        {
          "name": "FullWidth",
          "code": "import { SegmentedTabs, SegmentedTabsContent, SegmentedTabsList, SegmentedTabsTrigger } from '@wallarm-org/design-system/SegmentedTabs';\n\nexport const FullWidth = () => (\n  <div className='min-w-800'>\n    <SegmentedTabs defaultValue='react' fullWidth>\n      <SegmentedTabsList>\n        <SegmentedTabsTrigger value='react'>React</SegmentedTabsTrigger>\n        <SegmentedTabsTrigger value='vue'>Vue</SegmentedTabsTrigger>\n        <SegmentedTabsTrigger value='solid'>Solid</SegmentedTabsTrigger>\n        <SegmentedTabsTrigger value='svelte'>Svelte</SegmentedTabsTrigger>\n      </SegmentedTabsList>\n      <SegmentedTabsContent value='react'>React Content</SegmentedTabsContent>\n      <SegmentedTabsContent value='vue'>Vue Content</SegmentedTabsContent>\n      <SegmentedTabsContent value='solid'>Solid Content</SegmentedTabsContent>\n      <SegmentedTabsContent value='svelte'>Svelte Content</SegmentedTabsContent>\n    </SegmentedTabs>\n  </div>\n);",
          "storyFile": "SegmentedTabs/SegmentedTabs.stories.tsx",
          "storyTitle": "Navigation/SegmentedTabs",
          "description": "`fullWidth` stretches the row to its container, for a toolbar where the pills should span rather than huddle left."
        },
        {
          "name": "Controlled",
          "code": "import { useState } from 'react';\nimport { SegmentedTabs, SegmentedTabsContent, SegmentedTabsList, SegmentedTabsTrigger } from '@wallarm-org/design-system/SegmentedTabs';\n\nexport const Controlled = () => {\n  const [value, setValue] = useState<string>('vue');\n\n  return (\n    <SegmentedTabs value={value} onChange={setValue}>\n      <SegmentedTabsList>\n        <SegmentedTabsTrigger value='react'>React</SegmentedTabsTrigger>\n\n        <SegmentedTabsTrigger value='vue'>Vue</SegmentedTabsTrigger>\n\n        <SegmentedTabsTrigger value='solid'>Solid</SegmentedTabsTrigger>\n\n        <SegmentedTabsTrigger value='svelte'>Svelte</SegmentedTabsTrigger>\n      </SegmentedTabsList>\n      <SegmentedTabsContent value='react'>React Content</SegmentedTabsContent>\n      <SegmentedTabsContent value='vue'>Vue Content</SegmentedTabsContent>\n      <SegmentedTabsContent value='solid'>Solid Content</SegmentedTabsContent>\n      <SegmentedTabsContent value='svelte'>Svelte Content</SegmentedTabsContent>\n    </SegmentedTabs>\n  );\n};",
          "storyFile": "SegmentedTabs/SegmentedTabs.stories.tsx",
          "storyTitle": "Navigation/SegmentedTabs",
          "description": "`value` and `onChange` when the scope lives outside the component — in the URL, or shared with a filter."
        }
      ]
    },
    {
      "name": "Select",
      "description": "Holds one answer, or several, chosen from a list — below about six options expose them instead with `Radio` or `SegmentedControl`, and reach for `DropdownMenu` when the items run commands rather than set a value. The trigger is composed rather than configured: `SelectButton` for a button-shaped trigger, `SelectInput` for one that looks like a field.",
      "importPath": "@wallarm-org/design-system/Select",
      "props": [
        {
          "name": "form",
          "type": "string | undefined",
          "required": false,
          "description": "The associate form of the underlying select."
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string[] | undefined",
          "required": false,
          "description": "The initial default value of the select when rendered.\nUse when you don't need to control the value of the select."
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string",
          "required": false,
          "description": "The unique identifier of the machine."
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "onSelect",
          "type": "((details: SelectionDetails) => void) | undefined",
          "required": false,
          "description": "Function called when an item is selected"
        },
        {
          "name": "disabled",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the select is disabled",
          "defaultValue": "false"
        },
        {
          "name": "name",
          "type": "string | undefined",
          "required": false,
          "description": "The `name` attribute of the underlying select."
        },
        {
          "name": "value",
          "type": "string[] | undefined",
          "required": false,
          "description": "The controlled keys of the selected items"
        },
        {
          "name": "asChild",
          "type": "boolean | undefined",
          "required": false,
          "description": "Use the provided child element as the default rendered element, combining their props and behavior."
        },
        {
          "name": "ids",
          "type": "ElementIds | undefined",
          "required": false,
          "description": "The ids of the elements in the select. Useful for composition."
        },
        {
          "name": "defaultHighlightedValue",
          "type": "string | null | undefined",
          "required": false,
          "description": "The initial value of the highlighted item when opened.\nUse when you don't need to control the highlighted value of the select."
        },
        {
          "name": "highlightedValue",
          "type": "string | null | undefined",
          "required": false,
          "description": "The controlled key of the highlighted item"
        },
        {
          "name": "onHighlightChange",
          "type": "complex",
          "required": false,
          "description": "The callback fired when the highlighted item changes."
        },
        {
          "name": "loopFocus",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether to loop the keyboard navigation through the options"
        },
        {
          "name": "closeOnSelect",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the select should close after an item is selected"
        },
        {
          "name": "open",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the select menu is open"
        },
        {
          "name": "onOpenChange",
          "type": "((details: OpenChangeDetails) => void) | undefined",
          "required": false,
          "description": "Function called when the popup is opened"
        },
        {
          "name": "defaultOpen",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the select's open state is controlled by the user"
        },
        {
          "name": "composite",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the select is a composed with other composite widgets like tabs or combobox"
        },
        {
          "name": "onPointerDownOutside",
          "type": "complex",
          "required": false,
          "description": "Function called when the pointer is pressed down outside the component"
        },
        {
          "name": "onFocusOutside",
          "type": "complex",
          "required": false,
          "description": "Function called when the focus is moved outside the component"
        },
        {
          "name": "onInteractOutside",
          "type": "complex",
          "required": false,
          "description": "Function called when an interaction happens outside the component"
        },
        {
          "name": "present",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the node is present (controlled by the user)"
        },
        {
          "name": "onExitComplete",
          "type": "VoidFunction | undefined",
          "required": false,
          "description": "Function called when the animation ends in the closed state"
        },
        {
          "name": "onEnterComplete",
          "type": "VoidFunction | undefined",
          "required": false,
          "description": "Function called when the animation ends in the open state"
        },
        {
          "name": "immediate",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether to synchronize the present change immediately or defer it to the next frame"
        },
        {
          "name": "autoComplete",
          "type": "string | undefined",
          "required": false,
          "description": "The autocomplete attribute for the hidden select. Enables browser autofill (e.g. \"address-level1\" for state)."
        },
        {
          "name": "readOnly",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the select is read-only"
        },
        {
          "name": "required",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the select is required"
        },
        {
          "name": "invalid",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the select is invalid"
        },
        {
          "name": "onValueChange",
          "type": "((details: ValueChangeDetails<T>) => void) | undefined",
          "required": false,
          "description": "The callback fired when the selected item changes."
        },
        {
          "name": "multiple",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether to allow multiple selection"
        },
        {
          "name": "collection",
          "type": "ListCollection<T>",
          "required": true,
          "description": "The collection of items"
        },
        {
          "name": "translations",
          "type": "IntlTranslations | undefined",
          "required": false,
          "description": "Specifies the localized strings that identifies the accessibility elements and their states"
        },
        {
          "name": "scrollToIndexFn",
          "type": "((details: ScrollToIndexDetails) => void) | undefined",
          "required": false,
          "description": "Function to scroll to a specific index"
        },
        {
          "name": "deselectable",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the value can be cleared by clicking the selected item.\n\n**Note:** this is only applicable for single selection"
        },
        {
          "name": "skipAnimationOnMount",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether to allow the initial presence animation."
        },
        {
          "name": "hideMode",
          "type": "\"display-none\" | \"activity\"",
          "required": false,
          "description": "How to hide content when mounted but not present.\n- `'display-none'`: HTML `hidden` attribute. Effects stay alive.\n- `'activity'`: React 19 `<Activity mode=\"hidden\">`. Effects pause. Requires React 19+."
        },
        {
          "name": "loading",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "positioning",
          "type": "PositioningOptions | undefined",
          "required": false,
          "description": "Override default floating positioning (merged with DS defaults)."
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "variant",
          "options": [
            "default",
            "actions"
          ],
          "defaultValue": "default"
        }
      ],
      "subComponents": [
        {
          "name": "SelectEmptyState",
          "props": [
            {
              "name": "description",
              "type": "ReactNode",
              "required": false,
              "defaultValue": "No results"
            }
          ]
        },
        {
          "name": "SelectFooter",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "variant",
              "type": "{ default: string; actions: string; }",
              "required": false,
              "defaultValue": "default"
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "SelectOptionHint",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "SelectPositioner",
          "props": [
            {
              "name": "contentProps",
              "type": "complex",
              "required": false,
              "description": "Props for the content element (the `listbox` panel inside the positioner) — for a ref, an\ninline measurement such as a locked width, or `data-*` attributes. `className` on the\npositioner itself already lands on the content, and overrides its default sizes\n(`min-w-240 max-w-320 max-h-(--available-height)`) through tailwind-merge."
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "description": "Use the provided child element as the default rendered element, combining their props and behavior."
            }
          ]
        },
        {
          "name": "SelectSearchInput",
          "props": [
            {
              "name": "value",
              "type": "string",
              "required": true
            },
            {
              "name": "onChange",
              "type": "(value: string) => void",
              "required": true
            },
            {
              "name": "onClear",
              "type": "(() => void) | undefined",
              "required": false,
              "description": "Called when the built-in clear button empties the field, before `onChange('')`."
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "pattern",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "alt",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "height",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "src",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "width",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "autoComplete",
              "type": "HTMLInputAutoCompleteAttribute | undefined",
              "required": false
            },
            {
              "name": "maxLength",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "minLength",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "placeholder",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "readOnly",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "required",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "checked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "step",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "accept",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "max",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "min",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "multiple",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "SelectSeparator",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Basic",
          "code": "import { createListCollection } from '@ark-ui/react/collection';\nimport { Select, SelectButton, SelectContent, SelectOption, SelectOptionIndicator, SelectOptionText, SelectPositioner } from '@wallarm-org/design-system/Select';\n\nexport const Basic = () => {\n  const collection = createListCollection({\n    items: skillsWithoutIcons,\n    isItemDisabled: item => item.value === 'angular',\n  });\n\n  return (\n    <div className='w-300'>\n      <Select collection={collection} data-testid='select'>\n        <SelectButton />\n\n        <SelectPositioner>\n          <SelectContent>\n            {collection.items.map(skill => (\n              <SelectOption key={skill.value} item={skill}>\n                <SelectOptionText>{skill.label}</SelectOptionText>\n                <SelectOptionIndicator />\n              </SelectOption>\n            ))}\n          </SelectContent>\n        </SelectPositioner>\n      </Select>\n    </div>\n  );\n};",
          "storyFile": "Select/Select.stories.tsx",
          "storyTitle": "Inputs/Select",
          "description": "The minimum composition: a trigger, a `SelectPositioner`, and `SelectContent` holding the\noptions. Every part is explicit, which is what lets the trigger change without the menu changing."
        },
        {
          "name": "Sizes",
          "code": "import { createListCollection } from '@ark-ui/react/collection';\nimport { Select, SelectButton, SelectContent, SelectInput, SelectOption, SelectOptionIndicator, SelectOptionText, SelectPositioner } from '@wallarm-org/design-system/Select';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Sizes = () => {\n  const collection = createListCollection({\n    items: skillsWithoutIcons,\n  });\n\n  return (\n    <VStack gap={16} align='stretch'>\n      <HStack gap={16} align='start'>\n        <Select collection={collection}>\n          <SelectButton size='default' />\n          <SelectPositioner>\n            <SelectContent>\n              {collection.items.map(skill => (\n                <SelectOption key={skill.value} item={skill}>\n                  <SelectOptionText>{skill.label}</SelectOptionText>\n                  <SelectOptionIndicator />\n                </SelectOption>\n              ))}\n            </SelectContent>\n          </SelectPositioner>\n        </Select>\n\n        <Select collection={collection}>\n          <SelectButton size='medium' />\n          <SelectPositioner>\n            <SelectContent>\n              {collection.items.map(skill => (\n                <SelectOption key={skill.value} item={skill}>\n                  <SelectOptionText>{skill.label}</SelectOptionText>\n                  <SelectOptionIndicator />\n                </SelectOption>\n              ))}\n            </SelectContent>\n          </SelectPositioner>\n        </Select>\n\n        <Select collection={collection}>\n          <SelectButton size='small' />\n          <SelectPositioner>\n            <SelectContent>\n              {collection.items.map(skill => (\n                <SelectOption key={skill.value} item={skill}>\n                  <SelectOptionText>{skill.label}</SelectOptionText>\n                  <SelectOptionIndicator />\n                </SelectOption>\n              ))}\n            </SelectContent>\n          </SelectPositioner>\n        </Select>\n      </HStack>\n\n      <HStack gap={16} align='start'>\n        <Select collection={collection}>\n          <SelectInput size='default' />\n          <SelectPositioner>\n            <SelectContent>\n              {collection.items.map(skill => (\n                <SelectOption key={skill.value} item={skill}>\n                  <SelectOptionText>{skill.label}</SelectOptionText>\n                  <SelectOptionIndicator />\n                </SelectOption>\n              ))}\n            </SelectContent>\n          </SelectPositioner>\n        </Select>\n\n        <Select collection={collection}>\n          <SelectInput size='medium' />\n          <SelectPositioner>\n            <SelectContent>\n              {collection.items.map(skill => (\n                <SelectOption key={skill.value} item={skill}>\n                  <SelectOptionText>{skill.label}</SelectOptionText>\n                  <SelectOptionIndicator />\n                </SelectOption>\n              ))}\n            </SelectContent>\n          </SelectPositioner>\n        </Select>\n\n        <Select collection={collection}>\n          <SelectInput size='small' />\n          <SelectPositioner>\n            <SelectContent>\n              {collection.items.map(skill => (\n                <SelectOption key={skill.value} item={skill}>\n                  <SelectOptionText>{skill.label}</SelectOptionText>\n                  <SelectOptionIndicator />\n                </SelectOption>\n              ))}\n            </SelectContent>\n          </SelectPositioner>\n        </Select>\n      </HStack>\n    </VStack>\n  );\n};",
          "storyFile": "Select/Select.stories.tsx",
          "storyTitle": "Inputs/Select",
          "description": "The same height scale as the other fields, so a select sits in a row of inputs without\nbreaking the line."
        },
        {
          "name": "DifferentButtons",
          "code": "import { createListCollection } from '@ark-ui/react/collection';\nimport { Select, SelectButton, SelectContent, SelectOption, SelectOptionIndicator, SelectOptionText, SelectPositioner } from '@wallarm-org/design-system/Select';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const DifferentButtons = () => {\n  const collection = createListCollection({\n    items: skillsWithoutIcons,\n  });\n\n  return (\n    <div className='w-800'>\n      <VStack gap={16}>\n        <HStack gap={8}>\n          <Select collection={collection}>\n            <SelectButton placeholder='Default' />\n\n            <SelectPositioner>\n              <SelectContent>\n                {collection.items.map(skill => (\n                  <SelectOption key={skill.value} item={skill}>\n                    <SelectOptionText>{skill.label}</SelectOptionText>\n                    <SelectOptionIndicator />\n                  </SelectOption>\n                ))}\n              </SelectContent>\n            </SelectPositioner>\n          </Select>\n\n          <Select collection={collection}>\n            <SelectButton variant='ghost' placeholder='Ghost + Neutral' />\n\n            <SelectPositioner>\n              <SelectContent>\n                {collection.items.map(skill => (\n                  <SelectOption key={skill.value} item={skill}>\n                    <SelectOptionText>{skill.label}</SelectOptionText>\n                    <SelectOptionIndicator />\n                  </SelectOption>\n                ))}\n              </SelectContent>\n            </SelectPositioner>\n          </Select>\n\n          <Select collection={collection}>\n            <SelectButton variant='ghost' color='brand' placeholder='Ghost + Brand' />\n\n            <SelectPositioner>\n              <SelectContent>\n                {collection.items.map(skill => (\n                  <SelectOption key={skill.value} item={skill}>\n                    <SelectOptionText>{skill.label}</SelectOptionText>\n                    <SelectOptionIndicator />\n                  </SelectOption>\n                ))}\n              </SelectContent>\n            </SelectPositioner>\n          </Select>\n\n          <Select collection={collection}>\n            <SelectButton variant='secondary' placeholder='Secondary + Neutral' />\n\n            <SelectPositioner>\n              <SelectContent>\n                {collection.items.map(skill => (\n                  <SelectOption key={skill.value} item={skill}>\n                    <SelectOptionText>{skill.label}</SelectOptionText>\n                    <SelectOptionIndicator />\n                  </SelectOption>\n                ))}\n              </SelectContent>\n            </SelectPositioner>\n          </Select>\n\n          <Select collection={collection}>\n            <SelectButton variant='secondary' color='brand' placeholder='Ghost + Brand' />\n\n            <SelectPositioner>\n              <SelectContent>\n                {collection.items.map(skill => (\n                  <SelectOption key={skill.value} item={skill}>\n                    <SelectOptionText>{skill.label}</SelectOptionText>\n                    <SelectOptionIndicator />\n                  </SelectOption>\n                ))}\n              </SelectContent>\n            </SelectPositioner>\n          </Select>\n        </HStack>\n\n        <HStack gap={8}>\n          <Select collection={collection} disabled>\n            <SelectButton placeholder='Default' />\n\n            <SelectPositioner>\n              <SelectContent>\n                {collection.items.map(skill => (\n                  <SelectOption key={skill.value} item={skill}>\n                    <SelectOptionText>{skill.label}</SelectOptionText>\n                    <SelectOptionIndicator />\n                  </SelectOption>\n                ))}\n              </SelectContent>\n            </SelectPositioner>\n          </Select>\n\n          <Select collection={collection} disabled>\n            <SelectButton variant='ghost' placeholder='Ghost + Neutral' />\n\n            <SelectPositioner>\n              <SelectContent>\n                {collection.items.map(skill => (\n                  <SelectOption key={skill.value} item={skill}>\n                    <SelectOptionText>{skill.label}</SelectOptionText>\n                    <SelectOptionIndicator />\n                  </SelectOption>\n                ))}\n              </SelectContent>\n            </SelectPositioner>\n          </Select>\n\n          <Select collection={collection} disabled>\n            <SelectButton variant='ghost' color='brand' placeholder='Ghost + Brand' />\n\n            <SelectPositioner>\n              <SelectContent>\n                {collection.items.map(skill => (\n                  <SelectOption key={skill.value} item={skill}>\n                    <SelectOptionText>{skill.label}</SelectOptionText>\n                    <SelectOptionIndicator />\n                  </SelectOption>\n                ))}\n              </SelectContent>\n            </SelectPositioner>\n          </Select>\n\n          <Select collection={collection} disabled>\n            <SelectButton variant='secondary' placeholder='Secondary + Neutral' />\n\n            <SelectPositioner>\n              <SelectContent>\n                {collection.items.map(skill => (\n                  <SelectOption key={skill.value} item={skill}>\n                    <SelectOptionText>{skill.label}</SelectOptionText>\n                    <SelectOptionIndicator />\n                  </SelectOption>\n                ))}\n              </SelectContent>\n            </SelectPositioner>\n          </Select>\n\n          <Select collection={collection} disabled>\n            <SelectButton variant='secondary' color='brand' placeholder='Ghost + Brand' />\n\n            <SelectPositioner>\n              <SelectContent>\n                {collection.items.map(skill => (\n                  <SelectOption key={skill.value} item={skill}>\n                    <SelectOptionText>{skill.label}</SelectOptionText>\n                    <SelectOptionIndicator />\n                  </SelectOption>\n                ))}\n              </SelectContent>\n            </SelectPositioner>\n          </Select>\n        </HStack>\n\n        <HStack gap={8}>\n          <Select collection={collection} loading>\n            <SelectButton placeholder='Default' />\n\n            <SelectPositioner>\n              <SelectContent>\n                {collection.items.map(skill => (\n                  <SelectOption key={skill.value} item={skill}>\n                    <SelectOptionText>{skill.label}</SelectOptionText>\n                    <SelectOptionIndicator />\n                  </SelectOption>\n                ))}\n              </SelectContent>\n            </SelectPositioner>\n          </Select>\n\n          <Select collection={collection} loading>\n            <SelectButton variant='ghost' placeholder='Ghost + Neutral' />\n\n            <SelectPositioner>\n              <SelectContent>\n                {collection.items.map(skill => (\n                  <SelectOption key={skill.value} item={skill}>\n                    <SelectOptionText>{skill.label}</SelectOptionText>\n                    <SelectOptionIndicator />\n                  </SelectOption>\n                ))}\n              </SelectContent>\n            </SelectPositioner>\n          </Select>\n\n          <Select collection={collection} loading>\n            <SelectButton variant='ghost' color='brand' placeholder='Ghost + Brand' />\n\n            <SelectPositioner>\n              <SelectContent>\n                {collection.items.map(skill => (\n                  <SelectOption key={skill.value} item={skill}>\n                    <SelectOptionText>{skill.label}</SelectOptionText>\n                    <SelectOptionIndicator />\n                  </SelectOption>\n                ))}\n              </SelectContent>\n            </SelectPositioner>\n          </Select>\n\n          <Select collection={collection} loading>\n            <SelectButton variant='secondary' placeholder='Secondary + Neutral' />\n\n            <SelectPositioner>\n              <SelectContent>\n                {collection.items.map(skill => (\n                  <SelectOption key={skill.value} item={skill}>\n                    <SelectOptionText>{skill.label}</SelectOptionText>\n                    <SelectOptionIndicator />\n                  </SelectOption>\n                ))}\n              </SelectContent>\n            </SelectPositioner>\n          </Select>\n\n          <Select collection={collection} loading>\n            <SelectButton variant='secondary' color='brand' placeholder='Ghost + Brand' />\n\n            <SelectPositioner>\n              <SelectContent>\n                {collection.items.map(skill => (\n                  <SelectOption key={skill.value} item={skill}>\n                    <SelectOptionText>{skill.label}</SelectOptionText>\n                    <SelectOptionIndicator />\n                  </SelectOption>\n                ))}\n              </SelectContent>\n            </SelectPositioner>\n          </Select>\n        </HStack>\n      </VStack>\n    </div>\n  );\n};",
          "storyFile": "Select/Select.stories.tsx",
          "storyTitle": "Inputs/Select",
          "description": "The trigger is yours to shape — labelled, icon-led, or value-only. Whatever it looks like,\nit must still read as something that opens."
        },
        {
          "name": "Multiple",
          "code": "import { createListCollection } from '@ark-ui/react/collection';\nimport { Select, SelectContent, SelectInput, SelectOption, SelectOptionIndicator, SelectOptionText, SelectPositioner } from '@wallarm-org/design-system/Select';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Multiple = () => {\n  const collection = createListCollection({\n    items: skillsWithoutIcons,\n  });\n\n  return (\n    <VStack>\n      <div className='w-400'>\n        <Select\n          collection={collection}\n          multiple\n          defaultValue={['react', 'vue', 'angular', 'nodejs', 'python', 'java', 'typescript']}\n        >\n          <SelectInput />\n\n          <SelectPositioner>\n            <SelectContent>\n              {collection.items.map(skill => (\n                <SelectOption key={skill.value} item={skill}>\n                  <SelectOptionText>{skill.label}</SelectOptionText>\n                  <SelectOptionIndicator />\n                </SelectOption>\n              ))}\n            </SelectContent>\n          </SelectPositioner>\n        </Select>\n      </div>\n\n      <div className='w-400'>\n        <Select\n          collection={collection}\n          multiple\n          invalid\n          defaultValue={['react', 'vue', 'angular', 'nodejs', 'python', 'java', 'typescript']}\n        >\n          <SelectInput />\n\n          <SelectPositioner>\n            <SelectContent>\n              {collection.items.map(skill => (\n                <SelectOption key={skill.value} item={skill}>\n                  <SelectOptionText>{skill.label}</SelectOptionText>\n                  <SelectOptionIndicator />\n                </SelectOption>\n              ))}\n            </SelectContent>\n          </SelectPositioner>\n        </Select>\n      </div>\n\n      <div className='w-400'>\n        <Select\n          collection={collection}\n          multiple\n          disabled\n          defaultValue={['react', 'vue', 'angular', 'nodejs', 'python', 'java', 'typescript']}\n        >\n          <SelectInput />\n\n          <SelectPositioner>\n            <SelectContent>\n              {collection.items.map(skill => (\n                <SelectOption key={skill.value} item={skill}>\n                  <SelectOptionText>{skill.label}</SelectOptionText>\n                  <SelectOptionIndicator />\n                </SelectOption>\n              ))}\n            </SelectContent>\n          </SelectPositioner>\n        </Select>\n      </div>\n    </VStack>\n  );\n};",
          "storyFile": "Select/Select.stories.tsx",
          "storyTitle": "Inputs/Select",
          "description": "`multiple` collects several answers, and the trigger summarises them. Once past a couple of\nselections a summary beats a list, which is what `WithTags` is for."
        },
        {
          "name": "MultipleWithIcons",
          "code": "import { createListCollection } from '@ark-ui/react/collection';\nimport { Select, SelectContent, SelectInput, SelectOption, SelectOptionIndicator, SelectOptionText, SelectPositioner } from '@wallarm-org/design-system/Select';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const MultipleWithIcons = () => {\n  const collection = createListCollection({\n    items: skills,\n  });\n\n  return (\n    <VStack>\n      <div className='w-400'>\n        <Select\n          collection={collection}\n          multiple\n          defaultValue={['react', 'vue', 'angular', 'nodejs', 'python', 'java', 'typescript']}\n        >\n          <SelectInput />\n\n          <SelectPositioner>\n            <SelectContent>\n              {collection.items.map(skill => {\n                const { icon: Icon } = skill;\n\n                return (\n                  <SelectOption key={skill.value} item={skill}>\n                    {Icon && <Icon />}\n                    <SelectOptionText>{skill.label}</SelectOptionText>\n                    <SelectOptionIndicator />\n                  </SelectOption>\n                );\n              })}\n            </SelectContent>\n          </SelectPositioner>\n        </Select>\n      </div>\n\n      <div className='w-400'>\n        <Select\n          collection={collection}\n          multiple\n          invalid\n          defaultValue={['react', 'vue', 'angular', 'nodejs', 'python', 'java', 'typescript']}\n        >\n          <SelectInput />\n\n          <SelectPositioner>\n            <SelectContent>\n              {collection.items.map(skill => {\n                const { icon: Icon } = skill;\n\n                return (\n                  <SelectOption key={skill.value} item={skill}>\n                    {Icon && <Icon />}\n                    <SelectOptionText>{skill.label}</SelectOptionText>\n                    <SelectOptionIndicator />\n                  </SelectOption>\n                );\n              })}\n            </SelectContent>\n          </SelectPositioner>\n        </Select>\n      </div>\n\n      <div className='w-400'>\n        <Select\n          collection={collection}\n          multiple\n          disabled\n          defaultValue={['react', 'vue', 'angular', 'nodejs', 'python', 'java', 'typescript']}\n        >\n          <SelectInput />\n\n          <SelectPositioner>\n            <SelectContent>\n              {collection.items.map(skill => {\n                const { icon: Icon } = skill;\n\n                return (\n                  <SelectOption key={skill.value} item={skill}>\n                    {Icon && <Icon />}\n                    <SelectOptionText>{skill.label}</SelectOptionText>\n                    <SelectOptionIndicator />\n                  </SelectOption>\n                );\n              })}\n            </SelectContent>\n          </SelectPositioner>\n        </Select>\n      </div>\n    </VStack>\n  );\n};",
          "storyFile": "Select/Select.stories.tsx",
          "storyTitle": "Inputs/Select",
          "description": "Icons carry the option's identity into the closed trigger, which matters more in a\nmulti-select where the text is compressed into a summary."
        },
        {
          "name": "Grouped",
          "code": "import { createListCollection } from '@ark-ui/react/collection';\nimport { Select, SelectButton, SelectClearTrigger, SelectContent, SelectGroup, SelectGroupLabel, SelectOption, SelectOptionIndicator, SelectOptionText, SelectPositioner } from '@wallarm-org/design-system/Select';\n\nexport const Grouped = () => {\n  const collection = createListCollection({\n    items: skillsWithoutIcons,\n    groupBy: item => item.category ?? '',\n  });\n\n  return (\n    <Select collection={collection}>\n      <SelectButton />\n\n      <SelectPositioner>\n        <SelectContent>\n          {collection.group().map(([category, group], index) => (\n            <SelectGroup key={category}>\n              <SelectGroupLabel>\n                {category}\n                {index === 0 && <SelectClearTrigger>Clear all</SelectClearTrigger>}\n              </SelectGroupLabel>\n              {group.map(skill => (\n                <SelectOption key={skill.value} item={skill}>\n                  <SelectOptionText>{skill.label}</SelectOptionText>\n                  <SelectOptionIndicator />\n                </SelectOption>\n              ))}\n            </SelectGroup>\n          ))}\n        </SelectContent>\n      </SelectPositioner>\n    </Select>\n  );\n};",
          "storyFile": "Select/Select.stories.tsx",
          "storyTitle": "Inputs/Select",
          "description": "`SelectGroup` with `SelectGroupLabel` splits a long list into named sections. Group when\nthe reader would otherwise scan, not merely because the options have categories."
        },
        {
          "name": "Disabled",
          "code": "import { createListCollection } from '@ark-ui/react/collection';\nimport { Select, SelectButton, SelectContent, SelectOption, SelectOptionIndicator, SelectOptionText, SelectPositioner } from '@wallarm-org/design-system/Select';\n\nexport const Disabled = () => {\n  const collection = createListCollection({\n    items: skills,\n  });\n\n  return (\n    <Select collection={collection} disabled>\n      <SelectButton />\n\n      <SelectPositioner>\n        <SelectContent>\n          {collection.items.map(skill => (\n            <SelectOption key={skill.value} item={skill}>\n              <SelectOptionText>{skill.label}</SelectOptionText>\n              <SelectOptionIndicator />\n            </SelectOption>\n          ))}\n        </SelectContent>\n      </SelectPositioner>\n    </Select>\n  );\n};",
          "storyFile": "Select/Select.stories.tsx",
          "storyTitle": "Inputs/Select",
          "description": "The whole control is out, trigger included. Disabling individual options instead keeps the\nlist honest about what exists."
        },
        {
          "name": "Loading",
          "code": "import { createListCollection } from '@ark-ui/react/collection';\nimport { Select, SelectButton, SelectContent, SelectOption, SelectOptionIndicator, SelectOptionText, SelectPositioner } from '@wallarm-org/design-system/Select';\n\nexport const Loading = () => {\n  const collection = createListCollection({\n    items: skills,\n  });\n\n  return (\n    <Select collection={collection} loading>\n      <SelectButton />\n\n      <SelectPositioner>\n        <SelectContent>\n          {collection.items.map(skill => (\n            <SelectOption key={skill.value} item={skill}>\n              <SelectOptionText>{skill.label}</SelectOptionText>\n              <SelectOptionIndicator />\n            </SelectOption>\n          ))}\n        </SelectContent>\n      </SelectPositioner>\n    </Select>\n  );\n};",
          "storyFile": "Select/Select.stories.tsx",
          "storyTitle": "Inputs/Select",
          "description": "`loading` on the root, for a list still being fetched. It holds the trigger's shape so the\nlayout doesn't jump when the options land."
        },
        {
          "name": "WithSelectInput",
          "code": "import { createListCollection } from '@ark-ui/react/collection';\nimport { Select, SelectContent, SelectInput, SelectOption, SelectOptionIndicator, SelectOptionText, SelectPositioner } from '@wallarm-org/design-system/Select';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const WithSelectInput = () => {\n  const collection = createListCollection({\n    items: skills,\n  });\n\n  return (\n    <div className='w-300'>\n      <VStack align='stretch'>\n        <Select collection={collection}>\n          <SelectInput />\n\n          <SelectPositioner>\n            <SelectContent>\n              {collection.items.map(skill => (\n                <SelectOption key={skill.value} item={skill}>\n                  <SelectOptionText>{skill.label}</SelectOptionText>\n                  <SelectOptionIndicator />\n                </SelectOption>\n              ))}\n            </SelectContent>\n          </SelectPositioner>\n        </Select>\n\n        <Select collection={collection} invalid>\n          <SelectInput />\n\n          <SelectPositioner>\n            <SelectContent>\n              {collection.items.map(skill => (\n                <SelectOption key={skill.value} item={skill}>\n                  <SelectOptionText>{skill.label}</SelectOptionText>\n                  <SelectOptionIndicator />\n                </SelectOption>\n              ))}\n            </SelectContent>\n          </SelectPositioner>\n        </Select>\n\n        <Select collection={collection} disabled>\n          <SelectInput />\n\n          <SelectPositioner>\n            <SelectContent>\n              {collection.items.map(skill => (\n                <SelectOption key={skill.value} item={skill}>\n                  <SelectOptionText>{skill.label}</SelectOptionText>\n                  <SelectOptionIndicator />\n                </SelectOption>\n              ))}\n            </SelectContent>\n          </SelectPositioner>\n        </Select>\n      </VStack>\n    </div>\n  );\n};",
          "storyFile": "Select/Select.stories.tsx",
          "storyTitle": "Inputs/Select",
          "description": "`SelectInput` makes the trigger look like a text field, which suits a select sitting in a\nform beside real inputs rather than in a toolbar."
        },
        {
          "name": "WithSeparator",
          "code": "import { Fragment } from 'react';\nimport { createListCollection } from '@ark-ui/react/collection';\nimport { Select, SelectButton, SelectContent, SelectOption, SelectOptionIndicator, SelectOptionText, SelectPositioner, SelectSeparator } from '@wallarm-org/design-system/Select';\n\nexport const WithSeparator = () => {\n  const collection = createListCollection({\n    items: skills,\n  });\n\n  return (\n    <div className='w-300'>\n      <Select collection={collection}>\n        <SelectButton />\n\n        <SelectPositioner>\n          <SelectContent>\n            {collection.items.map((skill, index) => (\n              <Fragment key={skill.value}>\n                <SelectOption item={skill}>\n                  <SelectOptionText>{skill.label}</SelectOptionText>\n                  <SelectOptionIndicator />\n                </SelectOption>\n\n                {index === 3 && <SelectSeparator />}\n              </Fragment>\n            ))}\n          </SelectContent>\n        </SelectPositioner>\n      </Select>\n    </div>\n  );\n};",
          "storyFile": "Select/Select.stories.tsx",
          "storyTitle": "Inputs/Select",
          "description": "`SelectSeparator` divides kinds of option — a destructive or clear-all entry from the real\nchoices — where a group label would be overkill."
        },
        {
          "name": "WithIcons",
          "code": "import { createListCollection } from '@ark-ui/react/collection';\nimport { Select, SelectButton, SelectContent, SelectOption, SelectOptionIndicator, SelectOptionText, SelectPositioner } from '@wallarm-org/design-system/Select';\n\nexport const WithIcons = () => {\n  const collection = createListCollection({\n    items: skills,\n  });\n\n  return (\n    <div className='w-300'>\n      <Select collection={collection}>\n        <SelectButton />\n\n        <SelectPositioner>\n          <SelectContent>\n            {collection.items.map(({ icon: Icon, ...skill }) => (\n              <SelectOption key={skill.value} item={skill}>\n                {Icon && <Icon />}\n                <SelectOptionText>{skill.label}</SelectOptionText>\n                <SelectOptionIndicator />\n              </SelectOption>\n            ))}\n          </SelectContent>\n        </SelectPositioner>\n      </Select>\n    </div>\n  );\n};",
          "storyFile": "Select/Select.stories.tsx",
          "storyTitle": "Inputs/Select",
          "description": "`SelectValueIcon` in the option and the trigger, so the chosen option keeps its icon once\nthe menu closes."
        },
        {
          "name": "WithFooter",
          "code": "import { createListCollection } from '@ark-ui/react/collection';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { SquareArrowOutUpRight } from '@wallarm-org/design-system/icons';\nimport { Select, SelectButton, SelectClearTrigger, SelectContent, SelectFooter, SelectGroup, SelectGroupLabel, SelectOption, SelectOptionDescription, SelectOptionIndicator, SelectOptionText, SelectPositioner } from '@wallarm-org/design-system/Select';\nimport { HStack } from '@wallarm-org/design-system/Stack';\n\nexport const WithFooter = () => {\n  const collection = createListCollection({\n    items: skillsWithoutIcons,\n    groupBy: item => item.category ?? '',\n  });\n\n  return (\n    <div className='w-300'>\n      <Select collection={collection}>\n        <SelectButton />\n\n        <SelectPositioner>\n          <SelectContent>\n            {collection.group().map(([category, group], index) => (\n              <SelectGroup key={category}>\n                <SelectGroupLabel>\n                  {category}\n                  {index === 0 && <SelectClearTrigger>Clear all</SelectClearTrigger>}\n                </SelectGroupLabel>\n                {group.map(skill => (\n                  <SelectOption key={skill.value} item={skill}>\n                    <SelectOptionText>{skill.label}</SelectOptionText>\n                    {skill.description && (\n                      <SelectOptionDescription>{skill.description}</SelectOptionDescription>\n                    )}\n                    <SelectOptionIndicator />\n                  </SelectOption>\n                ))}\n              </SelectGroup>\n            ))}\n          </SelectContent>\n\n          <SelectFooter>\n            <HStack justify='between'>\n              <Button variant='ghost' color='neutral' size='small'>\n                <SquareArrowOutUpRight />\n                See all\n              </Button>\n\n              <HStack justify='end'>\n                <Button variant='ghost' color='neutral' size='small'>\n                  Cancel\n                </Button>\n\n                <Button variant='primary' color='brand' size='small'>\n                  Apply\n                </Button>\n              </HStack>\n            </HStack>\n          </SelectFooter>\n        </SelectPositioner>\n      </Select>\n    </div>\n  );\n};",
          "storyFile": "Select/Select.stories.tsx",
          "storyTitle": "Inputs/Select",
          "description": "`SelectFooter` pins content below the scrolling list, for a persistent escape like managing\nthe options themselves."
        },
        {
          "name": "WithSearch",
          "code": "import { createListCollection } from '@ark-ui/react/collection';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { SquareArrowOutUpRight } from '@wallarm-org/design-system/icons';\nimport { Select, SelectButton, SelectClearTrigger, SelectContent, SelectEmptyState, SelectFooter, SelectGroup, SelectGroupLabel, SelectHeader, SelectOption, SelectOptionDescription, SelectOptionIndicator, SelectOptionText, SelectPositioner, SelectSearchInput, useSelectSearch } from '@wallarm-org/design-system/Select';\nimport { HStack } from '@wallarm-org/design-system/Stack';\n\nexport const WithSearch = () => {\n  const collection = createListCollection({\n    items: skillsWithoutIcons,\n    groupBy: item => item.category ?? '',\n    itemToString: item => item.label,\n  });\n\n  const { searchValue, onSearchChange, filteredCollection } = useSelectSearch(collection);\n\n  return (\n    <div className='w-300'>\n      <Select collection={collection}>\n        <SelectButton />\n\n        <SelectPositioner>\n          <SelectHeader>\n            <SelectSearchInput value={searchValue} onChange={onSearchChange} />\n          </SelectHeader>\n\n          <SelectContent>\n            {filteredCollection.size === 0 ? (\n              <SelectEmptyState description={`No results for \"${searchValue}\"`} />\n            ) : (\n              filteredCollection.group().map(([category, group], index) => (\n                <SelectGroup key={category}>\n                  <SelectGroupLabel>\n                    {category}\n                    {index === 0 && <SelectClearTrigger>Clear all</SelectClearTrigger>}\n                  </SelectGroupLabel>\n                  {group.map(skill => (\n                    <SelectOption key={skill.value} item={skill}>\n                      <SelectOptionText>{skill.label}</SelectOptionText>\n                      {skill.description && (\n                        <SelectOptionDescription>{skill.description}</SelectOptionDescription>\n                      )}\n                      <SelectOptionIndicator />\n                    </SelectOption>\n                  ))}\n                </SelectGroup>\n              ))\n            )}\n          </SelectContent>\n\n          <SelectFooter>\n            <HStack justify='between'>\n              <Button variant='ghost' color='neutral' size='small'>\n                <SquareArrowOutUpRight />\n                See all\n              </Button>\n\n              <HStack justify='end'>\n                <Button variant='ghost' color='neutral' size='small'>\n                  Cancel\n                </Button>\n\n                <Button variant='primary' color='brand' size='small'>\n                  Apply\n                </Button>\n              </HStack>\n            </HStack>\n          </SelectFooter>\n        </SelectPositioner>\n      </Select>\n    </div>\n  );\n};",
          "storyFile": "Select/Select.stories.tsx",
          "storyTitle": "Inputs/Select",
          "description": "`SelectSearchInput` with the `useSelectSearch` hook, plus `SelectEmptyState` for when\nnothing matches. Add search once the list outgrows a glance — roughly ten options."
        },
        {
          "name": "WithFormField",
          "code": "import { createListCollection } from '@ark-ui/react/collection';\nimport { Field, FieldContent, FieldLabel, FieldSet } from '@wallarm-org/design-system/Field';\nimport { Select, SelectButton, SelectContent, SelectInput, SelectOption, SelectOptionIndicator, SelectOptionText, SelectPositioner } from '@wallarm-org/design-system/Select';\n\nexport const WithFormField = () => {\n  const collection = createListCollection({\n    items: skillsWithoutIcons,\n  });\n\n  return (\n    <div className='w-300'>\n      <FieldSet>\n        <Field>\n          <FieldLabel>Single with SelectInput</FieldLabel>\n          <FieldContent>\n            <Select collection={collection}>\n              <SelectInput />\n\n              <SelectPositioner>\n                <SelectContent>\n                  {collection.items.map(skill => (\n                    <SelectOption key={skill.value} item={skill}>\n                      <SelectOptionText>{skill.label}</SelectOptionText>\n                      <SelectOptionIndicator />\n                    </SelectOption>\n                  ))}\n                </SelectContent>\n              </SelectPositioner>\n            </Select>\n          </FieldContent>\n        </Field>\n\n        <Field>\n          <FieldLabel>Single with SelectButton</FieldLabel>\n          <FieldContent>\n            <Select collection={collection} defaultValue={['react']}>\n              <SelectButton />\n\n              <SelectPositioner>\n                <SelectContent>\n                  {collection.items.map(skill => (\n                    <SelectOption key={skill.value} item={skill}>\n                      <SelectOptionText>{skill.label}</SelectOptionText>\n                      <SelectOptionIndicator />\n                    </SelectOption>\n                  ))}\n                </SelectContent>\n              </SelectPositioner>\n            </Select>\n          </FieldContent>\n        </Field>\n\n        <Field>\n          <FieldLabel>Multiple with SelectInput</FieldLabel>\n          <FieldContent>\n            <Select collection={collection} multiple defaultValue={['react', 'vue']}>\n              <SelectInput />\n\n              <SelectPositioner>\n                <SelectContent>\n                  {collection.items.map(skill => (\n                    <SelectOption key={skill.value} item={skill}>\n                      <SelectOptionText>{skill.label}</SelectOptionText>\n                      <SelectOptionIndicator />\n                    </SelectOption>\n                  ))}\n                </SelectContent>\n              </SelectPositioner>\n            </Select>\n          </FieldContent>\n        </Field>\n\n        <Field>\n          <FieldLabel>Multiple with SelectButton</FieldLabel>\n          <FieldContent>\n            <Select collection={collection} multiple defaultValue={['react', 'vue', 'angular']}>\n              <SelectButton />\n\n              <SelectPositioner>\n                <SelectContent>\n                  {collection.items.map(skill => (\n                    <SelectOption key={skill.value} item={skill}>\n                      <SelectOptionText>{skill.label}</SelectOptionText>\n                      <SelectOptionIndicator />\n                    </SelectOption>\n                  ))}\n                </SelectContent>\n              </SelectPositioner>\n            </Select>\n          </FieldContent>\n        </Field>\n      </FieldSet>\n    </div>\n  );\n};",
          "storyFile": "Select/Select.stories.tsx",
          "storyTitle": "Inputs/Select",
          "description": "Inside `Field`, so the label and description come from `FieldLabel` and `FieldDescription`\nrather than from the select."
        },
        {
          "name": "WithTags",
          "code": "import { createListCollection } from '@ark-ui/react/collection';\nimport { Select, SelectContent, SelectInput, SelectOption, SelectPositioner } from '@wallarm-org/design-system/Select';\nimport { Tag } from '@wallarm-org/design-system/Tag';\n\nexport const WithTags = () => {\n  const collection = createListCollection({\n    items: skillsWithoutIcons,\n  });\n\n  return (\n    <div className='w-300'>\n      <Select\n        collection={collection}\n        multiple\n        defaultValue={['react', 'vue', 'angular', 'nodejs', 'python', 'java', 'typescript']}\n      >\n        <SelectInput />\n\n        <SelectPositioner>\n          <SelectContent>\n            {collection.items.map(skill => (\n              <SelectOption key={skill.value} item={skill}>\n                <Tag>{skill.label}</Tag>\n              </SelectOption>\n            ))}\n          </SelectContent>\n        </SelectPositioner>\n      </Select>\n    </div>\n  );\n};",
          "storyFile": "Select/Select.stories.tsx",
          "storyTitle": "Inputs/Select",
          "description": "Selections render as removable tags inside the field, which is the honest shape for\nmulti-select when the reader needs to see and undo each choice individually."
        }
      ]
    },
    {
      "name": "Selection",
      "description": "Turns a set of anything — cards, rows, list items — into a selectable collection: a checkbox on each one, shift-click for a range, and a bulk-action bar that arrives once something is ticked. The selection is controlled and ordered by `items`, so what comes back follows the list rather than the order of clicks, and ids no longer present in `items` are kept rather than dropped — a selection can outlive a page change, and clearing it is the caller's decision.",
      "importPath": "@wallarm-org/design-system/Selection",
      "props": [
        {
          "name": "items",
          "type": "T[]",
          "required": true,
          "description": "Source array — used for select-all and shift-click range ordering."
        },
        {
          "name": "getItemId",
          "type": "(item: T) => string",
          "required": true,
          "description": "Stable id extractor for items."
        },
        {
          "name": "value",
          "type": "string[]",
          "required": true,
          "description": "Controlled selection state — array of selected item ids."
        },
        {
          "name": "onChange",
          "type": "(ids: string[]) => void",
          "required": true,
          "description": "Called with the next ordered array of selected ids."
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "placement",
          "options": [
            "absolute",
            "floating"
          ],
          "defaultValue": "floating"
        }
      ],
      "subComponents": [
        {
          "name": "SelectionAll",
          "props": [
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "aria-label",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "SelectionBulkBar",
          "props": [
            {
              "name": "aria-label",
              "type": "string | undefined",
              "required": false,
              "description": "Override the toolbar accessible name. Defaults to \"Bulk actions\"."
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "placement",
              "type": "SelectionBulkBarPlacement | undefined",
              "required": false,
              "description": "How the bar is positioned.\n\n- `'floating'` (default): portaled to `document.body` and pinned to the\n  bottom of the viewport with `position: fixed`. Use for page-level\n  selection lists.\n- `'absolute'`: rendered in place with `position: absolute`. Anchors to\n  the nearest positioned ancestor — by default the enclosing `Selection`\n  root (which is `position: relative`), so the bar pins to the bottom of\n  the selection area. Use this inside a Drawer or any other bounded\n  container.",
              "defaultValue": "floating"
            }
          ]
        },
        {
          "name": "SelectionItem",
          "props": [
            {
              "name": "itemId",
              "type": "string",
              "required": true,
              "description": "Item id — must match an id present in the `<Selection>` `items` prop."
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false,
              "description": "When true, the checkbox is disabled and the item is excluded from select-all and ranges.",
              "defaultValue": "false"
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Default",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Copy, Trash2 } from '@wallarm-org/design-system/icons';\nimport { Selection, SelectionBulkBar, SelectionItem } from '@wallarm-org/design-system/Selection';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Default = () => {\n  const [selected, setSelected] = useState<string[]>([]);\n\n  return (\n    <Selection\n      data-testid='selection'\n      items={clusters}\n      getItemId={c => c.id}\n      value={selected}\n      onChange={setSelected}\n    >\n      <VStack gap={12}>\n        {clusters.map(c => (\n          <SelectionItem key={c.id} itemId={c.id}>\n            <ClusterCard cluster={c} />\n          </SelectionItem>\n        ))}\n      </VStack>\n\n      <SelectionBulkBar>\n        <Button variant='ghost' color='neutral-alt' onClick={() => onDuplicate(selected)}>\n          <Copy /> Duplicate\n        </Button>\n        <Button color='brand' onClick={() => onDelete(selected)}>\n          <Trash2 /> Delete\n        </Button>\n      </SelectionBulkBar>\n    </Selection>\n  );\n};",
          "storyFile": "Selection/Selection.stories.tsx",
          "storyTitle": "Data Display/Selection",
          "description": "The shape at its smallest: `Selection` around the collection, a `SelectionItem` per card,\nand a `SelectionBulkBar` that stays out of the way until something is selected."
        },
        {
          "name": "WithSelectAll",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Trash2 } from '@wallarm-org/design-system/icons';\nimport { Selection, SelectionAll, SelectionBulkBar, SelectionItem } from '@wallarm-org/design-system/Selection';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const WithSelectAll = () => {\n  const [selected, setSelected] = useState<string[]>([]);\n\n  return (\n    <Selection\n      data-testid='selection'\n      items={clusters}\n      getItemId={c => c.id}\n      value={selected}\n      onChange={setSelected}\n    >\n      <VStack gap={16}>\n        <HStack gap={8} align='center'>\n          <SelectionAll />\n          <Text size='sm' color='secondary'>\n            Select all\n          </Text>\n        </HStack>\n\n        <VStack gap={12}>\n          {clusters.map(c => (\n            <SelectionItem key={c.id} itemId={c.id}>\n              <ClusterCard cluster={c} />\n            </SelectionItem>\n          ))}\n        </VStack>\n      </VStack>\n\n      <SelectionBulkBar>\n        <Button color='brand' onClick={() => onDelete(selected)}>\n          <Trash2 /> Delete\n        </Button>\n      </SelectionBulkBar>\n    </Selection>\n  );\n};",
          "storyFile": "Selection/Selection.stories.tsx",
          "storyTitle": "Data Display/Selection",
          "description": "`SelectionAll` is the header checkbox — indeterminate while the selection is partial, and\na press while everything is selected clears it rather than reselecting."
        },
        {
          "name": "Grid",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Selection, SelectionBulkBar, SelectionItem } from '@wallarm-org/design-system/Selection';\n\nexport const Grid = () => {\n  const [selected, setSelected] = useState<string[]>([]);\n\n  return (\n    <Selection\n      data-testid='selection'\n      items={clusters}\n      getItemId={c => c.id}\n      value={selected}\n      onChange={setSelected}\n    >\n      <div className='grid grid-cols-3 gap-12'>\n        {clusters.map(c => (\n          <SelectionItem key={c.id} itemId={c.id}>\n            <ClusterCard cluster={c} />\n          </SelectionItem>\n        ))}\n      </div>\n\n      <SelectionBulkBar>\n        <Button onClick={() => onInspect(selected)}>Inspect</Button>\n      </SelectionBulkBar>\n    </Selection>\n  );\n};",
          "storyFile": "Selection/Selection.stories.tsx",
          "storyTitle": "Data Display/Selection",
          "description": "The same machinery over a three-column grid: `Selection` lays nothing out, so the\narrangement stays entirely yours."
        },
        {
          "name": "WithDisabled",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Trash2 } from '@wallarm-org/design-system/icons';\nimport { Selection, SelectionAll, SelectionBulkBar, SelectionItem } from '@wallarm-org/design-system/Selection';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const WithDisabled = () => {\n  const [selected, setSelected] = useState<string[]>([]);\n\n  return (\n    <Selection\n      data-testid='selection'\n      items={clusters}\n      getItemId={c => c.id}\n      value={selected}\n      onChange={setSelected}\n    >\n      <VStack gap={8}>\n        <HStack gap={8} align='center'>\n          <SelectionAll />\n          <Text size='sm' color='secondary'>\n            Select all (locked items skipped)\n          </Text>\n        </HStack>\n\n        <VStack gap={12}>\n          {clusters.map(c => (\n            <SelectionItem key={c.id} itemId={c.id} disabled={c.locked}>\n              <ClusterCard cluster={c} />\n            </SelectionItem>\n          ))}\n        </VStack>\n      </VStack>\n\n      <SelectionBulkBar>\n        <Button color='brand' onClick={() => onDelete(selected)}>\n          <Trash2 /> Delete\n        </Button>\n      </SelectionBulkBar>\n    </Selection>\n  );\n};",
          "storyFile": "Selection/Selection.stories.tsx",
          "storyTitle": "Data Display/Selection",
          "description": "A `disabled` item leaves both select-all and any shift range, so \"all\" means all the ones\nthis user is allowed to touch — and the header checkbox counts only those."
        },
        {
          "name": "RangeSelection",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Selection, SelectionBulkBar, SelectionItem } from '@wallarm-org/design-system/Selection';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const RangeSelection = () => {\n  const [selected, setSelected] = useState<string[]>([]);\n  return (\n    <Selection\n      data-testid='selection'\n      items={clusters}\n      getItemId={c => c.id}\n      value={selected}\n      onChange={setSelected}\n    >\n      <VStack gap={12}>\n        {clusters.map(c => (\n          <SelectionItem key={c.id} itemId={c.id}>\n            <ClusterCard cluster={c} />\n          </SelectionItem>\n        ))}\n      </VStack>\n      <SelectionBulkBar>\n        <Button color='brand' onClick={() => onConfirm(selected)}>\n          Confirm\n        </Button>\n      </SelectionBulkBar>\n    </Selection>\n  );\n};",
          "storyFile": "Selection/Selection.stories.tsx",
          "storyTitle": "Data Display/Selection",
          "description": "Shift-click selects everything between the last checkbox you touched and this one,\nfollowing the order of `items` rather than the order you clicked in."
        },
        {
          "name": "BulkActions",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Copy, Folder, Trash2 } from '@wallarm-org/design-system/icons';\nimport { Selection, SelectionBulkBar, SelectionItem } from '@wallarm-org/design-system/Selection';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const BulkActions = () => {\n  const [selected, setSelected] = useState<string[]>([]);\n\n  return (\n    <Selection\n      data-testid='selection'\n      items={clusters}\n      getItemId={c => c.id}\n      value={selected}\n      onChange={setSelected}\n    >\n      <VStack gap={12}>\n        {clusters.map(c => (\n          <SelectionItem key={c.id} itemId={c.id}>\n            <ClusterCard cluster={c} />\n          </SelectionItem>\n        ))}\n      </VStack>\n\n      <SelectionBulkBar>\n        <Button variant='ghost' color='neutral-alt' onClick={() => onMove(selected)}>\n          <Folder /> Move\n        </Button>\n        <Button variant='ghost' color='neutral-alt' onClick={() => onDuplicate(selected)}>\n          <Copy /> Duplicate\n        </Button>\n        <Button color='brand' onClick={() => onDelete(selected)}>\n          <Trash2 /> Delete\n        </Button>\n      </SelectionBulkBar>\n    </Selection>\n  );\n};",
          "storyFile": "Selection/Selection.stories.tsx",
          "storyTitle": "Data Display/Selection",
          "description": "Three actions in one bar. Only the destructive one is solid, so a bar with several verbs\nstill has a single obvious primary."
        },
        {
          "name": "EmptyAndPartial",
          "code": "import { useEffect, useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Trash2 } from '@wallarm-org/design-system/icons';\nimport { Selection, SelectionBulkBar, SelectionItem } from '@wallarm-org/design-system/Selection';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const EmptyAndPartial = () => {\n  const [items, setItems] = useState<Cluster[]>(clusters);\n  const [selected, setSelected] = useState<string[]>(['1', 'ghost']);\n\n  // Demonstrate cleanup pattern: drop ids that no longer exist in items.\n  useEffect(() => {\n    setSelected(prev => prev.filter(id => items.some(c => c.id === id)));\n  }, [items]);\n\n  return (\n    <VStack gap={16}>\n      <HStack gap={8}>\n        <Button onClick={() => setItems([])} variant='outline'>\n          Clear items\n        </Button>\n        <Button onClick={() => setItems(clusters)} variant='outline'>\n          Restore items\n        </Button>\n      </HStack>\n\n      <Selection\n        data-testid='selection'\n        items={items}\n        getItemId={c => c.id}\n        value={selected}\n        onChange={setSelected}\n      >\n        <VStack gap={12}>\n          {items.length === 0 ? (\n            <Text size='sm' color='secondary'>\n              No items.\n            </Text>\n          ) : (\n            items.map(c => (\n              <SelectionItem key={c.id} itemId={c.id}>\n                <ClusterCard cluster={c} />\n              </SelectionItem>\n            ))\n          )}\n        </VStack>\n\n        <SelectionBulkBar>\n          <Button color='brand' onClick={() => onDelete(selected)}>\n            <Trash2 /> Delete\n          </Button>\n        </SelectionBulkBar>\n      </Selection>\n    </VStack>\n  );\n};",
          "storyFile": "Selection/Selection.stories.tsx",
          "storyTitle": "Data Display/Selection",
          "description": "Emptying the list strands the ids that were selected, because the component keeps them on\npurpose — the effect here is the cleanup pattern, dropping any id the list no longer has."
        },
        {
          "name": "WithoutBulkBar",
          "code": "import { useState } from 'react';\nimport { Selection, SelectionItem } from '@wallarm-org/design-system/Selection';\nimport { VStack } from '@wallarm-org/design-system/Stack';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const WithoutBulkBar = () => {\n  const [selected, setSelected] = useState<string[]>([]);\n\n  return (\n    <Selection\n      data-testid='selection'\n      items={clusters}\n      getItemId={c => c.id}\n      value={selected}\n      onChange={setSelected}\n    >\n      <VStack gap={16}>\n        <Text size='sm' color='secondary'>\n          Selected: {selected.length}\n        </Text>\n\n        <VStack gap={12}>\n          {clusters.map(c => (\n            <SelectionItem key={c.id} itemId={c.id}>\n              <ClusterCard cluster={c} />\n            </SelectionItem>\n          ))}\n        </VStack>\n      </VStack>\n    </Selection>\n  );\n};",
          "storyFile": "Selection/Selection.stories.tsx",
          "storyTitle": "Data Display/Selection",
          "description": "No bar at all: the selection still works and the count is rendered from state, for a page\nthat acts on the selection somewhere else entirely."
        },
        {
          "name": "CompoundBulkBar",
          "code": "import { useState } from 'react';\nimport { Selection, SelectionItem } from '@wallarm-org/design-system/Selection';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const CompoundBulkBar = () => {\n  const [items, setItems] = useState<Cluster[]>(clusters);\n  const [selected, setSelected] = useState<string[]>([]);\n\n  // Delete actually deletes here: a bulk action that only logged left nothing to\n  // observe, and the row leaving is the honest demonstration of one.\n  const deleteSelected = (ids: string[]) => {\n    setItems(prev => prev.filter(c => !ids.includes(c.id)));\n    setSelected([]);\n  };\n\n  return (\n    <Selection\n      data-testid='selection'\n      items={items}\n      getItemId={c => c.id}\n      value={selected}\n      onChange={setSelected}\n    >\n      <VStack gap={12}>\n        {items.map(c => (\n          <SelectionItem key={c.id} itemId={c.id}>\n            <ClusterCard cluster={c} />\n          </SelectionItem>\n        ))}\n      </VStack>\n\n      <CompoundToolbar onDeleteSelected={deleteSelected} />\n    </Selection>\n  );\n};",
          "storyFile": "Selection/Selection.stories.tsx",
          "storyTitle": "Data Display/Selection",
          "description": "Composing the summary — count, select-all, clear — instead of taking the default. It has\nto be a direct child of the bar; a wrapper component hides it and the default appears too."
        },
        {
          "name": "InsideDrawer",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Drawer, DrawerBody, DrawerContent, DrawerHeader, DrawerResizeHandle, DrawerTitle, DrawerTrigger } from '@wallarm-org/design-system/Drawer';\nimport { Copy, Folder, Trash2 } from '@wallarm-org/design-system/icons';\nimport { Selection, SelectionAll, SelectionBulkBar, SelectionItem } from '@wallarm-org/design-system/Selection';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const InsideDrawer = () => {\n  const [selected, setSelected] = useState<string[]>([]);\n\n  return (\n    <Drawer width={720}>\n      <DrawerTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Open drawer with selection\n        </Button>\n      </DrawerTrigger>\n      <DrawerContent>\n        <Selection\n          items={clusters}\n          getItemId={c => c.id}\n          value={selected}\n          onChange={setSelected}\n          className='flex min-h-0 flex-1 flex-col'\n        >\n          <DrawerResizeHandle />\n          <DrawerHeader>\n            <DrawerTitle>Clusters</DrawerTitle>\n          </DrawerHeader>\n          <DrawerBody>\n            <VStack gap={16}>\n              <HStack gap={8} align='center'>\n                <SelectionAll />\n                <Text size='sm' color='secondary'>\n                  Select all\n                </Text>\n              </HStack>\n\n              <VStack gap={12}>\n                {clusters.map(c => (\n                  <SelectionItem key={c.id} itemId={c.id}>\n                    <ClusterCard cluster={c} />\n                  </SelectionItem>\n                ))}\n              </VStack>\n            </VStack>\n          </DrawerBody>\n\n          <SelectionBulkBar placement='absolute'>\n            <Button\n              variant='secondary'\n              color='neutral-alt'\n              size='large'\n              onClick={() => onDuplicate(selected)}\n            >\n              <Copy /> Duplicate\n            </Button>\n            <Button\n              variant='secondary'\n              color='neutral-alt'\n              size='large'\n              onClick={() => onMove(selected)}\n            >\n              <Folder /> Move\n            </Button>\n            <Button\n              variant='secondary'\n              color='destructive'\n              size='large'\n              onClick={() => onDelete(selected)}\n            >\n              <Trash2 /> Delete\n            </Button>\n          </SelectionBulkBar>\n        </Selection>\n      </DrawerContent>\n    </Drawer>\n  );\n};",
          "storyFile": "Selection/Selection.stories.tsx",
          "storyTitle": "Data Display/Selection",
          "description": "Inside a `Drawer`, `placement='absolute'` pins the bar to the bottom of the panel instead\nof the viewport, and the actions step up to `large` to match the surface."
        }
      ]
    },
    {
      "name": "Separator",
      "description": "A 1px rule for the places where whitespace alone does not show that one group has ended — reach for `Stack` gaps first, because a drawn line is a statement. Most families ship their own (`DropdownMenuSeparator`, `SelectSeparator`, `FieldSeparator`, `NavRailSeparator` and the rest) already carrying that context’s defaults; the raw primitive is for generic content. It is decorative by default, so set `decorative={false}` only when the line marks a boundary a screen-reader user should hear.",
      "importPath": "@wallarm-org/design-system/Separator",
      "props": [
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "orientation",
          "type": "{ horizontal: string; vertical: string; }",
          "required": false,
          "defaultValue": "horizontal"
        },
        {
          "name": "spacing",
          "type": "complex",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "decorative",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "true"
        }
      ],
      "variants": [
        {
          "name": "orientation",
          "options": [
            "horizontal",
            "vertical"
          ]
        },
        {
          "name": "spacing",
          "options": [
            "1",
            "2",
            "4",
            "6",
            "8",
            "12",
            "16",
            "20",
            "24",
            "28",
            "32",
            "36",
            "40",
            "44",
            "48",
            "56",
            "64",
            "80",
            "96",
            "112",
            "128",
            "144"
          ]
        }
      ],
      "subComponents": [],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Heading } from '@wallarm-org/design-system/Heading';\nimport { Separator } from '@wallarm-org/design-system/Separator';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const Basic = () => (\n  <VStack>\n    <Heading>Separator examples</Heading>\n    <Text>Wallarm Design System component library.</Text>\n    <Separator spacing={16} />\n    <HStack gap={0}>\n      <Text>Blog</Text>\n      <Separator decorative orientation='vertical' spacing={16} />\n      <Text>Docs</Text>\n      <Separator decorative orientation='vertical' spacing={16} />\n      <Text>Source</Text>\n    </HStack>\n  </VStack>\n);",
          "storyFile": "Separator/Separator.stories.tsx",
          "storyTitle": "Primitives/Separator",
          "description": "Both orientations in one frame. `spacing` carries the gap around the rule, so never wrap it in a margin `div`, and the vertical one stretches to its row — which means the row has to have a height."
        }
      ]
    },
    {
      "name": "SimpleCharts",
      "importPath": "@wallarm-org/design-system/SimpleCharts",
      "props": [],
      "variants": [],
      "subComponents": [
        {
          "name": "AreaChartArea",
          "props": [
            {
              "name": "seriesKey",
              "type": "string",
              "required": true,
              "description": "Joins to `LineChartSeries.key` from the root `series` prop."
            },
            {
              "name": "curve",
              "type": "\"linear\" | \"monotone\" | undefined",
              "required": false,
              "description": "Recharts curve type. Defaults to `'monotone'`.",
              "defaultValue": "monotone"
            },
            {
              "name": "disableAnimation",
              "type": "boolean | undefined",
              "required": false,
              "description": "Force-disable the recharts mount animation.",
              "defaultValue": "false"
            },
            {
              "name": "connectNulls",
              "type": "boolean | undefined",
              "required": false,
              "description": "Recharts pass-through — when `true`, the area bridges `null`/`undefined` gaps.",
              "defaultValue": "false"
            },
            {
              "name": "strokeWidth",
              "type": "number | undefined",
              "required": false,
              "description": "Stroke width override. Defaults to `AREA_STROKE_WIDTH`.",
              "defaultValue": "AREA_STROKE_WIDTH"
            }
          ]
        },
        {
          "name": "AreaChartBody",
          "props": [
            {
              "name": "height",
              "type": "number | undefined",
              "required": false,
              "description": "Body height passed to recharts' `<ResponsiveContainer>`.",
              "defaultValue": "DEFAULT_BODY_HEIGHT"
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "AreaChart",
          "props": [
            {
              "name": "data",
              "type": "T[]",
              "required": true,
              "description": "Long-form data array, one entry per X position."
            },
            {
              "name": "series",
              "type": "LineChartSeries<Extract<keyof T, string>>[]",
              "required": true,
              "description": "Schema describing each area drawn from `data`."
            },
            {
              "name": "xKey",
              "type": "Extract<keyof T, string>",
              "required": true,
              "description": "Key on each datum used as the X-axis value."
            },
            {
              "name": "variant",
              "type": "AreaChartVariant | undefined",
              "required": false,
              "description": "Area chart variant.\n- `'stacked'` (default): series stack cumulatively — each band starts where the previous ends.\n- `'standard'`: series overlap from the baseline with transparency."
            },
            {
              "name": "activeKey",
              "type": "string | null | undefined",
              "required": false,
              "description": "Controlled hover key — pass alongside `onActiveKeyChange` for cross-chart sync."
            },
            {
              "name": "onActiveKeyChange",
              "type": "((key: string | null) => void) | undefined",
              "required": false
            },
            {
              "name": "filteredKeys",
              "type": "string[] | undefined",
              "required": false,
              "description": "Controlled set of `series.key` values to hide from the plot."
            },
            {
              "name": "onZoomChange",
              "type": "((range: LineChartZoomRange | null) => void) | undefined",
              "required": false,
              "description": "Fired after the user confirms a brush selection."
            },
            {
              "name": "syncId",
              "type": "string | number | undefined",
              "required": false,
              "description": "Charts that share a `syncId` synchronise their tooltip cursor."
            },
            {
              "name": "syncMethod",
              "type": "complex",
              "required": false,
              "description": "How sibling `syncId` charts match X positions."
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "BarListBar",
          "props": [
            {
              "name": "color",
              "type": "ChartColor | undefined",
              "required": false,
              "description": "Built-in palette fill. Each colour maps to the `--color-badge-{color}-light`\ndesign-system token (dark-mode aware).\n\nPass a Tailwind `bg-*` utility via `className` to use any other colour — it\nwins over the palette class through `tailwind-merge`."
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "BarListItem",
          "props": [
            {
              "name": "value",
              "type": "number",
              "required": true
            },
            {
              "name": "selected",
              "type": "boolean | undefined",
              "required": false,
              "description": "Marks the row as visually active (selected / filtered). Applies the\nhover background + `aria-current`. The bar width and percent label are\ndriven purely by `value / max` — `selected` never changes the fill.",
              "defaultValue": "false"
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "BarListLabel",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "BarListPercent",
          "props": [
            {
              "name": "digits",
              "type": "number | undefined",
              "required": false,
              "description": "Number of fractional digits. Defaults to `0`.",
              "defaultValue": "0"
            },
            {
              "name": "variant",
              "type": "BarListPercentVariant | undefined",
              "required": false,
              "description": "Color treatment for the value and the `%` symbol.\n- `split` (default, matches Figma) — value uses `text-text-primary`, symbol uses `text-text-secondary`.\n- `muted` — both tokens use `text-text-secondary`.\n- `inherit` — both tokens inherit the parent's color (e.g. match `BarListValue`).",
              "defaultValue": "split"
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "BarList",
          "props": [
            {
              "name": "max",
              "type": "number",
              "required": true,
              "description": "Value at which a bar reaches 100%. Required.\n- Percent inputs → `max={100}`.\n- Fractions → `max={1}`.\n- Raw counts → `Math.max(...values)` or the total.\n\nInvalid values (non-finite, zero, negative) render every row empty with a 0% label\nand log a single dev-only warning."
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "BarListSkeleton",
          "props": [
            {
              "name": "rows",
              "type": "number | undefined",
              "required": false,
              "description": "Number of skeleton rows to render. Defaults to `5`.",
              "defaultValue": "5"
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "BarListValue",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "ChartActions",
          "props": [
            {
              "name": "alwaysVisible",
              "type": "boolean | undefined",
              "required": false,
              "description": "Keep actions visible regardless of card hover/focus.\nDefaults to `false` — the block fades in on card hover/focus-within.",
              "defaultValue": "false"
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "ChartEmpty",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "ChartHeader",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "Chart",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "ChartTitle",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "ColumnChartBody",
          "props": [
            {
              "name": "height",
              "type": "number | undefined",
              "required": false,
              "description": "Fixed plot height in pixels. Leave it unset to follow the card: the plot starts at the\nFigma 164px (card 220) and grows or shrinks with the `<Chart>` height, down to a 128px card."
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "ColumnChart",
          "props": [
            {
              "name": "data",
              "type": "T[]",
              "required": true,
              "description": "One entry per column (step), sorted ascending by `xKey`."
            },
            {
              "name": "series",
              "type": "LineChartSeries<Extract<keyof T, string>>[]",
              "required": true,
              "description": "The categories each column is split into, in legend order — the first one stacks on top.\nThe same schema drives the legend, the parts and the hover popover rows."
            },
            {
              "name": "xKey",
              "type": "Extract<keyof T, string>",
              "required": true,
              "description": "Key on each datum used as the X-axis value (the step: a day, an hour, …)."
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "ColumnChartXAxis",
          "props": [
            {
              "name": "tickFormatter",
              "type": "((value: unknown, index: number) => string) | undefined",
              "required": false,
              "description": "Format the rendered tick label. Receives the raw `xKey` value of the column."
            },
            {
              "name": "interval",
              "type": "number | \"preserveStart\" | \"preserveEnd\" | \"preserveStartEnd\" | undefined",
              "required": false,
              "description": "Recharts tick interval. Defaults to `'preserveStartEnd'`: the first and last columns keep\ntheir labels and middle ones drop out when the labels would collide. `0` labels every column.",
              "defaultValue": "preserveStartEnd"
            },
            {
              "name": "minTickGap",
              "type": "number | undefined",
              "required": false,
              "description": "Minimum gap (in pixels) between rendered tick labels."
            }
          ]
        },
        {
          "name": "HorizontalBarStack",
          "props": [
            {
              "name": "data",
              "type": "HorizontalBarStackDatum[]",
              "required": true,
              "description": "Segments + legend. One array drives both, so colors stay in sync."
            },
            {
              "name": "total",
              "type": "number | undefined",
              "required": false,
              "description": "Bar denominator. `> sum(data.value)` → grey remainder tail. Default: `sum(data.value)`."
            },
            {
              "name": "legend",
              "type": "boolean | undefined",
              "required": false,
              "description": "Show/hide the legend. Default: true.",
              "defaultValue": "true"
            },
            {
              "name": "activeName",
              "type": "string | null | undefined",
              "required": false,
              "description": "Controlled hover target, joined by `name`. Omitted → managed internally. Set together\nwith `onActiveNameChange` to sync hover across charts (e.g. a sibling highlights the\nsame series). Mirrors `PieChart`."
            },
            {
              "name": "onActiveNameChange",
              "type": "((name: string | null) => void) | undefined",
              "required": false
            },
            {
              "name": "selectedNames",
              "type": "string[] | undefined",
              "required": false,
              "description": "Names to emphasise. When non-empty, non-selected segments + legend items fade. Hover\n(`activeName`) wins — while a series is hovered, only it stays bright. Names not in\n`data` are ignored."
            },
            {
              "name": "onSelect",
              "type": "((name: string) => void) | undefined",
              "required": false,
              "description": "Click-to-filter. When provided, legend items become interactive (`role='button'`,\n`tabIndex=0`, Enter/Space) and fire with the clicked datum's `name`. The caller owns\nthe filter (typically: drive `selectedNames`, or filter `data`)."
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "HorizontalBarStackSkeleton",
          "props": [
            {
              "name": "legendItems",
              "type": "number | undefined",
              "required": false,
              "description": "Number of legend placeholder pills. Defaults to `3`.",
              "defaultValue": "3"
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "LineChartBody",
          "props": [
            {
              "name": "height",
              "type": "number | undefined",
              "required": false,
              "description": "Body height passed to recharts' `<ResponsiveContainer>`. Defaults to the\nFigma single-line plot height (`LINE_CARD_HEIGHT - LINE_HEADER_HEIGHT`).",
              "defaultValue": "DEFAULT_BODY_HEIGHT"
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "LineChartEmpty",
          "props": [
            {
              "name": "height",
              "type": "number | undefined",
              "required": false,
              "description": "Body height override. Defaults to the standard plot height.",
              "defaultValue": "DEFAULT_BODY_HEIGHT"
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "LineChartGrid",
          "props": [
            {
              "name": "vertical",
              "type": "boolean | undefined",
              "required": false,
              "description": "Render vertical grid lines in addition to the default horizontal ones.",
              "defaultValue": "false"
            },
            {
              "name": "keepTopLine",
              "type": "boolean | undefined",
              "required": false,
              "description": "Keep the topmost horizontal grid line unconditionally. By default the line\nis dropped only when it would visually crowd the chart's top edge — see\n{@link dropEdgeGridLines} for the threshold (Figma \"no top x-line\" rule).",
              "defaultValue": "false"
            },
            {
              "name": "keepBottomLine",
              "type": "boolean | undefined",
              "required": false,
              "description": "Keep the bottommost horizontal grid line. By default the line is dropped\nbecause the solid `<LineChartXAxis>` axis line owns the bottom rail — set\nto `true` when the X-axis line is hidden and the grid should draw the\nbottom rail itself.",
              "defaultValue": "false"
            }
          ]
        },
        {
          "name": "LineChartHoverPopoverDot",
          "props": [
            {
              "name": "color",
              "type": "(string & {}) | ChartColor | undefined",
              "required": false,
              "description": "Palette token or CSS colour. Omitted → no inline fill (lets a `className` bg win)."
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "LineChartHoverPopover",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "LineChartHoverPopoverRow",
          "props": [
            {
              "name": "series",
              "type": "LineChartSeries<string>",
              "required": true,
              "description": "Series whose colour and label feed the row."
            },
            {
              "name": "value",
              "type": "string | number | null | undefined",
              "required": false,
              "description": "Raw datum value at the active index. `null`/`undefined` renders an em-dash."
            },
            {
              "name": "formatValue",
              "type": "((value: string | number | null | undefined) => ReactNode) | undefined",
              "required": false,
              "description": "Optional value formatter. Defaults to the shared locale formatting."
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "LineChartHoverPopoverTimestamp",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "LineChartLegendItem",
          "props": [
            {
              "name": "seriesKey",
              "type": "string",
              "required": true,
              "description": "Joins to `LineChartSeries.key`. Drives hover sync, dim, and `aria-current`."
            },
            {
              "name": "selected",
              "type": "boolean | undefined",
              "required": false,
              "description": "Explicit selection state. When omitted, falls back to \"not in `filteredKeys`\".\n`true` = row is on (line drawn); `false` = row is off (line hidden, dimmed).\nPassing this prop fully overrides the context — useful when the legend\nrenders rows that are not part of the chart's filter set."
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "LineChartLegend",
          "props": [
            {
              "name": "orientation",
              "type": "LineChartLegendOrientation | undefined",
              "required": false,
              "description": "How legend rows lay out inside the legend itself. Defaults to `'horizontal'`.\nUse `'vertical'` when the legend sits to the side of the chart (the consumer\ncontrols placement by JSX child order or by wrapping body+legend in an\n`<HStack>`). Layout-vs-orientation is the only knob the legend exposes.",
              "defaultValue": "horizontal"
            },
            {
              "name": "align",
              "type": "\"center\" | \"end\" | \"start\" | undefined",
              "required": false,
              "description": "Cross-axis alignment of the legend rows. Default `'start'`.",
              "defaultValue": "start"
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "LineChartLine",
          "props": [
            {
              "name": "seriesKey",
              "type": "string",
              "required": true,
              "description": "Joins to `LineChartSeries.key` from the root `series` prop."
            },
            {
              "name": "curve",
              "type": "\"linear\" | \"monotone\" | undefined",
              "required": false,
              "description": "Recharts curve type. Defaults to `'monotone'`.",
              "defaultValue": "monotone"
            },
            {
              "name": "disableAnimation",
              "type": "boolean | undefined",
              "required": false,
              "description": "Force-disable the recharts mount animation.",
              "defaultValue": "false"
            },
            {
              "name": "connectNulls",
              "type": "boolean | undefined",
              "required": false,
              "description": "Recharts pass-through — when `true`, the line bridges `null`/`undefined` gaps.",
              "defaultValue": "false"
            },
            {
              "name": "strokeWidth",
              "type": "number | undefined",
              "required": false,
              "description": "Stroke width override. Defaults to `LINE_STROKE_WIDTH`.",
              "defaultValue": "LINE_STROKE_WIDTH"
            },
            {
              "name": "onClick",
              "type": "((event: MouseEvent<SVGPathElement, MouseEvent>) => void) | undefined",
              "required": false
            },
            {
              "name": "onMouseEnter",
              "type": "((event: MouseEvent<SVGPathElement, MouseEvent>) => void) | undefined",
              "required": false
            },
            {
              "name": "onMouseLeave",
              "type": "((event: MouseEvent<SVGPathElement, MouseEvent>) => void) | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "LineChart",
          "props": [
            {
              "name": "data",
              "type": "T[]",
              "required": true,
              "description": "Long-form data array, one entry per X position."
            },
            {
              "name": "series",
              "type": "LineChartSeries<Extract<keyof T, string>>[]",
              "required": true,
              "description": "Schema describing each line drawn from `data`."
            },
            {
              "name": "xKey",
              "type": "Extract<keyof T, string>",
              "required": true,
              "description": "Key on each datum used as the X-axis value. Required — a silent fallback\nwould hide key-name typos until the chart renders empty."
            },
            {
              "name": "activeKey",
              "type": "string | null | undefined",
              "required": false,
              "description": "Controlled hover key — pass alongside `onActiveKeyChange` for cross-chart\nsync.\n\n**Heads-up:** if the controlled value points at a series key that no\nlonger exists in `series` (filter, schema change, refresh), the chart\npushes `null` back through `onActiveKeyChange` so sibling charts stop\nhighlighting a stale key. If you wire `activeKey` to external state, the\nsnap-to-null write will arrive as a normal state change — do not be\nsurprised when your value resets after a series disappears."
            },
            {
              "name": "onActiveKeyChange",
              "type": "((key: string | null) => void) | undefined",
              "required": false
            },
            {
              "name": "filteredKeys",
              "type": "string[] | undefined",
              "required": false,
              "description": "Controlled set of `series.key` values to hide from the plot."
            },
            {
              "name": "onZoomChange",
              "type": "((range: LineChartZoomRange | null) => void) | undefined",
              "required": false,
              "description": "Fired after the user confirms a brush selection."
            },
            {
              "name": "syncId",
              "type": "string | number | undefined",
              "required": false,
              "description": "Charts that share a `syncId` synchronise their tooltip cursor and brush\nvia recharts' built-in middleware — hovering one chart highlights the\nmatching X on every sibling chart with the same id. Pair with `activeKey`\n+ `onActiveKeyChange` if you also want the *series* highlight to sync."
            },
            {
              "name": "syncMethod",
              "type": "complex",
              "required": false,
              "description": "How sibling `syncId` charts match X positions. Defaults to `'index'`\n(Recharts' default). Use `'value'` when the synced charts have different\ndataset lengths but share categorical X values."
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "LineChartTooltip",
          "props": [
            {
              "name": "xTickFormatter",
              "type": "((value: unknown) => ReactNode) | undefined",
              "required": false,
              "description": "Custom formatter for the default popover timestamp slot."
            }
          ]
        },
        {
          "name": "LineChartXAxis",
          "props": [
            {
              "name": "tickFormatter",
              "type": "((value: unknown, index: number) => string) | undefined",
              "required": false,
              "description": "Format the rendered tick label. Receives the raw datum value at the tick."
            },
            {
              "name": "density",
              "type": "LineChartXAxisDensity | undefined",
              "required": false,
              "description": "Curated tick-spacing preset (`'sparse' | 'normal' | 'dense'`). Sets\n`minTickGap` to 64/32/16px respectively. Explicit `minTickGap` overrides\nthe preset — reach for that escape hatch when no preset fits."
            },
            {
              "name": "interval",
              "type": "number | \"preserveStart\" | \"preserveEnd\" | \"preserveStartEnd\" | \"equidistantPreserveStart\" | undefined",
              "required": false,
              "description": "Recharts tick interval — `0` to render every tick, the literal strings to auto-pick.",
              "defaultValue": "preserveStartEnd"
            },
            {
              "name": "tickCount",
              "type": "number | undefined",
              "required": false,
              "description": "Recharts target tick count."
            },
            {
              "name": "ticks",
              "type": "readonly (string | number)[] | undefined",
              "required": false,
              "description": "Explicit tick values. Overrides recharts' generator."
            },
            {
              "name": "minTickGap",
              "type": "number | undefined",
              "required": false,
              "description": "Minimum gap (in pixels) between rendered tick labels. Overrides `density`."
            },
            {
              "name": "domain",
              "type": "[string | number, string | number] | undefined",
              "required": false,
              "description": "Recharts domain override — `['auto', 'auto']` by default."
            },
            {
              "name": "padding",
              "type": "\"gap\" | { left?: number | undefined; right?: number | undefined; } | \"no-gap\" | undefined",
              "required": false,
              "description": "Padding between the plot edge and the first/last tick."
            },
            {
              "name": "type",
              "type": "\"number\" | \"category\" | undefined",
              "required": false,
              "description": "Recharts axis scale type — `'category'` (default for line charts) or `'number'` for continuous X."
            },
            {
              "name": "hideTicks",
              "type": "boolean | undefined",
              "required": false,
              "description": "Render the axis area as a spacer (preserves layout, hides the labels).",
              "defaultValue": "false"
            },
            {
              "name": "axisLine",
              "type": "boolean | undefined",
              "required": false,
              "description": "Render the solid bottom axis line. Defaults to `true` — the line owns the\nbottom rail of the plot (the `<LineChartGrid>` drops its bottom horizontal\ngrid line to avoid stacking on top of it). Pass `false` for sparkline-style\nplots; in that case set `<LineChartGrid keepBottomLine />` if a bottom rail\nis still wanted.",
              "defaultValue": "true"
            }
          ]
        },
        {
          "name": "LineChartYAxis",
          "props": [
            {
              "name": "tickFormatter",
              "type": "((value: unknown, index: number) => string) | undefined",
              "required": false,
              "description": "Format the rendered tick label."
            },
            {
              "name": "tickCount",
              "type": "number | undefined",
              "required": false,
              "description": "Recharts target tick count."
            },
            {
              "name": "ticks",
              "type": "readonly (string | number)[] | undefined",
              "required": false,
              "description": "Explicit tick values. Overrides recharts' generator."
            },
            {
              "name": "domain",
              "type": "[string | number, string | number] | undefined",
              "required": false,
              "description": "Recharts domain override."
            },
            {
              "name": "padding",
              "type": "{ top?: number | undefined; bottom?: number | undefined; } | undefined",
              "required": false,
              "description": "Padding between the plot edge and the first/last tick."
            },
            {
              "name": "width",
              "type": "number | undefined",
              "required": false,
              "description": "Y-label gutter width. Defaults to the Figma-mandated `LINE_Y_LABEL_WIDTH` (38px).",
              "defaultValue": "LINE_Y_LABEL_WIDTH"
            },
            {
              "name": "hideTicks",
              "type": "boolean | undefined",
              "required": false,
              "description": "Render the axis area as a spacer (preserves layout, hides the labels).",
              "defaultValue": "false"
            }
          ]
        },
        {
          "name": "LineChartZoomBrush",
          "props": [
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false,
              "description": "When `true` the zoom interaction is removed entirely.",
              "defaultValue": "false"
            },
            {
              "name": "formatRange",
              "type": "((range: LineChartZoomRange) => ReactNode) | undefined",
              "required": false,
              "description": "Override the default range text rendered inside the popover.",
              "defaultValue": "defaultFormatRange"
            },
            {
              "name": "confirmLabel",
              "type": "ReactNode",
              "required": false,
              "description": "Override the default \"Zoom in\" label on the confirm button.",
              "defaultValue": "Zoom in"
            },
            {
              "name": "container",
              "type": "HTMLElement | null | undefined",
              "required": false,
              "description": "Portal target for the floating range/confirm popover. Defaults to\n`document.body`. Pass a dialog/modal node to keep the popover inside the\nfocus-trapped subtree — without this the portal escapes the focus context\nand tabbing from the confirm button lands outside the dialog."
            }
          ]
        },
        {
          "name": "LineChartZoomPopoverConfirm",
          "props": [
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false,
              "defaultValue": "button"
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "LineChartZoomPopover",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "LineChartZoomPopoverRange",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "MetricCaption",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "MetricDelta",
          "props": [
            {
              "name": "value",
              "type": "number",
              "required": true,
              "description": "Magnitude shown in the chip; rendered as `Math.abs(value).toLocaleString('en-US')`."
            },
            {
              "name": "trend",
              "type": "ChartDeltaTrend | undefined",
              "required": false,
              "description": "Arrow direction. Defaults to the sign of `value` (`>= 0` → up)."
            },
            {
              "name": "sentiment",
              "type": "ChartDeltaSentiment | undefined",
              "required": false,
              "description": "Colour = meaning, and it is independent of the arrow: `positive` → green,\n`negative` → red, `neutral` → slate. Defaults to `neutral`. An increase\ncan therefore read as negative (red ↑) and a decrease as positive (green ↓)."
            }
          ]
        },
        {
          "name": "MetricHeader",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "Metric",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "MetricSkeleton",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "MetricSparkline",
          "props": [
            {
              "name": "data",
              "type": "MetricSparklinePoint[]",
              "required": true,
              "description": "The trend over the period, oldest first."
            },
            {
              "name": "color",
              "type": "MetricSparklineColor | undefined",
              "required": false,
              "description": "Line colour. Independent of the `MetricDelta` sentiment — set both. `brand` (default) ·\n`positive` (success) · `negative` (danger) · `neutral` (slate).",
              "defaultValue": "brand"
            },
            {
              "name": "label",
              "type": "ReactNode",
              "required": false,
              "description": "Series name on the hover popover row (Figma \"Attribute\")."
            },
            {
              "name": "formatX",
              "type": "((x: string | number | Date) => ReactNode) | undefined",
              "required": false,
              "description": "Formats the hovered point's `x` for the popover. Defaults to `1 Jan, 2026` for dates."
            },
            {
              "name": "formatValue",
              "type": "((value: number) => ReactNode) | undefined",
              "required": false,
              "description": "Formats the hovered value. Defaults to `toLocaleString('en-US')`."
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "MetricTotal",
          "props": [
            {
              "name": "connector",
              "type": "MetricTotalConnector | undefined",
              "required": false,
              "description": "How the denominator reads: `/120` (`slash`) · `of 120` (`of`) · `120 total` (`total`).",
              "defaultValue": "slash"
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "MetricValue",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "LegendDot",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "PieChartCenterLabel",
          "props": [
            {
              "name": "hoverSync",
              "type": "boolean | undefined",
              "required": false,
              "description": "When `true` (default), the label tracks the hovered slice/legend row — so a\n`pluralize` rules object picks the form for the hovered datum's value rather than\nthe chart total. Has no effect when `pluralize` is omitted.",
              "defaultValue": "true"
            },
            {
              "name": "pluralize",
              "type": "PieChartCenterLabelPluralRules | undefined",
              "required": false,
              "description": "Optional pluralization rules. When provided, the label content is selected from\nthe rules using `Intl.PluralRules` for the currently visible count (the hovered\ndatum's value when `hoverSync` is on, otherwise the chart total). When omitted,\n`children` renders unchanged."
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "PieChartCenter",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "PieChartCenterValue",
          "props": [
            {
              "name": "hoverSync",
              "type": "boolean | undefined",
              "required": false,
              "description": "When `true` (default), hovering a slice or legend row replaces `children` with the\nhovered datum's value (formatted via `formatHoveredValue`). Set to `false` to keep\n`children` visible regardless of hover state — useful when the centre value should\nalways reflect the unfiltered total.",
              "defaultValue": "true"
            },
            {
              "name": "formatHoveredValue",
              "type": "((datum: PieChartDatum) => ReactNode) | undefined",
              "required": false,
              "description": "Formatter applied to the hovered datum when `hoverSync` is enabled. Defaults to\n`datum.value.toLocaleString()`. Pass a custom formatter to keep the hover format\naligned with whatever formatter produced `children` (e.g. compact notation, units).",
              "defaultValue": "defaultFormatHoveredValue"
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "PieChartDonut",
          "props": [
            {
              "name": "inactiveOpacity",
              "type": "number | undefined",
              "required": false,
              "description": "Opacity applied to slices that are not currently hovered. Defaults to `0.3`.\nSet to `1` to disable the hover-dim effect.",
              "defaultValue": "0.3"
            },
            {
              "name": "disableAnimation",
              "type": "boolean | undefined",
              "required": false,
              "description": "Disable the recharts mount/transition animation. Defaults to `false`.\nSet `true` in test/screenshot environments where deterministic frames matter.",
              "defaultValue": "false"
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "PieChartLegendItem",
          "props": [
            {
              "name": "name",
              "type": "string",
              "required": true,
              "description": "Identifier matching a `PieChartDatum.name` from the root `data` prop.\nDrives both the percent calculation and the bidirectional hover sync with the donut slice."
            },
            {
              "name": "value",
              "type": "number | undefined",
              "required": false,
              "description": "Optional override for the value used in the percent calculation. Defaults to looking\nthe value up from the root `data` array by `name`. Pass an explicit value when the\nlegend renders entries that are not part of the donut (e.g. a synthetic \"Other\" row)."
            },
            {
              "name": "selected",
              "type": "boolean | undefined",
              "required": false,
              "description": "Visually marks the row as the selected/filtered datum — applies `bg-states-primary-active`\nand `aria-current`. When omitted, the row falls back to membership in the root's\n`selectedNames` set (if provided). When passed explicitly (`true` or `false`) it\nfully overrides the context — useful when the legend renders rows that aren't part\nof the chart's multi-selection (e.g. a single filtered view). The resolved value\nalso feeds the dim calculation: a row resolved to `selected=false` while *some*\npeer is selected will fade like any other non-selected row."
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "PieChartLegendPercent",
          "props": [
            {
              "name": "digits",
              "type": "number | undefined",
              "required": false,
              "description": "Number of fractional digits in the percent label. Defaults to `0`.",
              "defaultValue": "0"
            },
            {
              "name": "variant",
              "type": "PieChartLegendPercentVariant | undefined",
              "required": false,
              "description": "Color treatment for the value and the `%` symbol. Mirrors `BarListPercent`.\n- `split` (default, matches Figma) — value uses `text-text-primary`, symbol uses `text-text-secondary`.\n- `muted` — both tokens use `text-text-secondary`.\n- `inherit` — both inherit the parent's color (e.g. follow `PieChartLegendValue`).",
              "defaultValue": "split"
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "PieChartLegend",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "PieChartLegendValue",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "PieChart",
          "props": [
            {
              "name": "data",
              "type": "PieChartDatum[]",
              "required": true,
              "description": "Each datum's `name` is the join key used by `PieChartLegendItem` to sync hover/active state.\nNon-finite or negative `value`s are coerced to 0 so recharts can draw them."
            },
            {
              "name": "total",
              "type": "number | undefined",
              "required": false,
              "description": "Override for the value used to compute percentages and the centre total.\nDefaults to `sum(data.value)`. Pass an explicit value when the centre label\nshould reflect a different denominator — e.g. the unfiltered total while\nthe chart shows a filtered view."
            },
            {
              "name": "activeName",
              "type": "string | null | undefined",
              "required": false,
              "description": "Controlled active slice. When provided, the component does not manage hover state\ninternally — the parent must update it via `onActiveNameChange`."
            },
            {
              "name": "onActiveNameChange",
              "type": "((name: string | null) => void) | undefined",
              "required": false
            },
            {
              "name": "selectedNames",
              "type": "string[] | undefined",
              "required": false,
              "description": "Multi-selection set. When non-empty, donut slices and legend rows whose `name`\nis not in the set fade so emphasis lands on the chosen group. Hover\n(`activeName`) wins — while the user points at a specific slice, only that one\nstays bright. Names not present in `data` are ignored.\n\nPass a stable reference (`useMemo`/state) — an inline array literal recreates\non every parent render and invalidates the internal Set memo."
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "PieChartSkeleton",
          "props": [
            {
              "name": "rows",
              "type": "number | undefined",
              "required": false,
              "description": "Number of skeleton rows in the legend column. Defaults to `5`.",
              "defaultValue": "5"
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Default",
          "code": "import { Chart, ChartHeader, ChartTitle, useChartTimeFormatters, LineChartGrid, LineChartTooltip, LineChartXAxis, LineChartYAxis, AreaChart, AreaChartArea, AreaChartBody } from '@wallarm-org/design-system/SimpleCharts';\nimport { hourlyData24, multiSeries } from '../LineChart/lib/sampleData';\n\nexport const Default = () => {\n  const { formatHour, formatHourWithTimezone } = useChartTimeFormatters();\n  return (\n    <div className='w-560'>\n      <Chart data-testid='chart'>\n        <ChartHeader>\n          <ChartTitle>Traffic breakdown (stacked)</ChartTitle>\n        </ChartHeader>\n        <AreaChart\n          data-testid='area-chart'\n          data={hourlyData24}\n          series={multiSeries}\n          xKey='timestamp'\n        >\n          <MultiLegend />\n          <AreaChartBody>\n            <LineChartGrid />\n            <LineChartXAxis tickFormatter={formatHour} minTickGap={32} />\n            <LineChartYAxis tickFormatter={formatYTick} />\n            {multiSeries.map(s => (\n              <AreaChartArea key={s.key} seriesKey={s.key} />\n            ))}\n            <LineChartTooltip xTickFormatter={formatHourWithTimezone} />\n          </AreaChartBody>\n        </AreaChart>\n      </Chart>\n    </div>\n  );\n};",
          "storyFile": "SimpleCharts/AreaChart/AreaChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/AreaChart",
          "description": "Three series stacked cumulatively — each band starts where the previous ends, showing the\ntotal volume as the top edge of the topmost area."
        },
        {
          "name": "Standard",
          "code": "import { Chart, ChartHeader, ChartTitle, useChartTimeFormatters, LineChartGrid, LineChartTooltip, LineChartXAxis, LineChartYAxis, AreaChart, AreaChartArea, AreaChartBody } from '@wallarm-org/design-system/SimpleCharts';\nimport { hourlyData24, multiSeries } from '../LineChart/lib/sampleData';\n\nexport const Standard = () => {\n  const { formatHour, formatHourWithTimezone } = useChartTimeFormatters();\n  return (\n    <div className='w-560'>\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Traffic breakdown (standard)</ChartTitle>\n        </ChartHeader>\n        <AreaChart data={hourlyData24} series={multiSeries} xKey='timestamp' variant='standard'>\n          <MultiLegend />\n          <AreaChartBody>\n            <LineChartGrid />\n            <LineChartXAxis tickFormatter={formatHour} minTickGap={32} />\n            <LineChartYAxis tickFormatter={formatYTick} />\n            {multiSeries.map(s => (\n              <AreaChartArea key={s.key} seriesKey={s.key} />\n            ))}\n            <LineChartTooltip xTickFormatter={formatHourWithTimezone} />\n          </AreaChartBody>\n        </AreaChart>\n      </Chart>\n    </div>\n  );\n};",
          "storyFile": "SimpleCharts/AreaChart/AreaChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/AreaChart",
          "description": "Standard (overlaid) variant — each series draws from the baseline independently with\ntransparency, useful when stacking would be misleading."
        },
        {
          "name": "WithMetric",
          "code": "import { Chart, ChartHeader, ChartTitle, useChartTimeFormatters, LineChartGrid, LineChartTooltip, LineChartXAxis, LineChartYAxis, MetricDelta, MetricHeader, MetricValue, AreaChart, AreaChartArea, AreaChartBody } from '@wallarm-org/design-system/SimpleCharts';\nimport { hourlyData24, multiSeries } from '../LineChart/lib/sampleData';\n\nexport const WithMetric = () => {\n  const { formatHour, formatHourWithTimezone } = useChartTimeFormatters();\n  return (\n    <div className='w-800'>\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Requests per hour</ChartTitle>\n        </ChartHeader>\n        <AreaChart data={hourlyData24} series={multiSeries} xKey='timestamp'>\n          <div className='flex items-center justify-between pr-8'>\n            <MetricHeader className='px-16'>\n              <MetricValue>{2903}</MetricValue>\n              <MetricDelta value={10} trend='up' sentiment='negative' />\n            </MetricHeader>\n            <MultiLegend />\n          </div>\n          <AreaChartBody>\n            <LineChartGrid />\n            <LineChartXAxis tickFormatter={formatHour} minTickGap={32} />\n            <LineChartYAxis tickFormatter={formatYTick} />\n            {multiSeries.map(s => (\n              <AreaChartArea key={s.key} seriesKey={s.key} />\n            ))}\n            <LineChartTooltip xTickFormatter={formatHourWithTimezone} />\n          </AreaChartBody>\n        </AreaChart>\n      </Chart>\n    </div>\n  );\n};",
          "storyFile": "SimpleCharts/AreaChart/AreaChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/AreaChart",
          "description": "The metric variant: `Metric` bricks sit to the left of the legend in a row between the\nheader and the plot."
        },
        {
          "name": "Filterable",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { FilterX } from '@wallarm-org/design-system/icons';\nimport { Chart, ChartActions, ChartHeader, ChartTitle, useChartTimeFormatters, LineChartGrid, LineChartHoverPopoverDot, LineChartLegend, LineChartLegendItem, LineChartTooltip, LineChartXAxis, LineChartYAxis, AreaChart, AreaChartArea, AreaChartBody } from '@wallarm-org/design-system/SimpleCharts';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@wallarm-org/design-system/Tooltip';\nimport { hourlyData24, multiSeries } from '../LineChart/lib/sampleData';\n\nexport const Filterable = () => {\n  const { formatHour, formatHourWithTimezone } = useChartTimeFormatters();\n  const [hidden, setHidden] = useState<string[]>([]);\n  const toggle = (key: string) => {\n    setHidden(prev => {\n      if (prev.length === 0) return multiSeries.filter(s => s.key !== key).map(s => s.key);\n      if (prev.includes(key)) return prev.filter(k => k !== key);\n      return [...prev, key];\n    });\n  };\n  const filtered = hidden.length > 0;\n\n  return (\n    <div className='w-560'>\n      <Chart data-testid='chart'>\n        <ChartHeader>\n          <ChartTitle>Click a row to isolate, click another to add</ChartTitle>\n          <ChartActions alwaysVisible={filtered}>\n            {filtered && (\n              <Tooltip>\n                <TooltipTrigger asChild>\n                  <Button\n                    variant='ghost'\n                    color='neutral'\n                    size='small'\n                    aria-label='Clear filter'\n                    onClick={() => setHidden([])}\n                  >\n                    <FilterX />\n                  </Button>\n                </TooltipTrigger>\n                <TooltipContent>Remove filter</TooltipContent>\n              </Tooltip>\n            )}\n          </ChartActions>\n        </ChartHeader>\n        <AreaChart\n          data-testid='area-chart'\n          data={hourlyData24}\n          series={multiSeries}\n          xKey='timestamp'\n          filteredKeys={hidden}\n        >\n          <LineChartLegend>\n            {multiSeries.map(s => (\n              <Tooltip key={s.key}>\n                <TooltipTrigger asChild>\n                  <LineChartLegendItem seriesKey={s.key} onClick={() => toggle(s.key)}>\n                    <LineChartHoverPopoverDot color={s.color} />\n                    <span className='text-xs font-mono text-text-primary'>{s.label}</span>\n                  </LineChartLegendItem>\n                </TooltipTrigger>\n                <TooltipContent>\n                  {hidden.includes(s.key) ? 'Remove filter' : 'Click to filter'}\n                </TooltipContent>\n              </Tooltip>\n            ))}\n          </LineChartLegend>\n          <AreaChartBody>\n            <LineChartGrid />\n            <LineChartXAxis tickFormatter={formatHour} minTickGap={32} />\n            <LineChartYAxis tickFormatter={formatYTick} />\n            {multiSeries.map(s => (\n              <AreaChartArea key={s.key} seriesKey={s.key} />\n            ))}\n            <LineChartTooltip xTickFormatter={formatHourWithTimezone} />\n          </AreaChartBody>\n        </AreaChart>\n      </Chart>\n    </div>\n  );\n};",
          "storyFile": "SimpleCharts/AreaChart/AreaChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/AreaChart",
          "description": "Clicking a legend row isolates that series and clicking another adds it back."
        },
        {
          "name": "Zoom",
          "code": "export const Zoom = () => (\n  <div className='w-560'>\n    <ZoomControlledChart />\n  </div>\n);",
          "storyFile": "SimpleCharts/AreaChart/AreaChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/AreaChart",
          "description": "Drag across the plot to choose a range, then confirm in the popover."
        },
        {
          "name": "Loading",
          "code": "import { Chart, ChartHeader, ChartTitle, LineChartEmpty } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const Loading = () => (\n  <div className='w-560'>\n    <Chart aria-busy='true' aria-live='polite'>\n      <ChartHeader>\n        <ChartTitle>Loading</ChartTitle>\n      </ChartHeader>\n      <LoadingLegend />\n      <LineChartEmpty />\n    </Chart>\n  </div>\n);",
          "storyFile": "SimpleCharts/AreaChart/AreaChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/AreaChart",
          "description": "Loading skeleton state composed from the same primitives as a populated chart."
        },
        {
          "name": "Empty",
          "code": "import { Chart, ChartHeader, ChartTitle, LineChartEmpty } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const Empty = () => (\n  <div className='w-560'>\n    <Chart>\n      <ChartHeader>\n        <ChartTitle>No data</ChartTitle>\n      </ChartHeader>\n      <LineChartEmpty>No data</LineChartEmpty>\n    </Chart>\n  </div>\n);",
          "storyFile": "SimpleCharts/AreaChart/AreaChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/AreaChart",
          "description": "Empty state — `LineChartEmpty` keeps the dashed plot frame and puts the message inside it."
        },
        {
          "name": "Default",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { FilterX, Settings } from '@wallarm-org/design-system/icons';\nimport { Chart, ChartActions, ChartHeader, ChartTitle, BarList, BarListBar, BarListItem, BarListLabel, BarListPercent, BarListValue } from '@wallarm-org/design-system/SimpleCharts';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@wallarm-org/design-system/Tooltip';\n\nexport const Default = () => {\n  const [filtered, setFiltered] = useState<string | null>(null);\n  const rows = filtered ? baseRows.filter(r => r.name === filtered) : baseRows;\n\n  return (\n    <div className='w-400'>\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Top 5 Endpoints</ChartTitle>\n          <ChartActions alwaysVisible={filtered !== null}>\n            {filtered !== null && (\n              <Tooltip>\n                <TooltipTrigger asChild>\n                  <Button\n                    variant='ghost'\n                    color='neutral'\n                    size='small'\n                    aria-label='Clear filter'\n                    onClick={() => setFiltered(null)}\n                  >\n                    <FilterX />\n                  </Button>\n                </TooltipTrigger>\n                <TooltipContent>Remove filter</TooltipContent>\n              </Tooltip>\n            )}\n            <Tooltip>\n              <TooltipTrigger asChild>\n                <Button variant='ghost' color='neutral' size='small' aria-label='Settings'>\n                  <Settings />\n                </Button>\n              </TooltipTrigger>\n              <TooltipContent>Change data source</TooltipContent>\n            </Tooltip>\n          </ChartActions>\n        </ChartHeader>\n        <BarList data-testid='bar-list' max={chartSum(rows)}>\n          {rows.map(row => (\n            <Tooltip key={row.name}>\n              <TooltipTrigger asChild>\n                <BarListItem\n                  value={row.value}\n                  selected={filtered === row.name}\n                  onClick={() => setFiltered(filtered === row.name ? null : row.name)}\n                >\n                  <BarListBar />\n                  <BarListLabel>{row.name}</BarListLabel>\n                  <BarListValue>\n                    {formatValue(row.value)}\n                    <BarListPercent />\n                  </BarListValue>\n                </BarListItem>\n              </TooltipTrigger>\n              <TooltipContent>Click to filter</TooltipContent>\n            </Tooltip>\n          ))}\n        </BarList>\n      </Chart>\n    </div>\n  );\n};",
          "storyFile": "SimpleCharts/BarList/BarList.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/BarList",
          "description": "The interactive shape: click a row to filter down to it, and the header's clear button\nappears while that filter holds. Filtering recomputes `max` from what is left, which is why\na lone row reads 100%."
        },
        {
          "name": "Colored",
          "code": "import { Chart, ChartHeader, ChartTitle, BarList, BarListBar, BarListItem, BarListLabel, BarListPercent, BarListValue } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const Colored = () => (\n  <div className='w-400'>\n    <Chart>\n      <ChartHeader>\n        <ChartTitle>Top 5 Endpoints</ChartTitle>\n      </ChartHeader>\n      <BarList data-testid='bar-list' max={chartMax(baseRows)}>\n        {baseRows.map(row => (\n          <BarListItem key={row.name} value={row.value}>\n            <BarListBar color={row.color} />\n            <BarListLabel>{row.name}</BarListLabel>\n            <BarListValue>\n              {formatValue(row.value)}\n              <BarListPercent variant='muted' />\n            </BarListValue>\n          </BarListItem>\n        ))}\n      </BarList>\n    </Chart>\n  </div>\n);",
          "storyFile": "SimpleCharts/BarList/BarList.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/BarList",
          "description": "`color` tints the bar with a palette hue at 16% — enough to distinguish the rows while still\nletting the row's own hover state show through it."
        },
        {
          "name": "CustomColors",
          "code": "import { Chart, ChartHeader, ChartTitle, BarList, BarListBar, BarListItem, BarListLabel, BarListPercent, BarListValue } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const CustomColors = () => (\n  <div className='w-400'>\n    <Chart>\n      <ChartHeader>\n        <ChartTitle>Top 5 Endpoints</ChartTitle>\n      </ChartHeader>\n      <BarList max={chartMax(baseRows)}>\n        {baseRows.map((row, i) => (\n          <BarListItem key={row.name} value={row.value}>\n            <BarListBar className={customColorClassNames[i]} />\n            <BarListLabel>{row.name}</BarListLabel>\n            <BarListValue>\n              {formatValue(row.value)}\n              <BarListPercent variant='muted' />\n            </BarListValue>\n          </BarListItem>\n        ))}\n      </BarList>\n    </Chart>\n  </div>\n);",
          "storyFile": "SimpleCharts/BarList/BarList.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/BarList",
          "description": "For a hue the palette does not carry, pass a `bg-*` utility on the bar instead — the\nexplicit class wins the merge against the variant's own fill."
        },
        {
          "name": "Percentage",
          "code": "import { Chart, ChartHeader, ChartTitle, BarList, BarListBar, BarListItem, BarListLabel, BarListValue } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const Percentage = () => (\n  <div className='w-400'>\n    <Chart>\n      <ChartHeader>\n        <ChartTitle>Response status</ChartTitle>\n      </ChartHeader>\n      <BarList max={100}>\n        {percentageRows.map(row => (\n          <BarListItem key={row.name} value={row.value}>\n            <BarListBar />\n            <BarListLabel>{row.name}</BarListLabel>\n            <BarListValue>{formatPercent(row.value)}</BarListValue>\n          </BarListItem>\n        ))}\n      </BarList>\n    </Chart>\n  </div>\n);",
          "storyFile": "SimpleCharts/BarList/BarList.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/BarList",
          "description": "Values that are already percentages: `max={100}`, and the value slot prints the number\nitself rather than a share derived from it."
        },
        {
          "name": "Selectable",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { FilterX } from '@wallarm-org/design-system/icons';\nimport { Chart, ChartActions, ChartHeader, ChartTitle, BarList, BarListBar, BarListItem, BarListLabel, BarListPercent, BarListValue } from '@wallarm-org/design-system/SimpleCharts';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@wallarm-org/design-system/Tooltip';\n\nexport const Selectable = () => {\n  const [selected, setSelected] = useState<string | null>(null);\n\n  return (\n    <div className='w-400'>\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Top 5 Endpoints</ChartTitle>\n          <ChartActions alwaysVisible={selected !== null}>\n            {selected !== null && (\n              <Button\n                variant='ghost'\n                color='neutral'\n                size='small'\n                aria-label='Clear selection'\n                onClick={() => setSelected(null)}\n              >\n                <FilterX />\n              </Button>\n            )}\n          </ChartActions>\n        </ChartHeader>\n        <BarList data-testid='bar-list' max={chartSum(baseRows)}>\n          {baseRows.map(row => (\n            <Tooltip key={row.name}>\n              <TooltipTrigger asChild>\n                <BarListItem\n                  value={row.value}\n                  selected={selected === row.name}\n                  onClick={() => setSelected(selected === row.name ? null : row.name)}\n                >\n                  <BarListBar />\n                  <BarListLabel>{row.name}</BarListLabel>\n                  <BarListValue>\n                    {formatValue(row.value)}\n                    <BarListPercent variant='muted' />\n                  </BarListValue>\n                </BarListItem>\n              </TooltipTrigger>\n              <TooltipContent>Click to filter</TooltipContent>\n            </Tooltip>\n          ))}\n        </BarList>\n      </Chart>\n    </div>\n  );\n};",
          "storyFile": "SimpleCharts/BarList/BarList.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/BarList",
          "description": "`selected` marks the active row — the hover tint and `aria-current` — and never touches the\nbar, whose width stays `value / max` whatever is selected."
        },
        {
          "name": "TruncatedLabels",
          "code": "import { Chart, ChartHeader, ChartTitle, BarList, BarListBar, BarListItem, BarListLabel, BarListPercent, BarListValue } from '@wallarm-org/design-system/SimpleCharts';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@wallarm-org/design-system/Tooltip';\n\nexport const TruncatedLabels = () => (\n  <div className='w-400'>\n    <Chart>\n      <ChartHeader>\n        <ChartTitle>Top 5 Endpoints</ChartTitle>\n      </ChartHeader>\n      <BarList max={chartMax(longLabelRows)}>\n        {longLabelRows.map(row => (\n          <BarListItem key={row.name} value={row.value}>\n            <BarListBar />\n            <Tooltip>\n              <TooltipTrigger asChild>\n                <BarListLabel className='pointer-events-auto'>{row.name}</BarListLabel>\n              </TooltipTrigger>\n              <TooltipContent>Example of custom description</TooltipContent>\n            </Tooltip>\n            <BarListValue>\n              {formatValue(row.value)}\n              <BarListPercent variant='muted' />\n            </BarListValue>\n          </BarListItem>\n        ))}\n      </BarList>\n    </Chart>\n  </div>\n);",
          "storyFile": "SimpleCharts/BarList/BarList.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/BarList",
          "description": "Long labels truncate at the row width. A tooltip on the label needs `pointer-events-auto`,\nsince the row's slots are transparent to the pointer by default."
        },
        {
          "name": "TruncatedLabelsWithTooltip",
          "code": "import { OverflowTooltip, OverflowTooltipContent, OverflowTooltipTrigger } from '@wallarm-org/design-system/OverflowTooltip';\nimport { Chart, ChartHeader, ChartTitle, BarList, BarListBar, BarListItem, BarListLabel, BarListPercent, BarListValue } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const TruncatedLabelsWithTooltip = () => (\n  <div className='w-400'>\n    <Chart>\n      <ChartHeader>\n        <ChartTitle>Top 5 Endpoints</ChartTitle>\n      </ChartHeader>\n      <BarList max={chartMax(longLabelRows)}>\n        {longLabelRows.map(row => (\n          <BarListItem key={row.name} value={row.value}>\n            <BarListBar />\n            <OverflowTooltip>\n              <OverflowTooltipTrigger>\n                <BarListLabel className='pointer-events-auto'>{row.name}</BarListLabel>\n              </OverflowTooltipTrigger>\n              <OverflowTooltipContent>{row.name}</OverflowTooltipContent>\n            </OverflowTooltip>\n            <BarListValue>\n              {formatValue(row.value)}\n              <BarListPercent variant='muted' />\n            </BarListValue>\n          </BarListItem>\n        ))}\n      </BarList>\n    </Chart>\n  </div>\n);",
          "storyFile": "SimpleCharts/BarList/BarList.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/BarList",
          "description": "The same labels under `OverflowTooltip`, which shows the full text only when it is actually\ncut off — the right choice when most labels fit."
        },
        {
          "name": "DataVariants",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuItemIcon, DropdownMenuLabel, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { Check, Settings } from '@wallarm-org/design-system/icons';\nimport { Chart, ChartActions, ChartHeader, ChartTitle, BarList, BarListBar, BarListItem, BarListLabel } from '@wallarm-org/design-system/SimpleCharts';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@wallarm-org/design-system/Tooltip';\nimport { cn } from '@wallarm-org/design-system/utils/cn';\n\nexport const DataVariants = () => {\n  const [key, setKey] = useState<DatasetKey>('values');\n  const [menuOpen, setMenuOpen] = useState(false);\n  const current = datasets[key];\n\n  return (\n    <div className='w-400'>\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>{current.title}</ChartTitle>\n          <ChartActions alwaysVisible={menuOpen}>\n            <Tooltip disabled={menuOpen}>\n              <TooltipTrigger asChild>\n                <span className='inline-flex'>\n                  <DropdownMenu onOpenChange={setMenuOpen}>\n                    <DropdownMenuTrigger asChild>\n                      <Button variant='ghost' color='neutral' size='small' aria-label='Settings'>\n                        <Settings />\n                      </Button>\n                    </DropdownMenuTrigger>\n                    <DropdownMenuContent>\n                      <DropdownMenuLabel>Data source</DropdownMenuLabel>\n                      <DropdownMenuGroup>\n                        {(Object.keys(datasets) as DatasetKey[]).map(k => (\n                          <DropdownMenuItem key={k} onSelect={() => setKey(k)}>\n                            <span className='flex-1'>{datasets[k].title}</span>\n                            <DropdownMenuItemIcon>\n                              <Check className={cn(key !== k && 'opacity-0')} />\n                            </DropdownMenuItemIcon>\n                          </DropdownMenuItem>\n                        ))}\n                      </DropdownMenuGroup>\n                    </DropdownMenuContent>\n                  </DropdownMenu>\n                </span>\n              </TooltipTrigger>\n              <TooltipContent>Change data source</TooltipContent>\n            </Tooltip>\n          </ChartActions>\n        </ChartHeader>\n        <BarList max={current.max}>\n          {current.rows.map(row => (\n            <BarListItem key={row.name} value={row.value}>\n              <BarListBar color={row.color} />\n              <BarListLabel>{row.name}</BarListLabel>\n              {current.renderValue(row)}\n            </BarListItem>\n          ))}\n        </BarList>\n      </Chart>\n    </div>\n  );\n};",
          "storyFile": "SimpleCharts/BarList/BarList.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/BarList",
          "description": "One card, three datasets behind a settings menu: raw counts, percentages and fractions each\nneed their own `max`, so switching the source switches that too."
        },
        {
          "name": "Loading",
          "code": "import { Chart, ChartHeader, ChartTitle, BarListSkeleton } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const Loading = () => (\n  <div className='w-400'>\n    <Chart>\n      <ChartHeader>\n        <ChartTitle>Top 5 Endpoints</ChartTitle>\n      </ChartHeader>\n      <BarListSkeleton data-testid='bar-list-skeleton' rows={5} />\n    </Chart>\n  </div>\n);",
          "storyFile": "SimpleCharts/BarList/BarList.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/BarList",
          "description": "`BarListSkeleton` stands in for the list while data loads, taking a row count so the card\nholds the height it will end up at."
        },
        {
          "name": "Overflow",
          "code": "import { Chart, ChartHeader, ChartTitle, BarList, BarListBar, BarListItem, BarListLabel, BarListPercent, BarListValue } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const Overflow = () => (\n  <div className='w-400'>\n    <Chart>\n      <ChartHeader>\n        <ChartTitle>Overflow & zero</ChartTitle>\n      </ChartHeader>\n      <BarList data-testid='bar-list' max={100}>\n        {overflowRows.map(row => (\n          <BarListItem key={row.name} value={row.value}>\n            <BarListBar />\n            <BarListLabel>{row.name}</BarListLabel>\n            <BarListValue>\n              {formatValue(row.value)}\n              <BarListPercent variant='muted' />\n            </BarListValue>\n          </BarListItem>\n        ))}\n      </BarList>\n    </Chart>\n  </div>\n);",
          "storyFile": "SimpleCharts/BarList/BarList.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/BarList",
          "description": "A value above `max` caps the bar at full width and the label at 100%, rather than\noverrunning the row."
        },
        {
          "name": "InvalidMax",
          "code": "import { Chart, ChartHeader, ChartTitle, BarList, BarListBar, BarListItem, BarListLabel, BarListPercent, BarListValue } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const InvalidMax = () => (\n  <div className='w-400'>\n    <Chart>\n      <ChartHeader>\n        <ChartTitle>Invalid max</ChartTitle>\n      </ChartHeader>\n      <BarList data-testid='bar-list' max={0}>\n        {baseRows.map(row => (\n          <BarListItem key={row.name} value={row.value}>\n            <BarListBar />\n            <BarListLabel>{row.name}</BarListLabel>\n            <BarListValue>\n              {formatValue(row.value)}\n              <BarListPercent variant='muted' />\n            </BarListValue>\n          </BarListItem>\n        ))}\n      </BarList>\n    </Chart>\n  </div>\n);",
          "storyFile": "SimpleCharts/BarList/BarList.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/BarList",
          "description": "`max={0}` is not a division the component will guess at: every row renders empty at 0%, with\na single warning in development."
        },
        {
          "name": "PercentDigits",
          "code": "import { Chart, ChartHeader, ChartTitle, BarList, BarListBar, BarListItem, BarListLabel, BarListPercent, BarListValue } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const PercentDigits = () => (\n  <div className='w-400'>\n    <Chart>\n      <ChartHeader>\n        <ChartTitle>Decimal precision</ChartTitle>\n      </ChartHeader>\n      <BarList data-testid='bar-list' max={chartSum(baseRows)}>\n        {baseRows.map(row => (\n          <BarListItem key={row.name} value={row.value}>\n            <BarListBar />\n            <BarListLabel>{row.name}</BarListLabel>\n            <BarListValue>\n              {formatValue(row.value)}\n              <BarListPercent digits={1} variant='muted' />\n            </BarListValue>\n          </BarListItem>\n        ))}\n      </BarList>\n    </Chart>\n  </div>\n);",
          "storyFile": "SimpleCharts/BarList/BarList.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/BarList",
          "description": "`digits` adds decimal places, for a set of shares too close together to tell apart as whole\nnumbers."
        },
        {
          "name": "PercentVariants",
          "code": "import { Chart, ChartHeader, ChartTitle, BarList, BarListBar, BarListItem, BarListLabel, BarListPercent, BarListValue } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const PercentVariants = () => (\n  <div className='flex flex-col gap-16 w-400'>\n    <Chart>\n      <ChartHeader>\n        <ChartTitle>Split — value primary, % secondary (default)</ChartTitle>\n      </ChartHeader>\n      <BarList data-testid='bar-list-split' max={chartSum(baseRows)}>\n        {baseRows.map(row => (\n          <BarListItem key={row.name} value={row.value}>\n            <BarListBar />\n            <BarListLabel>{row.name}</BarListLabel>\n            <BarListValue>\n              {formatValue(row.value)}\n              <BarListPercent variant='split' />\n            </BarListValue>\n          </BarListItem>\n        ))}\n      </BarList>\n    </Chart>\n\n    <Chart>\n      <ChartHeader>\n        <ChartTitle>Muted — both tokens secondary</ChartTitle>\n      </ChartHeader>\n      <BarList max={chartSum(baseRows)}>\n        {baseRows.map(row => (\n          <BarListItem key={row.name} value={row.value}>\n            <BarListBar />\n            <BarListLabel>{row.name}</BarListLabel>\n            <BarListValue>\n              {formatValue(row.value)}\n              <BarListPercent variant='muted' />\n            </BarListValue>\n          </BarListItem>\n        ))}\n      </BarList>\n    </Chart>\n\n    <Chart>\n      <ChartHeader>\n        <ChartTitle>Inherit — follows BarListValue color</ChartTitle>\n      </ChartHeader>\n      <BarList max={chartSum(baseRows)}>\n        {baseRows.map(row => (\n          <BarListItem key={row.name} value={row.value}>\n            <BarListBar />\n            <BarListLabel>{row.name}</BarListLabel>\n            <BarListValue>\n              {formatValue(row.value)}\n              <BarListPercent variant='inherit' />\n            </BarListValue>\n          </BarListItem>\n        ))}\n      </BarList>\n    </Chart>\n  </div>\n);",
          "storyFile": "SimpleCharts/BarList/BarList.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/BarList",
          "description": "The three percent treatments — `split` colours the number and the `%` differently and is the\nFigma default, `muted` sets both back, `inherit` leaves them to the row."
        },
        {
          "name": "Default",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { FilterX, Settings } from '@wallarm-org/design-system/icons';\nimport { Chart, ChartActions, ChartEmpty, ChartHeader, ChartTitle } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const Default = () => (\n  <div className='w-400'>\n    <Chart data-testid='chart'>\n      <ChartHeader>\n        <ChartTitle>Top 5 Endpoints</ChartTitle>\n        <ChartActions>\n          <Button variant='ghost' color='neutral' size='small' aria-label='Clear filter'>\n            <FilterX />\n          </Button>\n          <Button variant='ghost' color='neutral' size='small' aria-label='Settings'>\n            <Settings />\n          </Button>\n        </ChartActions>\n      </ChartHeader>\n      <ChartEmpty>chart content</ChartEmpty>\n    </Chart>\n  </div>\n);",
          "storyFile": "SimpleCharts/Chart/Chart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/Chart",
          "description": "The frame with everything it owns — title, hover-revealed actions, and a body slot standing\nin for the chart."
        },
        {
          "name": "WithAlwaysVisibleActions",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { FilterX, Settings } from '@wallarm-org/design-system/icons';\nimport { Chart, ChartActions, ChartEmpty, ChartHeader, ChartTitle } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const WithAlwaysVisibleActions = () => (\n  <div className='w-400'>\n    <Chart data-testid='chart'>\n      <ChartHeader>\n        <ChartTitle>Top 5 Endpoints</ChartTitle>\n        <ChartActions alwaysVisible>\n          <Button variant='ghost' color='neutral' size='small' aria-label='Clear filter'>\n            <FilterX />\n          </Button>\n          <Button variant='ghost' color='neutral' size='small' aria-label='Settings'>\n            <Settings />\n          </Button>\n        </ChartActions>\n      </ChartHeader>\n      <ChartEmpty>filtered chart content</ChartEmpty>\n    </Chart>\n  </div>\n);",
          "storyFile": "SimpleCharts/Chart/Chart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/Chart",
          "description": "`alwaysVisible` pins the actions open, which is what a card does while a filter is applied:\nthe control that clears it must not need hovering to be found."
        },
        {
          "name": "CustomSize",
          "code": "import { Chart, ChartEmpty, ChartHeader, ChartTitle } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const CustomSize = () => (\n  <Chart className='w-640 h-320'>\n    <ChartHeader>\n      <ChartTitle>Custom 640 × 320</ChartTitle>\n    </ChartHeader>\n    <ChartEmpty>tall chart content</ChartEmpty>\n  </Chart>\n);",
          "storyFile": "SimpleCharts/Chart/Chart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/Chart",
          "description": "The card is a full-width block with a minimum height; give it a width and height directly\nwhen a dashboard slot demands a particular size."
        },
        {
          "name": "LongTitle",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { FilterX, Settings } from '@wallarm-org/design-system/icons';\nimport { Chart, ChartActions, ChartEmpty, ChartHeader, ChartTitle } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const LongTitle = () => (\n  <div className='w-300'>\n    <Chart>\n      <ChartHeader>\n        <ChartTitle>\n          A very long chart title that needs to be truncated so actions remain visible\n        </ChartTitle>\n        <ChartActions>\n          <Button variant='ghost' color='neutral' size='small' aria-label='Clear filter'>\n            <FilterX />\n          </Button>\n          <Button variant='ghost' color='neutral' size='small' aria-label='Settings'>\n            <Settings />\n          </Button>\n        </ChartActions>\n      </ChartHeader>\n      <ChartEmpty>chart content</ChartEmpty>\n    </Chart>\n  </div>\n);",
          "storyFile": "SimpleCharts/Chart/Chart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/Chart",
          "description": "`ChartTitle` stays on one line and truncates, so the actions keep their place however long\nthe title runs."
        },
        {
          "name": "Empty",
          "code": "import { Chart, ChartEmpty, ChartHeader, ChartTitle } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const Empty = () => (\n  <div className='w-400'>\n    <Chart>\n      <ChartHeader>\n        <ChartTitle>Top 5 Endpoints</ChartTitle>\n      </ChartHeader>\n      <ChartEmpty />\n    </Chart>\n  </div>\n);",
          "storyFile": "SimpleCharts/Chart/Chart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/Chart",
          "description": "`ChartEmpty` centres a default 'No data' in the body — the frame and the title stay, so the\ncard does not vanish from the grid when its data does."
        },
        {
          "name": "EmptyWithCustomMessage",
          "code": "import { Chart, ChartEmpty, ChartHeader, ChartTitle } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const EmptyWithCustomMessage = () => (\n  <div className='w-400'>\n    <Chart>\n      <ChartHeader>\n        <ChartTitle>Top 5 Endpoints</ChartTitle>\n      </ChartHeader>\n      <ChartEmpty>No endpoints match the current filter</ChartEmpty>\n    </Chart>\n  </div>\n);",
          "storyFile": "SimpleCharts/Chart/Chart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/Chart",
          "description": "Pass children to say why it is empty. A card emptied by a filter should say so, since the\nfix is different from having no data at all."
        },
        {
          "name": "Default",
          "code": "import { Chart, ChartHeader, ChartTitle, useChartTimeFormatters, LineChartGrid, LineChartHoverPopoverDot, LineChartLegend, LineChartLegendItem, LineChartTooltip, LineChartYAxis, ColumnChart, ColumnChartBody, ColumnChartStack, ColumnChartXAxis } from '@wallarm-org/design-system/SimpleCharts';\nimport { formatFullNumber } from '@wallarm-org/design-system/utils/abbreviateNumber';\n\nexport const Default = () => {\n  const { formatDate, formatDateWithTimezone } = useChartTimeFormatters();\n  return (\n    <div className='w-800'>\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Findings by verdict</ChartTitle>\n        </ChartHeader>\n        <ColumnChart data={findings} series={verdicts} xKey='timestamp' data-testid='column-chart'>\n          <LineChartLegend>\n            {verdicts.map(s => (\n              <LineChartLegendItem key={s.key} seriesKey={s.key}>\n                <LineChartHoverPopoverDot color={s.color} />\n                <span className='text-xs font-mono text-text-primary'>{s.label}</span>\n                <span className='text-xs font-mono font-medium text-text-primary'>\n                  {formatFullNumber(findingsTotals[s.key] ?? 0)}\n                </span>\n              </LineChartLegendItem>\n            ))}\n          </LineChartLegend>\n          <ColumnChartBody>\n            <LineChartGrid />\n            <ColumnChartXAxis tickFormatter={formatDate} />\n            <LineChartYAxis tickFormatter={formatYTick} />\n            <ColumnChartStack />\n            <LineChartTooltip xTickFormatter={formatDateWithTimezone} />\n          </ColumnChartBody>\n        </ColumnChart>\n      </Chart>\n    </div>\n  );\n};",
          "storyFile": "SimpleCharts/ColumnChart/ColumnChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/Vertical Stacked Columns Chart",
          "description": "Findings by verdict over a week: the legend carries each verdict and its total for the\nperiod, a column per day stacks the verdicts in legend order with the first on top. Hover a\ncolumn for the day's breakdown, or a legend item to fade the other verdicts out."
        },
        {
          "name": "AdaptiveWidth",
          "code": "import { Chart, ChartHeader, ChartTitle, useChartTimeFormatters, LineChartGrid, LineChartTooltip, LineChartYAxis, ColumnChart, ColumnChartBody, ColumnChartStack, ColumnChartXAxis } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const AdaptiveWidth = () => {\n  const { formatDate, formatDateWithTimezone } = useChartTimeFormatters();\n  return (\n    <div className='flex gap-16'>\n      <div className='w-428'>\n        <Chart>\n          <ChartHeader>\n            <ChartTitle>7 days</ChartTitle>\n          </ChartHeader>\n          <ColumnChart\n            data={findings}\n            series={verdicts}\n            xKey='timestamp'\n            data-testid='column-chart-week'\n          >\n            <ColumnChartBody>\n              <LineChartGrid />\n              <ColumnChartXAxis tickFormatter={formatDate} />\n              <LineChartYAxis tickFormatter={formatYTick} />\n              <ColumnChartStack />\n              <LineChartTooltip xTickFormatter={formatDateWithTimezone} />\n            </ColumnChartBody>\n          </ColumnChart>\n        </Chart>\n      </div>\n      <div className='w-428'>\n        <Chart>\n          <ChartHeader>\n            <ChartTitle>14 days</ChartTitle>\n          </ChartHeader>\n          <ColumnChart\n            data={findings14}\n            series={verdicts}\n            xKey='timestamp'\n            data-testid='column-chart-two-weeks'\n          >\n            <ColumnChartBody>\n              <LineChartGrid />\n              <ColumnChartXAxis tickFormatter={formatDate} />\n              <LineChartYAxis tickFormatter={formatYTick} />\n              <ColumnChartStack />\n              <LineChartTooltip xTickFormatter={formatDateWithTimezone} />\n            </ColumnChartBody>\n          </ColumnChart>\n        </Chart>\n      </div>\n    </div>\n  );\n};",
          "storyFile": "SimpleCharts/ColumnChart/ColumnChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/Vertical Stacked Columns Chart",
          "description": "Column width follows the chart width and the number of steps: up to 32px, a fixed 22px\nbetween columns below that, and 16px at least. The same week in a narrow card keeps 32px\ncolumns; two weeks in it narrow them."
        },
        {
          "name": "CardHeight",
          "code": "import { Chart, ChartHeader, ChartTitle, useChartTimeFormatters, LineChartGrid, LineChartHoverPopoverDot, LineChartLegend, LineChartLegendItem, LineChartTooltip, LineChartYAxis, ColumnChart, ColumnChartBody, ColumnChartStack, ColumnChartXAxis } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const CardHeight = () => {\n  const { formatDate, formatDateWithTimezone } = useChartTimeFormatters();\n  return (\n    <div className='flex w-800 flex-col gap-16'>\n      <Chart className='h-128'>\n        <ChartHeader>\n          <ChartTitle>128px card</ChartTitle>\n        </ChartHeader>\n        <ColumnChart\n          data={findings}\n          series={verdicts}\n          xKey='timestamp'\n          data-testid='column-chart-min'\n        >\n          <LineChartLegend>\n            {verdicts.map(s => (\n              <LineChartLegendItem key={s.key} seriesKey={s.key}>\n                <LineChartHoverPopoverDot color={s.color} />\n                <span className='text-xs font-mono text-text-primary'>{s.label}</span>\n              </LineChartLegendItem>\n            ))}\n          </LineChartLegend>\n          <ColumnChartBody>\n            <LineChartGrid />\n            <ColumnChartXAxis tickFormatter={formatDate} />\n            <LineChartYAxis tickFormatter={formatYTick} />\n            <ColumnChartStack />\n            <LineChartTooltip xTickFormatter={formatDateWithTimezone} />\n          </ColumnChartBody>\n        </ColumnChart>\n      </Chart>\n      <Chart className='h-320'>\n        <ChartHeader>\n          <ChartTitle>320px card</ChartTitle>\n        </ChartHeader>\n        <ColumnChart\n          data={findings}\n          series={verdicts}\n          xKey='timestamp'\n          data-testid='column-chart-tall'\n        >\n          <LineChartLegend>\n            {verdicts.map(s => (\n              <LineChartLegendItem key={s.key} seriesKey={s.key}>\n                <LineChartHoverPopoverDot color={s.color} />\n                <span className='text-xs font-mono text-text-primary'>{s.label}</span>\n              </LineChartLegendItem>\n            ))}\n          </LineChartLegend>\n          <ColumnChartBody>\n            <LineChartGrid />\n            <ColumnChartXAxis tickFormatter={formatDate} />\n            <LineChartYAxis tickFormatter={formatYTick} />\n            <ColumnChartStack />\n            <LineChartTooltip xTickFormatter={formatDateWithTimezone} />\n          </ColumnChartBody>\n        </ColumnChart>\n      </Chart>\n    </div>\n  );\n};",
          "storyFile": "SimpleCharts/ColumnChart/ColumnChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/Vertical Stacked Columns Chart",
          "description": "The plot follows the card height: set a height on `<Chart>` and the columns stretch or\nshrink with it. The card goes down to 128px — header, legend and a 72px plot."
        },
        {
          "name": "ClickableLegend",
          "code": "import { type MouseEvent } from 'react';\nimport { Chart, ChartHeader, ChartTitle, useChartTimeFormatters, LineChartGrid, LineChartHoverPopoverDot, LineChartLegend, LineChartLegendItem, LineChartTooltip, LineChartYAxis, ColumnChart, ColumnChartBody, ColumnChartStack, ColumnChartXAxis } from '@wallarm-org/design-system/SimpleCharts';\nimport { formatFullNumber } from '@wallarm-org/design-system/utils/abbreviateNumber';\n\nexport const ClickableLegend = () => {\n  const { formatDate, formatDateWithTimezone } = useChartTimeFormatters();\n  const handleLegendClick = (event: MouseEvent<HTMLDivElement>) => {\n    openVerdict(event.currentTarget.dataset.key);\n  };\n  return (\n    <div className='w-800'>\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Click a verdict to open it</ChartTitle>\n        </ChartHeader>\n        <ColumnChart data={findings} series={verdicts} xKey='timestamp' data-testid='column-chart'>\n          <LineChartLegend>\n            {verdicts.map(s => (\n              <LineChartLegendItem key={s.key} seriesKey={s.key} onClick={handleLegendClick}>\n                <LineChartHoverPopoverDot color={s.color} />\n                <span className='text-xs font-mono text-text-primary'>{s.label}</span>\n                <span className='text-xs font-mono font-medium text-text-primary'>\n                  {formatFullNumber(findingsTotals[s.key] ?? 0)}\n                </span>\n              </LineChartLegendItem>\n            ))}\n          </LineChartLegend>\n          <ColumnChartBody>\n            <LineChartGrid />\n            <ColumnChartXAxis tickFormatter={formatDate} />\n            <LineChartYAxis tickFormatter={formatYTick} />\n            <ColumnChartStack />\n            <LineChartTooltip xTickFormatter={formatDateWithTimezone} />\n          </ColumnChartBody>\n        </ColumnChart>\n      </Chart>\n    </div>\n  );\n};",
          "storyFile": "SimpleCharts/ColumnChart/ColumnChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/Vertical Stacked Columns Chart",
          "description": "Legend items become buttons when they get an `onClick` — here a verdict opens its list, as\non the Agentic Overview. The item's `data-key` carries the series key, so one handler serves\nevery item. Hover and keyboard focus fade the other verdicts out alike."
        },
        {
          "name": "Loading",
          "code": "import { Chart, ChartHeader, ChartTitle, LineChartEmpty, LineChartLegend, LineChartLegendItem } from '@wallarm-org/design-system/SimpleCharts';\nimport { Skeleton } from '@wallarm-org/design-system/Skeleton';\n\nexport const Loading = () => (\n  <div className='w-800'>\n    <Chart aria-busy='true' aria-live='polite'>\n      <ChartHeader>\n        <ChartTitle>Findings by verdict</ChartTitle>\n      </ChartHeader>\n      <LineChartLegend>\n        {verdicts.map(s => (\n          <LineChartLegendItem key={s.key} seriesKey={s.key}>\n            <Skeleton width='96px' height='16px' rounded={4} />\n          </LineChartLegendItem>\n        ))}\n      </LineChartLegend>\n      <LineChartEmpty />\n    </Chart>\n  </div>\n);",
          "storyFile": "SimpleCharts/ColumnChart/ColumnChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/Vertical Stacked Columns Chart",
          "description": "Loading: skeleton legend items over `LineChartEmpty`'s dashed plot frame."
        },
        {
          "name": "Empty",
          "code": "import { Chart, ChartHeader, ChartTitle, LineChartEmpty } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const Empty = () => (\n  <div className='w-800'>\n    <Chart>\n      <ChartHeader>\n        <ChartTitle>Findings by verdict</ChartTitle>\n      </ChartHeader>\n      <LineChartEmpty>No findings in this period</LineChartEmpty>\n    </Chart>\n  </div>\n);",
          "storyFile": "SimpleCharts/ColumnChart/ColumnChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/Vertical Stacked Columns Chart",
          "description": "Empty: `LineChartEmpty` keeps the dashed plot frame and puts the message inside it."
        },
        {
          "name": "Default",
          "code": "import { Chart, ChartHeader, ChartTitle, HorizontalBarStack } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const Default = () => (\n  <div className='w-400'>\n    <Chart>\n      <ChartHeader>\n        <ChartTitle>Findings by severity</ChartTitle>\n      </ChartHeader>\n      <HorizontalBarStack />\n    </Chart>\n  </div>\n);",
          "storyFile": "SimpleCharts/HorizontalBarStack/HorizontalBarStack.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/HorizontalBarStack",
          "description": "The full shape: a headline value with its delta, a three-part band, and the legend that\nnames the parts."
        },
        {
          "name": "NoDelta",
          "code": "import { Chart, ChartHeader, ChartTitle, HorizontalBarStack } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const NoDelta = () => (\n  <div className='w-400'>\n    <Chart>\n      <ChartHeader>\n        <ChartTitle>Findings by severity</ChartTitle>\n      </ChartHeader>\n      <HorizontalBarStack />\n    </Chart>\n  </div>\n);",
          "storyFile": "SimpleCharts/HorizontalBarStack/HorizontalBarStack.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/HorizontalBarStack",
          "description": "The same without the delta — a value with no comparison to make yet."
        },
        {
          "name": "NoValue",
          "code": "import { Chart, ChartHeader, ChartTitle, HorizontalBarStack } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const NoValue = () => (\n  <div className='w-400'>\n    <Chart>\n      <ChartHeader>\n        <ChartTitle>Findings by severity</ChartTitle>\n      </ChartHeader>\n      <HorizontalBarStack />\n    </Chart>\n  </div>\n);",
          "storyFile": "SimpleCharts/HorizontalBarStack/HorizontalBarStack.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/HorizontalBarStack",
          "description": "No header at all: the band and its legend alone, for a card whose total is already stated\nsomewhere else."
        },
        {
          "name": "WithRemainder",
          "code": "import { Chart, ChartHeader, ChartTitle, HorizontalBarStack } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const WithRemainder = () => (\n  <div className='w-400'>\n    <Chart>\n      <ChartHeader>\n        <ChartTitle>Findings by severity</ChartTitle>\n      </ChartHeader>\n      <HorizontalBarStack />\n    </Chart>\n  </div>\n);",
          "storyFile": "SimpleCharts/HorizontalBarStack/HorizontalBarStack.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/HorizontalBarStack",
          "description": "A `total` above the sum of the parts fills the difference with a grey tail — 91 of 120,\nwhere the 29 nobody has accounted for is part of what the card says."
        },
        {
          "name": "LegendOff",
          "code": "import { Chart, ChartHeader, ChartTitle, HorizontalBarStack } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const LegendOff = () => (\n  <div className='w-400'>\n    <Chart>\n      <ChartHeader>\n        <ChartTitle>Findings by severity</ChartTitle>\n      </ChartHeader>\n      <HorizontalBarStack />\n    </Chart>\n  </div>\n);",
          "storyFile": "SimpleCharts/HorizontalBarStack/HorizontalBarStack.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/HorizontalBarStack",
          "description": "`legend={false}` leaves the band on its own, for a card too small to carry names or one\nwhose legend is already nearby."
        },
        {
          "name": "Palette",
          "code": "import { Chart, ChartHeader, ChartTitle, HorizontalBarStack } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const Palette = () => (\n  <div className='w-400'>\n    <Chart>\n      <ChartHeader>\n        <ChartTitle>Findings by severity</ChartTitle>\n      </ChartHeader>\n      <HorizontalBarStack />\n    </Chart>\n  </div>\n);",
          "storyFile": "SimpleCharts/HorizontalBarStack/HorizontalBarStack.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/HorizontalBarStack",
          "description": "All six chart colours in one band, which is the check that they stay tellable apart at the\nwidths a real breakdown gives them."
        },
        {
          "name": "Loading",
          "code": "import { Chart, ChartHeader, ChartTitle, HorizontalBarStackSkeleton } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const Loading = () => (\n  <div className='w-400'>\n    <Chart>\n      <ChartHeader>\n        <ChartTitle>Findings by severity</ChartTitle>\n      </ChartHeader>\n      <HorizontalBarStackSkeleton data-testid='horizontal-bar-stack-skeleton' />\n    </Chart>\n  </div>\n);",
          "storyFile": "SimpleCharts/HorizontalBarStack/HorizontalBarStack.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/HorizontalBarStack",
          "description": "`HorizontalBarStackSkeleton` stands in while the card loads, holding the header and band\nheights so nothing shifts when data arrives."
        },
        {
          "name": "Selectable",
          "code": "import { useState } from 'react';\nimport { Chart, ChartHeader, ChartTitle, MetricHeader, MetricValue, HorizontalBarStack } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const Selectable = () => {\n  const [selected, setSelected] = useState<string | null>('Critical');\n  return (\n    <div className='w-400'>\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Findings by severity</ChartTitle>\n        </ChartHeader>\n        <HorizontalBarStack\n          data-testid='horizontal-bar-stack'\n          data={severityData}\n          selectedNames={selected ? [selected] : []}\n          onSelect={name => setSelected(prev => (prev === name ? null : name))}\n        >\n          <MetricHeader>\n            <MetricValue>91</MetricValue>\n          </MetricHeader>\n        </HorizontalBarStack>\n      </Chart>\n    </div>\n  );\n};",
          "storyFile": "SimpleCharts/HorizontalBarStack/HorizontalBarStack.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/HorizontalBarStack",
          "description": "`onSelect` turns the legend into a filter — the chosen series stays bright, the rest fade,\nand clicking it again clears. Hover always wins, so pointing at any series brings it forward\nregardless of what is selected."
        },
        {
          "name": "Default",
          "code": "import { Chart, ChartHeader, ChartTitle, useChartTimeFormatters, LineChart, LineChartBody, LineChartGrid, LineChartLine, LineChartTooltip, LineChartXAxis, LineChartYAxis } from '@wallarm-org/design-system/SimpleCharts';\nimport { hourlyData24, singleSeries } from './lib/sampleData';\n\nexport const Default = () => {\n  const { formatHour, formatHourWithTimezone } = useChartTimeFormatters();\n  return (\n    <div className='w-560'>\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Requests per hour</ChartTitle>\n        </ChartHeader>\n        <LineChart data={hourlyData24} series={singleSeries} xKey='timestamp'>\n          <LineChartBody>\n            <LineChartGrid />\n            <LineChartXAxis tickFormatter={formatHour} minTickGap={32} />\n            <LineChartYAxis tickFormatter={formatYTick} />\n            <LineChartLine seriesKey='requests' curve='linear' />\n            <LineChartTooltip xTickFormatter={formatHourWithTimezone} />\n          </LineChartBody>\n        </LineChart>\n      </Chart>\n    </div>\n  );\n};",
          "storyFile": "SimpleCharts/LineChart/LineChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/LineChart",
          "description": "One series with the full chrome — grid, both axes, and a tooltip that follows the pointer\nalong the line."
        },
        {
          "name": "DefaultMulti",
          "code": "import { Chart, ChartHeader, ChartTitle, useChartTimeFormatters, LineChart, LineChartBody, LineChartGrid, LineChartHoverPopoverDot, LineChartLegend, LineChartLegendItem, LineChartLine, LineChartTooltip, LineChartXAxis, LineChartYAxis } from '@wallarm-org/design-system/SimpleCharts';\nimport { hourlyData24, multiSeries } from './lib/sampleData';\n\nexport const DefaultMulti = () => {\n  const { formatHour, formatHourWithTimezone } = useChartTimeFormatters();\n  return (\n    <div className='w-560'>\n      <Chart data-testid='chart'>\n        <ChartHeader>\n          <ChartTitle>Traffic, errors, and latency</ChartTitle>\n        </ChartHeader>\n        <LineChart\n          data-testid='line-chart'\n          data={hourlyData24}\n          series={multiSeries}\n          xKey='timestamp'\n        >\n          <LineChartLegend>\n            {multiSeries.map(s => (\n              <LineChartLegendItem key={s.key} seriesKey={s.key}>\n                <LineChartHoverPopoverDot color={s.color} />\n                <span className='text-xs font-mono text-text-primary'>{s.label}</span>\n              </LineChartLegendItem>\n            ))}\n          </LineChartLegend>\n          <LineChartBody>\n            <LineChartGrid />\n            <LineChartXAxis tickFormatter={formatHour} minTickGap={32} />\n            <LineChartYAxis tickFormatter={formatYTick} />\n            {multiSeries.map(s => (\n              <LineChartLine key={s.key} seriesKey={s.key} />\n            ))}\n            <LineChartTooltip xTickFormatter={formatHourWithTimezone} />\n          </LineChartBody>\n        </LineChart>\n      </Chart>\n    </div>\n  );\n};",
          "storyFile": "SimpleCharts/LineChart/LineChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/LineChart",
          "description": "Three series with a legend composed from `LineChartLegendItem` rows. The dot in each row is\nthe same one the tooltip uses, so the colours cannot drift apart."
        },
        {
          "name": "WithMetric",
          "code": "import { Chart, ChartHeader, ChartTitle, useChartTimeFormatters, MetricDelta, MetricHeader, MetricValue, LineChart, LineChartBody, LineChartGrid, LineChartLine, LineChartTooltip, LineChartXAxis, LineChartYAxis } from '@wallarm-org/design-system/SimpleCharts';\nimport { hourlyData24, multiSeries } from './lib/sampleData';\n\nexport const WithMetric = () => {\n  const { formatHour, formatHourWithTimezone } = useChartTimeFormatters();\n  return (\n    <div className='w-800'>\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Requests per hour</ChartTitle>\n        </ChartHeader>\n        <LineChart data={hourlyData24} series={multiSeries} xKey='timestamp'>\n          <div className='flex items-center justify-between pr-8'>\n            <MetricHeader className='px-16'>\n              <MetricValue>{2903}</MetricValue>\n              <MetricDelta value={10} trend='up' sentiment='negative' />\n            </MetricHeader>\n            <MultiLegend />\n          </div>\n          <LineChartBody>\n            <LineChartGrid />\n            <LineChartXAxis tickFormatter={formatHour} minTickGap={32} />\n            <LineChartYAxis tickFormatter={formatYTick} />\n            {multiSeries.map(s => (\n              <LineChartLine key={s.key} seriesKey={s.key} />\n            ))}\n            <LineChartTooltip xTickFormatter={formatHourWithTimezone} />\n          </LineChartBody>\n        </LineChart>\n      </Chart>\n    </div>\n  );\n};",
          "storyFile": "SimpleCharts/LineChart/LineChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/LineChart",
          "description": "The metric variant: the shared `Metric` bricks sit to the left of the legend in a row of\ntheir own between the header and the plot. Pure composition — the chart is untouched and the\ncard simply grows by that row."
        },
        {
          "name": "Curves",
          "code": "import { Chart, ChartHeader, ChartTitle, useChartTimeFormatters, LineChart, LineChartBody, LineChartGrid, LineChartLine, LineChartTooltip, LineChartXAxis, LineChartYAxis } from '@wallarm-org/design-system/SimpleCharts';\nimport { hourlyData24, multiSeries } from './lib/sampleData';\n\nexport const Curves = () => {\n  const { formatHour, formatHourWithTimezone } = useChartTimeFormatters();\n  return (\n    <div className='grid grid-cols-2 gap-16 w-1120'>\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Linear interpolation</ChartTitle>\n        </ChartHeader>\n        <LineChart data={hourlyData24} series={multiSeries} xKey='timestamp'>\n          <MultiLegend />\n          <LineChartBody>\n            <LineChartGrid />\n            <LineChartXAxis tickFormatter={formatHour} minTickGap={32} />\n            <LineChartYAxis tickFormatter={formatYTick} />\n            {multiSeries.map(s => (\n              <LineChartLine key={s.key} seriesKey={s.key} curve='linear' />\n            ))}\n            <LineChartTooltip xTickFormatter={formatHourWithTimezone} />\n          </LineChartBody>\n        </LineChart>\n      </Chart>\n\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Mixed curves — monotone vs linear</ChartTitle>\n        </ChartHeader>\n        <LineChart data={hourlyData24} series={multiSeries} xKey='timestamp'>\n          <MultiLegend />\n          <LineChartBody>\n            <LineChartGrid />\n            <LineChartXAxis tickFormatter={formatHour} minTickGap={32} />\n            <LineChartYAxis tickFormatter={formatYTick} />\n            <LineChartLine seriesKey='requests' curve='monotone' />\n            <LineChartLine seriesKey='errors' curve='linear' />\n            <LineChartLine seriesKey='latency' curve='linear' />\n            <LineChartTooltip xTickFormatter={formatHourWithTimezone} />\n          </LineChartBody>\n        </LineChart>\n      </Chart>\n    </div>\n  );\n};",
          "storyFile": "SimpleCharts/LineChart/LineChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/LineChart",
          "description": "Straight joins tell the truth about where the samples are; `monotone` smooths between them\nand reads better for a rate. Mix the two only when the series mean genuinely different\nthings."
        },
        {
          "name": "LineStyling",
          "code": "import { Chart, ChartHeader, ChartTitle, useChartTimeFormatters, LineChart, LineChartBody, LineChartGrid, LineChartLine, LineChartTooltip, LineChartXAxis, LineChartYAxis } from '@wallarm-org/design-system/SimpleCharts';\nimport { customColorSeries, dashedSeries, hourlyData24 } from './lib/sampleData';\n\nexport const LineStyling = () => {\n  const { formatHour, formatHourWithTimezone } = useChartTimeFormatters();\n  return (\n    <div className='grid grid-cols-2 gap-16 w-1120'>\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Solid + dashed series</ChartTitle>\n        </ChartHeader>\n        <LineChart data={hourlyData24} series={dashedSeries} xKey='timestamp'>\n          <MultiLegend series={dashedSeries} />\n          <LineChartBody>\n            <LineChartGrid />\n            <LineChartXAxis tickFormatter={formatHour} minTickGap={32} />\n            <LineChartYAxis tickFormatter={formatYTick} />\n            {dashedSeries.map(s => (\n              <LineChartLine key={s.key} seriesKey={s.key} />\n            ))}\n            <LineChartTooltip xTickFormatter={formatHourWithTimezone} />\n          </LineChartBody>\n        </LineChart>\n      </Chart>\n\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Custom palette via CSS color string</ChartTitle>\n        </ChartHeader>\n        <LineChart data={hourlyData24} series={customColorSeries} xKey='timestamp'>\n          <MultiLegend series={customColorSeries} />\n          <LineChartBody>\n            <LineChartGrid />\n            <LineChartXAxis tickFormatter={formatHour} minTickGap={32} />\n            <LineChartYAxis tickFormatter={formatYTick} />\n            {customColorSeries.map(s => (\n              <LineChartLine key={s.key} seriesKey={s.key} />\n            ))}\n            <LineChartTooltip xTickFormatter={formatHourWithTimezone} />\n          </LineChartBody>\n        </LineChart>\n      </Chart>\n    </div>\n  );\n};",
          "storyFile": "SimpleCharts/LineChart/LineChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/LineChart",
          "description": "A dashed series against a solid one — the way to separate a threshold or a projection from\nmeasured data — and a CSS colour string for a series whose colour is decided elsewhere."
        },
        {
          "name": "EdgeCases",
          "code": "import { Chart, ChartHeader, ChartTitle, useChartTimeFormatters, LineChart, LineChartBody, LineChartGrid, LineChartLine, LineChartTooltip, LineChartXAxis, LineChartYAxis } from '@wallarm-org/design-system/SimpleCharts';\nimport { dataWithErrorGaps, hourlyData24, multiSeries, singlePointData, singleSeries } from './lib/sampleData';\n\nexport const EdgeCases = () => {\n  const { formatHour, formatHourWithTimezone } = useChartTimeFormatters();\n  return (\n    <div className='grid grid-cols-2 gap-16 w-1120'>\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Sparkline — no chrome</ChartTitle>\n        </ChartHeader>\n        <LineChart data={hourlyData24} series={singleSeries} xKey='timestamp'>\n          <LineChartBody>\n            <LineChartLine seriesKey='requests' />\n          </LineChartBody>\n        </LineChart>\n      </Chart>\n\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Single data point</ChartTitle>\n        </ChartHeader>\n        <LineChart data={singlePointData} series={singleSeries} xKey='timestamp'>\n          <LineChartBody>\n            <LineChartGrid />\n            <LineChartXAxis tickFormatter={formatHour} />\n            <LineChartYAxis tickFormatter={formatYTick} />\n            <LineChartLine seriesKey='requests' />\n            <LineChartTooltip xTickFormatter={formatHourWithTimezone} />\n          </LineChartBody>\n        </LineChart>\n      </Chart>\n\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Series with null gaps</ChartTitle>\n        </ChartHeader>\n        <LineChart data={dataWithErrorGaps} series={multiSeries} xKey='timestamp'>\n          <MultiLegend />\n          <LineChartBody>\n            <LineChartGrid />\n            <LineChartXAxis tickFormatter={formatHour} minTickGap={32} />\n            <LineChartYAxis tickFormatter={formatYTick} />\n            {multiSeries.map(s => (\n              <LineChartLine key={s.key} seriesKey={s.key} />\n            ))}\n            <LineChartTooltip xTickFormatter={formatHourWithTimezone} />\n          </LineChartBody>\n        </LineChart>\n      </Chart>\n    </div>\n  );\n};",
          "storyFile": "SimpleCharts/LineChart/LineChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/LineChart",
          "description": "The three shapes that break naive charts: a sparkline with no chrome at all, a single data\npoint, and a series with null gaps, which has to break the line rather than bridge it."
        },
        {
          "name": "CustomTooltip",
          "code": "import { Chart, ChartHeader, ChartTitle, useChartTimeFormatters, LineChart, LineChartBody, LineChartGrid, LineChartHoverPopover, LineChartHoverPopoverDot, LineChartHoverPopoverRow, LineChartHoverPopoverTimestamp, LineChartLegend, LineChartLegendItem, LineChartLine, LineChartTooltip, LineChartXAxis, LineChartYAxis } from '@wallarm-org/design-system/SimpleCharts';\nimport { formatFullNumber } from '@wallarm-org/design-system/utils/abbreviateNumber';\nimport { hourlyData24, multiSeries, unitsByKey } from './lib/sampleData';\n\nexport const CustomTooltip = () => {\n  const { formatHour, formatHourWithTimezone } = useChartTimeFormatters();\n  return (\n    <div className='w-560'>\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Custom tooltip with units</ChartTitle>\n        </ChartHeader>\n        <LineChart data={hourlyData24} series={multiSeries} xKey='timestamp'>\n          <LineChartLegend>\n            {multiSeries.map(s => (\n              <LineChartLegendItem key={s.key} seriesKey={s.key}>\n                <LineChartHoverPopoverDot color={s.color} />\n                <span className='text-xs font-mono text-text-primary'>{s.label}</span>\n              </LineChartLegendItem>\n            ))}\n          </LineChartLegend>\n          <LineChartBody>\n            <LineChartGrid />\n            <LineChartXAxis tickFormatter={formatHour} minTickGap={32} />\n            <LineChartYAxis tickFormatter={formatYTick} />\n            {multiSeries.map(s => (\n              <LineChartLine key={s.key} seriesKey={s.key} />\n            ))}\n            <LineChartTooltip>\n              {({ rows, xValue }) => (\n                <LineChartHoverPopover>\n                  <LineChartHoverPopoverTimestamp>\n                    {formatHourWithTimezone(xValue)}\n                  </LineChartHoverPopoverTimestamp>\n                  {rows.map(({ series: s, value: raw }) => {\n                    const value = typeof raw === 'number' ? raw : 0;\n                    const unit = unitsByKey[s.key] ?? '';\n                    return (\n                      <LineChartHoverPopoverRow\n                        key={s.key}\n                        series={s}\n                        value={value}\n                        formatValue={v =>\n                          `${typeof v === 'number' ? formatFullNumber(v) : String(v ?? '')}${unit}`\n                        }\n                      />\n                    );\n                  })}\n                </LineChartHoverPopover>\n              )}\n            </LineChartTooltip>\n          </LineChartBody>\n        </LineChart>\n      </Chart>\n    </div>\n  );\n};",
          "storyFile": "SimpleCharts/LineChart/LineChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/LineChart",
          "description": "Composing the hover popover yourself, a `LineChartHoverPopoverRow` per series, for when a\nvalue needs its unit rather than the default name-and-number."
        },
        {
          "name": "LegendPlacements",
          "code": "import { Chart, ChartHeader, ChartTitle, useChartTimeFormatters, LineChart, LineChartBody, LineChartGrid, LineChartHoverPopoverDot, LineChartLegend, LineChartLegendItem, LineChartLine, LineChartTooltip, LineChartXAxis, LineChartYAxis } from '@wallarm-org/design-system/SimpleCharts';\nimport { HStack } from '@wallarm-org/design-system/Stack';\nimport { hourlyData24, multiSeries } from './lib/sampleData';\n\nexport const LegendPlacements = () => {\n  const { formatHour, formatHourWithTimezone } = useChartTimeFormatters();\n  return (\n    <div className='grid grid-cols-2 gap-16 w-1120'>\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Top — JSX order</ChartTitle>\n        </ChartHeader>\n        <LineChart data={hourlyData24} series={multiSeries} xKey='timestamp'>\n          <LineChartLegend>\n            {multiSeries.map(s => (\n              <LineChartLegendItem key={s.key} seriesKey={s.key}>\n                <LineChartHoverPopoverDot color={s.color} />\n                <span className='text-xs font-mono text-text-primary'>{s.label}</span>\n              </LineChartLegendItem>\n            ))}\n          </LineChartLegend>\n          <LineChartBody>\n            <LineChartGrid />\n            <LineChartXAxis tickFormatter={formatHour} minTickGap={32} />\n            <LineChartYAxis tickFormatter={formatYTick} />\n            {multiSeries.map(s => (\n              <LineChartLine key={s.key} seriesKey={s.key} />\n            ))}\n            <LineChartTooltip xTickFormatter={formatHourWithTimezone} />\n          </LineChartBody>\n        </LineChart>\n      </Chart>\n\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Bottom — JSX order</ChartTitle>\n        </ChartHeader>\n        <LineChart data={hourlyData24} series={multiSeries} xKey='timestamp'>\n          <LineChartBody>\n            <LineChartGrid />\n            <LineChartXAxis tickFormatter={formatHour} minTickGap={32} />\n            <LineChartYAxis tickFormatter={formatYTick} />\n            {multiSeries.map(s => (\n              <LineChartLine key={s.key} seriesKey={s.key} />\n            ))}\n            <LineChartTooltip xTickFormatter={formatHourWithTimezone} />\n          </LineChartBody>\n          <LineChartLegend>\n            {multiSeries.map(s => (\n              <LineChartLegendItem key={s.key} seriesKey={s.key}>\n                <LineChartHoverPopoverDot color={s.color} />\n                <span className='text-xs font-mono text-text-primary'>{s.label}</span>\n              </LineChartLegendItem>\n            ))}\n          </LineChartLegend>\n        </LineChart>\n      </Chart>\n\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Left — wrapped in HStack</ChartTitle>\n        </ChartHeader>\n        <LineChart data={hourlyData24} series={multiSeries} xKey='timestamp'>\n          <HStack flexGrow gap={12} align='stretch'>\n            <LineChartLegend orientation='vertical'>\n              {multiSeries.map(s => (\n                <LineChartLegendItem key={s.key} seriesKey={s.key}>\n                  <LineChartHoverPopoverDot color={s.color} />\n                  <span className='text-xs font-mono text-text-primary'>{s.label}</span>\n                </LineChartLegendItem>\n              ))}\n            </LineChartLegend>\n            <LineChartBody>\n              <LineChartGrid />\n              <LineChartXAxis tickFormatter={formatHour} minTickGap={32} />\n              <LineChartYAxis tickFormatter={formatYTick} />\n              {multiSeries.map(s => (\n                <LineChartLine key={s.key} seriesKey={s.key} />\n              ))}\n              <LineChartTooltip xTickFormatter={formatHourWithTimezone} />\n            </LineChartBody>\n          </HStack>\n        </LineChart>\n      </Chart>\n\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Right — wrapped in HStack</ChartTitle>\n        </ChartHeader>\n        <LineChart data={hourlyData24} series={multiSeries} xKey='timestamp'>\n          <HStack flexGrow gap={12} align='stretch'>\n            <LineChartBody>\n              <LineChartGrid />\n              <LineChartXAxis tickFormatter={formatHour} minTickGap={32} />\n              <LineChartYAxis tickFormatter={formatYTick} />\n              {multiSeries.map(s => (\n                <LineChartLine key={s.key} seriesKey={s.key} />\n              ))}\n              <LineChartTooltip xTickFormatter={formatHourWithTimezone} />\n            </LineChartBody>\n            <LineChartLegend orientation='vertical'>\n              {multiSeries.map(s => (\n                <LineChartLegendItem key={s.key} seriesKey={s.key}>\n                  <LineChartHoverPopoverDot color={s.color} />\n                  <span className='text-xs font-mono text-text-primary'>{s.label}</span>\n                </LineChartLegendItem>\n              ))}\n            </LineChartLegend>\n          </HStack>\n        </LineChart>\n      </Chart>\n    </div>\n  );\n};",
          "storyFile": "SimpleCharts/LineChart/LineChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/LineChart",
          "description": "Legend placement is structural rather than a prop: JSX order picks top or bottom, and\nwrapping the body and the legend in an `HStack` picks left or right, where a vertical\norientation stacks its rows."
        },
        {
          "name": "Filterable",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { FilterX } from '@wallarm-org/design-system/icons';\nimport { Chart, ChartActions, ChartHeader, ChartTitle, useChartTimeFormatters, LineChart, LineChartBody, LineChartGrid, LineChartHoverPopoverDot, LineChartLegend, LineChartLegendItem, LineChartLine, LineChartTooltip, LineChartXAxis, LineChartYAxis } from '@wallarm-org/design-system/SimpleCharts';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@wallarm-org/design-system/Tooltip';\nimport { hourlyData24, multiSeries } from './lib/sampleData';\n\nexport const Filterable = () => {\n  const { formatHour, formatHourWithTimezone } = useChartTimeFormatters();\n  const [hidden, setHidden] = useState<string[]>([]);\n  // First click on a fully-visible chart isolates the clicked series (hides\n  // every other one); after that, clicks toggle individual series in and out.\n  const toggle = (key: string) => {\n    setHidden(prev => {\n      if (prev.length === 0) return multiSeries.filter(s => s.key !== key).map(s => s.key);\n      if (prev.includes(key)) return prev.filter(k => k !== key);\n      return [...prev, key];\n    });\n  };\n  const filtered = hidden.length > 0;\n\n  return (\n    <div className='w-560'>\n      <Chart data-testid='chart'>\n        <ChartHeader>\n          <ChartTitle>Click a row to isolate, click another to add</ChartTitle>\n          <ChartActions alwaysVisible={filtered}>\n            {filtered && (\n              <Tooltip>\n                <TooltipTrigger asChild>\n                  <Button\n                    variant='ghost'\n                    color='neutral'\n                    size='small'\n                    aria-label='Clear filter'\n                    onClick={() => setHidden([])}\n                  >\n                    <FilterX />\n                  </Button>\n                </TooltipTrigger>\n                <TooltipContent>Remove filter</TooltipContent>\n              </Tooltip>\n            )}\n          </ChartActions>\n        </ChartHeader>\n        <LineChart\n          data-testid='line-chart'\n          data={hourlyData24}\n          series={multiSeries}\n          xKey='timestamp'\n          filteredKeys={hidden}\n        >\n          <LineChartLegend>\n            {multiSeries.map(s => (\n              <Tooltip key={s.key}>\n                <TooltipTrigger asChild>\n                  <LineChartLegendItem seriesKey={s.key} onClick={() => toggle(s.key)}>\n                    <LineChartHoverPopoverDot color={s.color} />\n                    <span className='text-xs font-mono text-text-primary'>{s.label}</span>\n                  </LineChartLegendItem>\n                </TooltipTrigger>\n                <TooltipContent>\n                  {hidden.includes(s.key) ? 'Remove filter' : 'Click to filter'}\n                </TooltipContent>\n              </Tooltip>\n            ))}\n          </LineChartLegend>\n          <LineChartBody>\n            <LineChartGrid />\n            <LineChartXAxis tickFormatter={formatHour} minTickGap={32} />\n            <LineChartYAxis tickFormatter={formatYTick} />\n            {multiSeries.map(s => (\n              <LineChartLine key={s.key} seriesKey={s.key} />\n            ))}\n            <LineChartTooltip xTickFormatter={formatHourWithTimezone} />\n          </LineChartBody>\n        </LineChart>\n      </Chart>\n    </div>\n  );\n};",
          "storyFile": "SimpleCharts/LineChart/LineChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/LineChart",
          "description": "Clicking a legend row isolates that series and clicking another adds it back, with the\nheader's clear control appearing while anything is hidden."
        },
        {
          "name": "CrossChartHoverSync",
          "code": "import { useState } from 'react';\nimport { Chart, ChartHeader, ChartTitle, useChartTimeFormatters, LineChart, LineChartBody, LineChartGrid, LineChartHoverPopoverDot, LineChartLegend, LineChartLegendItem, LineChartLine, LineChartTooltip, LineChartXAxis, LineChartYAxis } from '@wallarm-org/design-system/SimpleCharts';\nimport { hourlyDataA, hourlyDataB, multiSeries } from './lib/sampleData';\n\nexport const CrossChartHoverSync = () => {\n  const { formatHour, formatHourWithTimezone } = useChartTimeFormatters();\n  // `syncId` syncs the *cursor X* (tooltip + brush) via recharts' own redux\n  // middleware. `activeKey` + `onActiveKeyChange` sync the *series highlight*\n  // (line dimming + legend hover) via our context. The two pair cleanly —\n  // each owns the surface it controls and neither reinvents the other.\n  const [activeKey, setActiveKey] = useState<string | null>(null);\n\n  return (\n    <div className='grid grid-cols-2 gap-16 w-1120'>\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Region A</ChartTitle>\n        </ChartHeader>\n        <LineChart\n          data={hourlyDataA}\n          series={multiSeries}\n          xKey='timestamp'\n          syncId='regions'\n          activeKey={activeKey}\n          onActiveKeyChange={setActiveKey}\n        >\n          <LineChartLegend>\n            {multiSeries.map(s => (\n              <LineChartLegendItem key={s.key} seriesKey={s.key}>\n                <LineChartHoverPopoverDot color={s.color} />\n                <span className='text-xs font-mono text-text-primary'>{s.label}</span>\n              </LineChartLegendItem>\n            ))}\n          </LineChartLegend>\n          <LineChartBody>\n            <LineChartGrid />\n            <LineChartXAxis tickFormatter={formatHour} minTickGap={32} />\n            <LineChartYAxis tickFormatter={formatYTick} />\n            {multiSeries.map(s => (\n              <LineChartLine key={s.key} seriesKey={s.key} />\n            ))}\n            <LineChartTooltip xTickFormatter={formatHourWithTimezone} />\n          </LineChartBody>\n        </LineChart>\n      </Chart>\n\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Region B</ChartTitle>\n        </ChartHeader>\n        <LineChart\n          data={hourlyDataB}\n          series={multiSeries}\n          xKey='timestamp'\n          syncId='regions'\n          activeKey={activeKey}\n          onActiveKeyChange={setActiveKey}\n        >\n          <LineChartLegend>\n            {multiSeries.map(s => (\n              <LineChartLegendItem key={s.key} seriesKey={s.key}>\n                <LineChartHoverPopoverDot color={s.color} />\n                <span className='text-xs font-mono text-text-primary'>{s.label}</span>\n              </LineChartLegendItem>\n            ))}\n          </LineChartLegend>\n          <LineChartBody>\n            <LineChartGrid />\n            <LineChartXAxis tickFormatter={formatHour} minTickGap={32} />\n            <LineChartYAxis tickFormatter={formatYTick} />\n            {multiSeries.map(s => (\n              <LineChartLine key={s.key} seriesKey={s.key} />\n            ))}\n            <LineChartTooltip xTickFormatter={formatHourWithTimezone} />\n          </LineChartBody>\n        </LineChart>\n      </Chart>\n    </div>\n  );\n};",
          "storyFile": "SimpleCharts/LineChart/LineChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/LineChart",
          "description": "Two cards sharing a pointer, and it takes two mechanisms: `syncId` lines up the cursor and\ntooltip through recharts, while `activeKey` shares the series highlight through our own\ncontext."
        },
        {
          "name": "Zoom",
          "code": "export const Zoom = () => (\n  <div className='w-560'>\n    <ZoomControlledChart />\n  </div>\n);",
          "storyFile": "SimpleCharts/LineChart/LineChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/LineChart",
          "description": "Drag across the plot to choose a range, then confirm in the popover — Enter or the button\nemits `onZoomChange`, while Escape, an outside click or a new drag dismisses it. Slicing the\ndata to that range is yours, and so is the way back out."
        },
        {
          "name": "Loading",
          "code": "import { Chart, ChartHeader, ChartTitle, LineChartEmpty } from '@wallarm-org/design-system/SimpleCharts';\nimport { HStack } from '@wallarm-org/design-system/Stack';\n\nexport const Loading = () => (\n  <div className='grid grid-cols-2 gap-16 w-1120'>\n    <Chart aria-busy='true' aria-live='polite'>\n      <ChartHeader>\n        <ChartTitle>No legend</ChartTitle>\n      </ChartHeader>\n      <LineChartEmpty />\n    </Chart>\n\n    <Chart aria-busy='true' aria-live='polite'>\n      <ChartHeader>\n        <ChartTitle>Top — JSX order</ChartTitle>\n      </ChartHeader>\n      <LoadingLegend />\n      <LineChartEmpty />\n    </Chart>\n\n    <Chart aria-busy='true' aria-live='polite'>\n      <ChartHeader>\n        <ChartTitle>Bottom — JSX order</ChartTitle>\n      </ChartHeader>\n      <LineChartEmpty />\n      <LoadingLegend />\n    </Chart>\n\n    <Chart aria-busy='true' aria-live='polite'>\n      <ChartHeader>\n        <ChartTitle>Left — wrapped in HStack</ChartTitle>\n      </ChartHeader>\n      <HStack flexGrow gap={12} align='stretch'>\n        <LoadingLegend orientation='vertical' />\n        <LineChartEmpty className='flex-1 min-w-0' />\n      </HStack>\n    </Chart>\n\n    <Chart aria-busy='true' aria-live='polite'>\n      <ChartHeader>\n        <ChartTitle>Right — wrapped in HStack</ChartTitle>\n      </ChartHeader>\n      <HStack flexGrow gap={12} align='stretch'>\n        <LineChartEmpty className='flex-1 min-w-0' />\n        <LoadingLegend orientation='vertical' />\n      </HStack>\n    </Chart>\n  </div>\n);",
          "storyFile": "SimpleCharts/LineChart/LineChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/LineChart",
          "description": "There is no `loading` prop: the state is composed from the same primitives as a populated\nchart — `Skeleton` chips inside the legend and a bare `LineChartEmpty` for the dashed plot —\nwith `aria-busy` on the `Chart` left to the caller."
        },
        {
          "name": "Refreshing",
          "code": "import { HStack } from '@wallarm-org/design-system/Stack';\n\nexport const Refreshing = () => (\n  <div className='grid grid-cols-2 gap-16 w-1120'>\n    <RefreshingChart placement='none' title='No legend' />\n    <RefreshingChart placement='top' title='Top — JSX order' />\n    <RefreshingChart placement='bottom' title='Bottom — JSX order' />\n    <RefreshingChart placement='left' title='Left — wrapped in HStack' />\n    <RefreshingChart placement='right' title='Right — wrapped in HStack' />\n  </div>\n);",
          "storyFile": "SimpleCharts/LineChart/LineChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/LineChart",
          "description": "Each panel loads for two seconds before swapping to data, and the refresh button replays it.\nThe skeleton and the real chart share an outer layout, so nothing but the content moves on\nthe swap."
        },
        {
          "name": "Empty",
          "code": "import { Chart, ChartHeader, ChartTitle, LineChartEmpty } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const Empty = () => (\n  <div className='w-560'>\n    <Chart>\n      <ChartHeader>\n        <ChartTitle>No data</ChartTitle>\n      </ChartHeader>\n      <LineChartEmpty>No data</LineChartEmpty>\n    </Chart>\n  </div>\n);",
          "storyFile": "SimpleCharts/LineChart/LineChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/LineChart",
          "description": "`LineChartEmpty` keeps the dashed plot frame and puts the message inside it, so a card with\nno data still reads as a chart rather than as something broken."
        },
        {
          "name": "LongTimeRange",
          "code": "export const LongTimeRange = () => (\n  <div className='w-720'>\n    <LongTimeRangeChart />\n  </div>\n);",
          "storyFile": "SimpleCharts/LineChart/LineChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/LineChart",
          "description": "A thousand hourly samples in one card: drag to zoom and the header's control restores the\nfull range. The story slices the data itself, exactly as a consumer has to."
        },
        {
          "name": "Gallery",
          "code": "import { Metric, MetricCaption, MetricDelta, MetricHeader, MetricTotal, MetricValue } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const Gallery = () => (\n  <div className='flex flex-wrap gap-16'>\n    <Card title='Value only'>\n      <Metric data-testid='metric'>\n        <MetricHeader>\n          <MetricValue>91</MetricValue>\n        </MetricHeader>\n      </Metric>\n    </Card>\n\n    <Card title='Negative — count rose'>\n      <Metric>\n        <MetricHeader>\n          <MetricValue>91</MetricValue>\n          <MetricDelta value={10} trend='up' sentiment='negative' />\n        </MetricHeader>\n      </Metric>\n    </Card>\n\n    <Card title='Positive — count fell'>\n      <Metric>\n        <MetricHeader>\n          <MetricValue>74</MetricValue>\n          <MetricDelta value={8} trend='down' sentiment='positive' />\n        </MetricHeader>\n      </Metric>\n    </Card>\n\n    <Card title='Neutral'>\n      <Metric>\n        <MetricHeader>\n          <MetricValue>91</MetricValue>\n          <MetricDelta value={10} trend='up' />\n        </MetricHeader>\n      </Metric>\n    </Card>\n\n    <Card title='Total — slash'>\n      <Metric>\n        <MetricHeader>\n          <MetricValue>91</MetricValue>\n          <MetricTotal connector='slash'>120</MetricTotal>\n          <MetricDelta value={10} trend='up' sentiment='negative' />\n        </MetricHeader>\n      </Metric>\n    </Card>\n\n    <Card title='Total — of'>\n      <Metric>\n        <MetricHeader>\n          <MetricValue>91</MetricValue>\n          <MetricTotal connector='of'>120</MetricTotal>\n          <MetricDelta value={10} trend='up' sentiment='negative' />\n        </MetricHeader>\n      </Metric>\n    </Card>\n\n    <Card title='Total — total'>\n      <Metric>\n        <MetricHeader>\n          <MetricValue>91</MetricValue>\n          <MetricTotal connector='total'>120</MetricTotal>\n          <MetricDelta value={10} trend='up' sentiment='negative' />\n        </MetricHeader>\n      </Metric>\n    </Card>\n\n    <Card title='With caption'>\n      <Metric>\n        <MetricHeader>\n          <MetricValue>91</MetricValue>\n          <MetricDelta value={10} trend='up' sentiment='negative' />\n        </MetricHeader>\n        <MetricCaption>blocked today</MetricCaption>\n      </Metric>\n    </Card>\n\n    <Card title='Everything'>\n      <Metric>\n        <MetricHeader>\n          <MetricValue>91</MetricValue>\n          <MetricTotal connector='of'>120</MetricTotal>\n          <MetricDelta value={10} trend='up' sentiment='negative' />\n        </MetricHeader>\n        <MetricCaption>blocked today</MetricCaption>\n      </Metric>\n    </Card>\n  </div>\n);",
          "storyFile": "SimpleCharts/Metric/Metric.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/Metric",
          "description": "Every brick combination on its own card, mirroring the Figma options board: value alone,\nvalue with a delta in each sentiment, and the three `MetricTotal` connectors: a slash, the\nword \"of\", and the word \"total\" after the number."
        },
        {
          "name": "Loading",
          "code": "import { MetricSkeleton } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const Loading = () => (\n  <Card title='Findings'>\n    <MetricSkeleton data-testid='metric-skeleton' />\n  </Card>\n);",
          "storyFile": "SimpleCharts/Metric/Metric.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/Metric",
          "description": "`MetricSkeleton` in place of the stat while the card loads, so the number arriving does not\nresize the card."
        },
        {
          "name": "Sparkline",
          "code": "import { Chart, ChartHeader, ChartTitle, Metric, MetricCaption, MetricDelta, MetricHeader, MetricSparkline, MetricValue } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const Sparkline = () => (\n  <div className='w-400'>\n    <Chart>\n      <ChartHeader>\n        <ChartTitle>Attacks</ChartTitle>\n      </ChartHeader>\n      <Metric>\n        <MetricHeader>\n          <MetricValue>91</MetricValue>\n          <MetricDelta value={10} trend='up' sentiment='positive' />\n        </MetricHeader>\n        <MetricCaption>last 9 days</MetricCaption>\n      </Metric>\n      <MetricSparkline data-testid='sparkline' data={attacks} label='Attacks' />\n    </Chart>\n  </div>\n);",
          "storyFile": "SimpleCharts/Metric/Metric.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/Metric",
          "description": "`MetricSparkline` after `Metric` draws the trend over the period, edge to edge along the\ncard's bottom. Hover it for a ruler on the nearest point and a popover with its date and value."
        },
        {
          "name": "SparklineColors",
          "code": "import { Chart, ChartHeader, ChartTitle, Metric, MetricCaption, MetricDelta, MetricHeader, MetricSparkline, MetricValue } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const SparklineColors = () => (\n  <div className='flex flex-wrap gap-16'>\n    <div className='w-256'>\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Negative</ChartTitle>\n        </ChartHeader>\n        <Metric>\n          <MetricHeader>\n            <MetricValue>74</MetricValue>\n            <MetricDelta value={5} trend='down' sentiment='negative' />\n          </MetricHeader>\n          <MetricCaption>last 9 days</MetricCaption>\n        </Metric>\n        <MetricSparkline data={attacks} color='negative' label='Attacks' />\n      </Chart>\n    </div>\n    <div className='w-256'>\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Positive</ChartTitle>\n        </ChartHeader>\n        <Metric>\n          <MetricHeader>\n            <MetricValue>91</MetricValue>\n            <MetricDelta value={10} trend='up' sentiment='positive' />\n          </MetricHeader>\n          <MetricCaption>last 9 days</MetricCaption>\n        </Metric>\n        <MetricSparkline data={attacks} color='positive' label='Attacks' />\n      </Chart>\n    </div>\n    <div className='w-256'>\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Brand</ChartTitle>\n        </ChartHeader>\n        <Metric>\n          <MetricHeader>\n            <MetricValue>91</MetricValue>\n            <MetricDelta value={10} trend='up' sentiment='positive' />\n          </MetricHeader>\n          <MetricCaption>last 9 days</MetricCaption>\n        </Metric>\n        <MetricSparkline data={attacks} label='Attacks' />\n      </Chart>\n    </div>\n    <div className='w-256'>\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Neutral</ChartTitle>\n        </ChartHeader>\n        <Metric>\n          <MetricHeader>\n            <MetricValue>91</MetricValue>\n            <MetricDelta value={10} trend='up' sentiment='positive' />\n          </MetricHeader>\n          <MetricCaption>last 9 days</MetricCaption>\n        </Metric>\n        <MetricSparkline data={attacks} color='neutral' label='Attacks' />\n      </Chart>\n    </div>\n  </div>\n);",
          "storyFile": "SimpleCharts/Metric/Metric.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/Metric",
          "description": "The sparkline's `color` is set per chart, on purpose apart from the delta's `sentiment`:\n`brand` (default), `positive`, `negative`, and `neutral`."
        },
        {
          "name": "Default",
          "code": "export const Default = () => (\n  <div className='flex flex-col gap-16 w-832'>\n    <div className='grid grid-cols-2 gap-16'>\n      <BarChartCard />\n      <PieChartCard />\n    </div>\n    <LineChartCard />\n    <div className='grid grid-cols-2 gap-16'>\n      <HorizontalBarStackCard />\n      <MetricCard />\n    </div>\n  </div>\n);",
          "storyFile": "SimpleCharts/Overview/Overview.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/Overview",
          "description": "One card per chart, at its default: a `BarList` top-five, a `PieChart` share-of-total, a\n`LineChart` over time, a `HorizontalBarStack` composition and a bare `Metric`."
        },
        {
          "name": "Default",
          "code": "import { useMemo, useState } from 'react';\nimport { Badge } from '@wallarm-org/design-system/Badge';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { FilterX, Settings } from '@wallarm-org/design-system/icons';\nimport { Chart, ChartActions, ChartHeader, ChartTitle, LegendDot, PieChart, PieChartCenter, PieChartCenterLabel, PieChartCenterValue, PieChartDonut, PieChartLegend, PieChartLegendItem, PieChartLegendPercent, PieChartLegendValue } from '@wallarm-org/design-system/SimpleCharts';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@wallarm-org/design-system/Tooltip';\n\nexport const Default = () => {\n  const [filtered, setFiltered] = useState<string | null>(null);\n  const visibleRows = useMemo(\n    () => (filtered ? baseRows.filter(r => r.name === filtered) : baseRows),\n    [filtered],\n  );\n  const total = baseRows.reduce((sum, r) => sum + r.value, 0);\n  const visibleTotal = visibleRows.reduce((sum, r) => sum + r.value, 0);\n\n  return (\n    <div className='w-400'>\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Top 5 Endpoints</ChartTitle>\n          <ChartActions alwaysVisible={filtered !== null}>\n            {filtered !== null && (\n              <Tooltip>\n                <TooltipTrigger asChild>\n                  <Button\n                    variant='ghost'\n                    color='neutral'\n                    size='small'\n                    aria-label='Clear filter'\n                    onClick={() => setFiltered(null)}\n                  >\n                    <FilterX />\n                  </Button>\n                </TooltipTrigger>\n                <TooltipContent>Remove filter</TooltipContent>\n              </Tooltip>\n            )}\n            <Tooltip>\n              <TooltipTrigger asChild>\n                <Button variant='ghost' color='neutral' size='small' aria-label='Settings'>\n                  <Settings />\n                </Button>\n              </TooltipTrigger>\n              <TooltipContent>Change data source</TooltipContent>\n            </Tooltip>\n          </ChartActions>\n        </ChartHeader>\n        <PieChart data-testid='pie-chart' data={visibleRows} total={visibleTotal}>\n          <PieChartDonut>\n            <PieChartCenter>\n              <PieChartCenterValue formatHoveredValue={d => formatValue(d.value)}>\n                {formatValue(filtered ? visibleTotal : total)}\n              </PieChartCenterValue>\n              <PieChartCenterLabel\n                className='whitespace-nowrap'\n                pluralize={{ one: 'request', other: 'requests' }}\n              />\n            </PieChartCenter>\n          </PieChartDonut>\n          <PieChartLegend>\n            {visibleRows.map(row => (\n              <Tooltip key={row.name}>\n                <TooltipTrigger asChild>\n                  <PieChartLegendItem\n                    name={row.name}\n                    selected={filtered === row.name}\n                    onClick={() => setFiltered(filtered === row.name ? null : row.name)}\n                  >\n                    <Badge color={row.badgeColor} type='secondary' textVariant='code'>\n                      {row.name}\n                    </Badge>\n                    <PieChartLegendValue>\n                      {formatValue(row.value)}\n                      <LegendDot />\n                      <PieChartLegendPercent />\n                    </PieChartLegendValue>\n                  </PieChartLegendItem>\n                </TooltipTrigger>\n                <TooltipContent>\n                  {filtered === row.name ? 'Click to remove filter' : 'Click to filter'}\n                </TooltipContent>\n              </Tooltip>\n            ))}\n          </PieChartLegend>\n        </PieChart>\n      </Chart>\n    </div>\n  );\n};",
          "storyFile": "SimpleCharts/PieChart/PieChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/PieChart",
          "description": "The interactive shape: click a legend row to filter to that slice, with the header's clear\ncontrol appearing while the filter holds."
        },
        {
          "name": "Selectable",
          "code": "import { useMemo, useState } from 'react';\nimport { Badge } from '@wallarm-org/design-system/Badge';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { FilterX } from '@wallarm-org/design-system/icons';\nimport { Chart, ChartActions, ChartHeader, ChartTitle, LegendDot, PieChart, PieChartCenter, PieChartCenterLabel, PieChartCenterValue, PieChartDonut, PieChartLegend, PieChartLegendItem, PieChartLegendPercent, PieChartLegendValue } from '@wallarm-org/design-system/SimpleCharts';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@wallarm-org/design-system/Tooltip';\n\nexport const Selectable = () => {\n  const [selected, setSelected] = useState<Set<string>>(() => new Set(['4XX']));\n  const total = baseRows.reduce((sum, r) => sum + r.value, 0);\n  const selectedNames = useMemo(() => Array.from(selected), [selected]);\n\n  const toggle = (name: string) => {\n    setSelected(prev => {\n      const next = new Set(prev);\n      if (next.has(name)) next.delete(name);\n      else next.add(name);\n      return next;\n    });\n  };\n\n  return (\n    <div className='w-400'>\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Top 5 Endpoints</ChartTitle>\n          <ChartActions alwaysVisible={selected.size > 0}>\n            {selected.size > 0 && (\n              <Tooltip>\n                <TooltipTrigger asChild>\n                  <Button\n                    variant='ghost'\n                    color='neutral'\n                    size='small'\n                    aria-label='Clear selection'\n                    onClick={() => setSelected(new Set())}\n                  >\n                    <FilterX />\n                  </Button>\n                </TooltipTrigger>\n                <TooltipContent>Clear selection</TooltipContent>\n              </Tooltip>\n            )}\n          </ChartActions>\n        </ChartHeader>\n        <PieChart\n          data-testid='pie-chart'\n          data={baseRows}\n          total={total}\n          selectedNames={selectedNames}\n        >\n          <PieChartDonut>\n            <PieChartCenter>\n              <PieChartCenterValue>{formatValue(total)}</PieChartCenterValue>\n              <PieChartCenterLabel className='whitespace-nowrap'>requests</PieChartCenterLabel>\n            </PieChartCenter>\n          </PieChartDonut>\n          <PieChartLegend>\n            {baseRows.map(row => (\n              <Tooltip key={row.name}>\n                <TooltipTrigger asChild>\n                  <PieChartLegendItem name={row.name} onClick={() => toggle(row.name)}>\n                    <Badge color={row.badgeColor} type='secondary' textVariant='code'>\n                      {row.name}\n                    </Badge>\n                    <PieChartLegendValue>\n                      {formatValue(row.value)}\n                      <LegendDot />\n                      <PieChartLegendPercent />\n                    </PieChartLegendValue>\n                  </PieChartLegendItem>\n                </TooltipTrigger>\n                <TooltipContent>\n                  {selected.has(row.name) ? 'Click to deselect' : 'Click to select'}\n                </TooltipContent>\n              </Tooltip>\n            ))}\n          </PieChartLegend>\n        </PieChart>\n      </Chart>\n    </div>\n  );\n};",
          "storyFile": "SimpleCharts/PieChart/PieChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/PieChart",
          "description": "Selection kept in state rather than by filtering the data — the chosen row stays lit and the\nother slices fade, so the whole remains visible while one part is emphasised."
        },
        {
          "name": "TruncatedLabels",
          "code": "import { Chart, ChartHeader, ChartTitle, LegendDot, PieChart, PieChartCenter, PieChartCenterLabel, PieChartCenterValue, PieChartDonut, PieChartLegend, PieChartLegendItem, PieChartLegendPercent, PieChartLegendValue } from '@wallarm-org/design-system/SimpleCharts';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@wallarm-org/design-system/Tooltip';\n\nexport const TruncatedLabels = () => {\n  const total = longLabelRows.reduce((sum, r) => sum + r.value, 0);\n\n  return (\n    <div className='w-400'>\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Top 5 Endpoints</ChartTitle>\n        </ChartHeader>\n        <PieChart data={longLabelRows} total={total}>\n          <PieChartDonut>\n            <PieChartCenter>\n              <PieChartCenterValue>{formatValue(total)}</PieChartCenterValue>\n              <PieChartCenterLabel className='whitespace-nowrap'>requests</PieChartCenterLabel>\n            </PieChartCenter>\n          </PieChartDonut>\n          <PieChartLegend>\n            {longLabelRows.map(row => (\n              <PieChartLegendItem key={row.name} name={row.name}>\n                <Tooltip>\n                  <TooltipTrigger asChild>\n                    <span className='min-w-0 flex-1 truncate text-xs font-mono text-text-primary pointer-events-auto'>\n                      {row.name}\n                    </span>\n                  </TooltipTrigger>\n                  <TooltipContent>{row.name}</TooltipContent>\n                </Tooltip>\n                <PieChartLegendValue>\n                  {formatValue(row.value)}\n                  <LegendDot />\n                  <PieChartLegendPercent />\n                </PieChartLegendValue>\n              </PieChartLegendItem>\n            ))}\n          </PieChartLegend>\n        </PieChart>\n      </Chart>\n    </div>\n  );\n};",
          "storyFile": "SimpleCharts/PieChart/PieChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/PieChart",
          "description": "Legend labels truncate at the row width, since the legend takes whatever horizontal space\nthe donut leaves."
        },
        {
          "name": "TruncatedLabelsWithTooltip",
          "code": "import { OverflowTooltip, OverflowTooltipContent, OverflowTooltipTrigger } from '@wallarm-org/design-system/OverflowTooltip';\nimport { Chart, ChartHeader, ChartTitle, LegendDot, PieChart, PieChartCenter, PieChartCenterLabel, PieChartCenterValue, PieChartDonut, PieChartLegend, PieChartLegendItem, PieChartLegendPercent, PieChartLegendValue } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const TruncatedLabelsWithTooltip = () => {\n  const total = longLabelRows.reduce((sum, r) => sum + r.value, 0);\n\n  return (\n    <div className='w-400'>\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Top 5 Endpoints</ChartTitle>\n        </ChartHeader>\n        <PieChart data={longLabelRows} total={total}>\n          <PieChartDonut>\n            <PieChartCenter>\n              <PieChartCenterValue>{formatValue(total)}</PieChartCenterValue>\n              <PieChartCenterLabel className='whitespace-nowrap'>requests</PieChartCenterLabel>\n            </PieChartCenter>\n          </PieChartDonut>\n          <PieChartLegend>\n            {longLabelRows.map(row => (\n              <PieChartLegendItem key={row.name} name={row.name}>\n                <OverflowTooltip>\n                  <OverflowTooltipTrigger>\n                    <span className='min-w-0 flex-1 truncate text-xs font-mono text-text-primary pointer-events-auto'>\n                      {row.name}\n                    </span>\n                  </OverflowTooltipTrigger>\n                  <OverflowTooltipContent>{row.name}</OverflowTooltipContent>\n                </OverflowTooltip>\n                <PieChartLegendValue>\n                  {formatValue(row.value)}\n                  <LegendDot />\n                  <PieChartLegendPercent />\n                </PieChartLegendValue>\n              </PieChartLegendItem>\n            ))}\n          </PieChartLegend>\n        </PieChart>\n      </Chart>\n    </div>\n  );\n};",
          "storyFile": "SimpleCharts/PieChart/PieChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/PieChart",
          "description": "The same rows under `OverflowTooltip`, which reveals the full label only when it is actually\ncut off."
        },
        {
          "name": "Loading",
          "code": "import { Chart, ChartHeader, ChartTitle, PieChartSkeleton } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const Loading = () => (\n  <div className='w-400'>\n    <Chart>\n      <ChartHeader>\n        <ChartTitle>Top 5 Endpoints</ChartTitle>\n      </ChartHeader>\n      <PieChartSkeleton data-testid='pie-chart-skeleton' rows={5} />\n    </Chart>\n  </div>\n);",
          "storyFile": "SimpleCharts/PieChart/PieChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/PieChart",
          "description": "`PieChartSkeleton` takes a row count so the placeholder legend is as long as the real one,\nand the card does not resize when data lands."
        },
        {
          "name": "SingleSlice",
          "code": "import { Badge } from '@wallarm-org/design-system/Badge';\nimport { Chart, ChartHeader, ChartTitle, LegendDot, PieChart, PieChartCenter, PieChartCenterLabel, PieChartCenterValue, PieChartDonut, PieChartLegend, PieChartLegendItem, PieChartLegendPercent, PieChartLegendValue } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const SingleSlice = () => {\n  const data: Row[] = [{ name: '5XX', value: 23, color: 'red', badgeColor: 'red' }];\n  return (\n    <div className='w-400'>\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Top 5 Endpoints</ChartTitle>\n        </ChartHeader>\n        <PieChart data-testid='pie-chart' data={data}>\n          <PieChartDonut>\n            <PieChartCenter>\n              <PieChartCenterValue>23</PieChartCenterValue>\n              <PieChartCenterLabel className='whitespace-nowrap'>requests</PieChartCenterLabel>\n            </PieChartCenter>\n          </PieChartDonut>\n          <PieChartLegend>\n            {data.map(row => (\n              <PieChartLegendItem key={row.name} name={row.name} selected>\n                <Badge color={row.badgeColor} type='secondary' textVariant='code'>\n                  {row.name}\n                </Badge>\n                <PieChartLegendValue>\n                  {formatValue(row.value)}\n                  <LegendDot />\n                  <PieChartLegendPercent />\n                </PieChartLegendValue>\n              </PieChartLegendItem>\n            ))}\n          </PieChartLegend>\n        </PieChart>\n      </Chart>\n    </div>\n  );\n};",
          "storyFile": "SimpleCharts/PieChart/PieChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/PieChart",
          "description": "One slice is a full ring at 100% — legible, but ask whether a `Metric` says it better, since\nthere is no share left to compare against."
        },
        {
          "name": "TwoSlices",
          "code": "import { Badge } from '@wallarm-org/design-system/Badge';\nimport { Chart, ChartHeader, ChartTitle, PieChart, PieChartCenter, PieChartCenterLabel, PieChartCenterValue, PieChartDonut, PieChartLegend, PieChartLegendItem, PieChartLegendValue } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const TwoSlices = () => {\n  const data: Row[] = [\n    { name: 'Success', value: 78, color: 'green', badgeColor: 'green' },\n    { name: 'Errors', value: 22, color: 'red', badgeColor: 'red' },\n  ];\n  return (\n    <div className='w-400'>\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Response status — values only</ChartTitle>\n        </ChartHeader>\n        <PieChart data-testid='pie-chart' data={data} total={100}>\n          <PieChartDonut>\n            <PieChartCenter>\n              <PieChartCenterValue>100</PieChartCenterValue>\n              <PieChartCenterLabel className='whitespace-nowrap'>requests</PieChartCenterLabel>\n            </PieChartCenter>\n          </PieChartDonut>\n          <PieChartLegend>\n            {data.map(row => (\n              <PieChartLegendItem key={row.name} name={row.name}>\n                <Badge color={row.badgeColor} type='secondary' textVariant='code'>\n                  {row.name}\n                </Badge>\n                <PieChartLegendValue>{formatValue(row.value)}</PieChartLegendValue>\n              </PieChartLegendItem>\n            ))}\n          </PieChartLegend>\n        </PieChart>\n      </Chart>\n    </div>\n  );\n};",
          "storyFile": "SimpleCharts/PieChart/PieChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/PieChart",
          "description": "Two slices is where a donut earns its place: the split is readable at a glance without\nreading either number."
        },
        {
          "name": "CustomColors",
          "code": "import { Badge } from '@wallarm-org/design-system/Badge';\nimport { Chart, ChartHeader, ChartTitle, LegendDot, PieChart, PieChartCenter, PieChartCenterLabel, PieChartCenterValue, type PieChartDatum, PieChartDonut, PieChartLegend, PieChartLegendItem, PieChartLegendPercent, PieChartLegendValue } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const CustomColors = () => {\n  const data: PieChartDatum[] = customRows.map(r => ({\n    name: r.name,\n    value: r.value,\n    className: r.fillClass,\n  }));\n  const total = customRows.reduce((sum, r) => sum + r.value, 0);\n\n  return (\n    <div className='w-400'>\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Top 5 Endpoints (custom palette)</ChartTitle>\n        </ChartHeader>\n        <PieChart data={data} total={total}>\n          <PieChartDonut>\n            <PieChartCenter>\n              <PieChartCenterValue>{formatValue(total)}</PieChartCenterValue>\n              <PieChartCenterLabel className='whitespace-nowrap'>requests</PieChartCenterLabel>\n            </PieChartCenter>\n          </PieChartDonut>\n          <PieChartLegend>\n            {customRows.map(row => (\n              <PieChartLegendItem key={row.name} name={row.name}>\n                <Badge color={row.badgeColor} type='secondary' textVariant='code'>\n                  {row.name}\n                </Badge>\n                <PieChartLegendValue>\n                  {formatValue(row.value)}\n                  <LegendDot />\n                  <PieChartLegendPercent />\n                </PieChartLegendValue>\n              </PieChartLegendItem>\n            ))}\n          </PieChartLegend>\n        </PieChart>\n      </Chart>\n    </div>\n  );\n};",
          "storyFile": "SimpleCharts/PieChart/PieChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/PieChart",
          "description": "Colours passed per datum rather than taken from the palette, for a breakdown whose\ncategories already have colours elsewhere in the product."
        },
        {
          "name": "ZeroTotal",
          "code": "import { Badge } from '@wallarm-org/design-system/Badge';\nimport { Chart, ChartHeader, ChartTitle, LegendDot, PieChart, PieChartCenter, PieChartCenterLabel, PieChartCenterValue, PieChartDonut, PieChartLegend, PieChartLegendItem, PieChartLegendPercent, PieChartLegendValue } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const ZeroTotal = () => {\n  const data: Row[] = baseRows.map(r => ({ ...r, value: 0 }));\n  return (\n    <div className='w-400'>\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Top 5 Endpoints (no traffic)</ChartTitle>\n        </ChartHeader>\n        <PieChart data-testid='pie-chart' data={data}>\n          <PieChartDonut>\n            <PieChartCenter>\n              <PieChartCenterValue>0</PieChartCenterValue>\n              <PieChartCenterLabel className='whitespace-nowrap'>requests</PieChartCenterLabel>\n            </PieChartCenter>\n          </PieChartDonut>\n          <PieChartLegend>\n            {data.map(row => (\n              <PieChartLegendItem key={row.name} name={row.name}>\n                <Badge color={row.badgeColor} type='secondary' textVariant='code'>\n                  {row.name}\n                </Badge>\n                <PieChartLegendValue>\n                  {formatValue(row.value)}\n                  <LegendDot />\n                  <PieChartLegendPercent />\n                </PieChartLegendValue>\n              </PieChartLegendItem>\n            ))}\n          </PieChartLegend>\n        </PieChart>\n      </Chart>\n    </div>\n  );\n};",
          "storyFile": "SimpleCharts/PieChart/PieChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/PieChart",
          "description": "Every value zero: the ring renders empty and the percents read 0% rather than the chart\ndividing by nothing or disappearing."
        },
        {
          "name": "WidthVariants",
          "code": "import { useState } from 'react';\nimport { Badge } from '@wallarm-org/design-system/Badge';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuItemIcon, DropdownMenuLabel, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { Check, Settings } from '@wallarm-org/design-system/icons';\nimport { Chart, ChartActions, ChartHeader, ChartTitle, LegendDot, PieChart, PieChartCenter, PieChartCenterLabel, PieChartCenterValue, PieChartDonut, PieChartLegend, PieChartLegendItem, PieChartLegendPercent, PieChartLegendValue } from '@wallarm-org/design-system/SimpleCharts';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@wallarm-org/design-system/Tooltip';\nimport { cn } from '@wallarm-org/design-system/utils/cn';\n\nexport const WidthVariants = () => {\n  const [key, setKey] = useState<WidthKey>('wide');\n  const [menuOpen, setMenuOpen] = useState(false);\n  const current = widthOptions[key];\n  const total = baseRows.reduce((sum, r) => sum + r.value, 0);\n\n  return (\n    <div className={current.className}>\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>{current.title}</ChartTitle>\n          <ChartActions alwaysVisible={menuOpen}>\n            <Tooltip disabled={menuOpen}>\n              <TooltipTrigger asChild>\n                <span className='inline-flex'>\n                  <DropdownMenu onOpenChange={setMenuOpen}>\n                    <DropdownMenuTrigger asChild>\n                      <Button variant='ghost' color='neutral' size='small' aria-label='Settings'>\n                        <Settings />\n                      </Button>\n                    </DropdownMenuTrigger>\n                    <DropdownMenuContent>\n                      <DropdownMenuLabel>Container width</DropdownMenuLabel>\n                      <DropdownMenuGroup>\n                        {(Object.keys(widthOptions) as WidthKey[]).map(k => (\n                          <DropdownMenuItem key={k} onSelect={() => setKey(k)}>\n                            <span className='flex-1'>{widthOptions[k].title}</span>\n                            <DropdownMenuItemIcon>\n                              <Check className={cn(key !== k && 'opacity-0')} />\n                            </DropdownMenuItemIcon>\n                          </DropdownMenuItem>\n                        ))}\n                      </DropdownMenuGroup>\n                    </DropdownMenuContent>\n                  </DropdownMenu>\n                </span>\n              </TooltipTrigger>\n              <TooltipContent>Change container width</TooltipContent>\n            </Tooltip>\n          </ChartActions>\n        </ChartHeader>\n        <PieChart data={baseRows} total={total}>\n          <PieChartDonut>\n            <PieChartCenter>\n              <PieChartCenterValue>{formatValue(total)}</PieChartCenterValue>\n              <PieChartCenterLabel className='whitespace-nowrap'>requests</PieChartCenterLabel>\n            </PieChartCenter>\n          </PieChartDonut>\n          <PieChartLegend>\n            {baseRows.map(row => (\n              <PieChartLegendItem key={row.name} name={row.name}>\n                <Badge color={row.badgeColor} type='secondary' textVariant='code'>\n                  {row.name}\n                </Badge>\n                <PieChartLegendValue>\n                  {formatValue(row.value)}\n                  <LegendDot />\n                  <PieChartLegendPercent />\n                </PieChartLegendValue>\n              </PieChartLegendItem>\n            ))}\n          </PieChartLegend>\n        </PieChart>\n      </Chart>\n    </div>\n  );\n};",
          "storyFile": "SimpleCharts/PieChart/PieChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/PieChart",
          "description": "The same chart at 280, 400 and 560px. The donut holds its size and the legend takes the\nrest, which is what sets the practical minimum width."
        },
        {
          "name": "PercentVariants",
          "code": "import { Badge } from '@wallarm-org/design-system/Badge';\nimport { Chart, ChartHeader, ChartTitle, LegendDot, PieChart, PieChartCenter, PieChartCenterLabel, PieChartCenterValue, PieChartDonut, PieChartLegend, PieChartLegendItem, PieChartLegendPercent, PieChartLegendValue } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const PercentVariants = () => {\n  const total = baseRows.reduce((sum, r) => sum + r.value, 0);\n\n  const renderChart = (variant: 'split' | 'muted' | 'inherit', title: string) => (\n    <Chart>\n      <ChartHeader>\n        <ChartTitle>{title}</ChartTitle>\n      </ChartHeader>\n      <PieChart data={baseRows} total={total}>\n        <PieChartDonut>\n          <PieChartCenter>\n            <PieChartCenterValue>{formatValue(total)}</PieChartCenterValue>\n            <PieChartCenterLabel className='whitespace-nowrap'>requests</PieChartCenterLabel>\n          </PieChartCenter>\n        </PieChartDonut>\n        <PieChartLegend>\n          {baseRows.map(row => (\n            <PieChartLegendItem key={row.name} name={row.name}>\n              <Badge color={row.badgeColor} type='secondary' textVariant='code'>\n                {row.name}\n              </Badge>\n              <PieChartLegendValue>\n                {formatValue(row.value)}\n                <LegendDot />\n                <PieChartLegendPercent variant={variant} />\n              </PieChartLegendValue>\n            </PieChartLegendItem>\n          ))}\n        </PieChartLegend>\n      </PieChart>\n    </Chart>\n  );\n\n  return (\n    <div className='flex flex-col gap-16 w-400'>\n      {renderChart('split', 'Split — value primary, % secondary (default)')}\n      {renderChart('muted', 'Muted — both tokens secondary')}\n      {renderChart('inherit', 'Inherit — follows PieChartLegendValue color')}\n    </div>\n  );\n};",
          "storyFile": "SimpleCharts/PieChart/PieChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/PieChart",
          "description": "The three percent treatments, matching `BarList` — `split` colours number and symbol\ndifferently, `muted` sets both back, `inherit` leaves them to the row."
        },
        {
          "name": "Palette",
          "code": "import { Chart, ChartHeader, ChartTitle, PieChart, PieChartCenter, PieChartCenterLabel, PieChartCenterValue, type PieChartDatum, PieChartDonut, PieChartLegend, PieChartLegendItem, PieChartLegendPercent, PieChartLegendValue } from '@wallarm-org/design-system/SimpleCharts';\n\nexport const Palette = () => {\n  const data: PieChartDatum[] = PALETTE.slice(0, 6).map((color, i) => ({\n    name: color,\n    value: 10 + i,\n    color,\n  }));\n  const total = data.reduce((sum, r) => sum + r.value, 0);\n\n  return (\n    <div className='w-400'>\n      <Chart>\n        <ChartHeader>\n          <ChartTitle>Built-in palette — percents only</ChartTitle>\n        </ChartHeader>\n        <PieChart data={data} total={total}>\n          <PieChartDonut>\n            <PieChartCenter>\n              <PieChartCenterValue>{formatValue(total)}</PieChartCenterValue>\n              <PieChartCenterLabel>total</PieChartCenterLabel>\n            </PieChartCenter>\n          </PieChartDonut>\n          <PieChartLegend>\n            {data.map(row => (\n              <PieChartLegendItem key={row.name} name={row.name}>\n                <span className='inline-flex items-center gap-6 text-xs font-mono text-text-primary capitalize'>\n                  <span\n                    aria-hidden\n                    className='inline-block size-8 rounded-2'\n                    style={{\n                      backgroundColor: `var(--color-${row.color === 'slate' ? 'badge-slate-dark-alt' : row.color === 'brand' ? 'w-orange-500' : `${row.color}-500`})`,\n                    }}\n                  />\n                  {row.name}\n                </span>\n                <PieChartLegendValue>\n                  <PieChartLegendPercent />\n                </PieChartLegendValue>\n              </PieChartLegendItem>\n            ))}\n          </PieChartLegend>\n        </PieChart>\n      </Chart>\n    </div>\n  );\n};",
          "storyFile": "SimpleCharts/PieChart/PieChart.stories.tsx",
          "storyTitle": "Data Display/SimpleCharts/PieChart",
          "description": "The six chart colours around one ring, for checking adjacent slices stay tellable apart at\nsmall sizes."
        }
      ]
    },
    {
      "name": "Skeleton",
      "description": "A content-shaped placeholder for a region whose layout you know but whose data has not landed — it shortens the perceived wait and stops the page jumping when the content arrives. Reach for it on the first or full load of a page, list, card or table; a single inline wait is a `Loader`, a measurable one is `Progress`, and a wait under a second wants nothing at all. Never put a skeleton and a spinner in the same region. The root is `aria-hidden`, so the loading announcement has to come from a live region of your own.",
      "importPath": "@wallarm-org/design-system/Skeleton",
      "props": [
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "transparent",
          "type": "{ true: string; false: string; }",
          "required": false,
          "defaultValue": "true"
        },
        {
          "name": "rounded",
          "type": "{ none: string; full: string; 2: string; 4: string; 6: string; 8: string; 10: string; 12: string; 16: string; 24: string; 32: string; }",
          "required": false,
          "defaultValue": "6"
        },
        {
          "name": "withDimensions",
          "type": "{ true: string; }",
          "required": false
        },
        {
          "name": "withChildren",
          "type": "{ true: string; }",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "loading",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "true"
        },
        {
          "name": "width",
          "type": "SkeletonDimension",
          "required": false
        },
        {
          "name": "height",
          "type": "SkeletonDimension",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "transparent",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "true"
        },
        {
          "name": "rounded",
          "options": [
            "none",
            "full",
            "2",
            "4",
            "6",
            "8",
            "10",
            "12",
            "16",
            "24",
            "32"
          ]
        },
        {
          "name": "withDimensions",
          "options": [
            "true"
          ]
        },
        {
          "name": "withChildren",
          "options": [
            "true"
          ]
        }
      ],
      "subComponents": [],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Skeleton } from '@wallarm-org/design-system/Skeleton';\n\nexport const Basic = () => <Skeleton width='200px' height='20px' />;",
          "storyFile": "Skeleton/Skeleton.stories.tsx",
          "storyTitle": "Loading/Skeleton",
          "description": "One sized box. `width` and `height` take any CSS length, and `rounded` should match the shape of whatever is coming."
        },
        {
          "name": "Shapes",
          "code": "import { Badge } from '@wallarm-org/design-system/Badge';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Heading } from '@wallarm-org/design-system/Heading';\nimport { CircleDashed, Globe } from '@wallarm-org/design-system/icons';\nimport { SegmentedTabs, SegmentedTabsList, SegmentedTabsTrigger } from '@wallarm-org/design-system/SegmentedTabs';\nimport { Skeleton } from '@wallarm-org/design-system/Skeleton';\nimport { HStack } from '@wallarm-org/design-system/Stack';\nimport { Tag, TagClose } from '@wallarm-org/design-system/Tag';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const Shapes = () => (\n  <HStack gap={24} align='start'>\n    <div className='flex flex-col items-end gap-24 w-[400px]'>\n      {/* Title */}\n      <Skeleton width='256px' height='40px' />\n\n      {/* Text */}\n      <Skeleton width='256px' height='24px' />\n\n      {/* Tags row */}\n      <HStack gap={4}>\n        <Skeleton width='48px' height='20px' />\n        <Skeleton width='48px' height='20px' />\n        <Skeleton width='48px' height='20px' />\n        <Skeleton width='48px' height='20px' />\n      </HStack>\n\n      {/* Icon Button */}\n      <Skeleton width='36px' height='36px' />\n\n      {/* Circle + text + badge */}\n      <HStack align='center' gap={4}>\n        <Skeleton width='20px' height='24px' rounded='full' />\n        <Skeleton width='88px' height='24px' />\n        <Skeleton width='32px' height='24px' />\n      </HStack>\n\n      {/* Button */}\n      <Skeleton width='100px' height='36px' rounded={8} />\n\n      {/* Segmented tabs */}\n      <Skeleton width='284px' height='36px' rounded={12} />\n    </div>\n\n    <div className='flex flex-col gap-24 w-[400px]'>\n      {/* Title */}\n      <Heading size='4xl'>Advanced API Security</Heading>\n\n      {/* Text */}\n      <Text size='md'>Advanced API Security</Text>\n\n      {/* Tags row */}\n      <div className='flex flex-row gap-4'>\n        <Tag>\n          Tag\n          <TagClose />\n        </Tag>\n        <Tag>\n          Tag\n          <TagClose />\n        </Tag>\n        <Tag>\n          Tag\n          <TagClose />\n        </Tag>\n        <Badge>+5</Badge>\n      </div>\n\n      {/* Icon Button */}\n      <Button variant='outline' color='neutral' size='large'>\n        <CircleDashed />\n      </Button>\n\n      {/* Circle + text + badge */}\n      <div className='flex flex-row items-center gap-4'>\n        <Globe className='size-[20px] text-text-secondary' />\n        <Text size='md'>34.74.73.20</Text>\n        <Badge>AWS</Badge>\n      </div>\n\n      {/* Button */}\n      <div className='flex w-100'>\n        <Button variant='primary' color='brand' size='large'>\n          <CircleDashed />\n          Button\n        </Button>\n      </div>\n\n      {/* Segmented tabs */}\n      <div className='flex w-284'>\n        <SegmentedTabs defaultValue='item1'>\n          <SegmentedTabsList>\n            <SegmentedTabsTrigger value='item1'>Item</SegmentedTabsTrigger>\n            <SegmentedTabsTrigger value='item2'>Item</SegmentedTabsTrigger>\n            <SegmentedTabsTrigger value='item3'>Item</SegmentedTabsTrigger>\n            <SegmentedTabsTrigger value='item4'>Item</SegmentedTabsTrigger>\n            <SegmentedTabsTrigger value='item5'>Item</SegmentedTabsTrigger>\n          </SegmentedTabsList>\n        </SegmentedTabs>\n      </div>\n    </div>\n  </HStack>\n);",
          "storyFile": "Skeleton/Skeleton.stories.tsx",
          "storyTitle": "Loading/Skeleton",
          "description": "Standalone boxes built to match the real components beside them. The point of the comparison is the measurements: a placeholder that is not the content’s size is what makes the page jump on swap-in."
        },
        {
          "name": "Wrap",
          "code": "import { Badge } from '@wallarm-org/design-system/Badge';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Heading } from '@wallarm-org/design-system/Heading';\nimport { CircleDashed, Globe } from '@wallarm-org/design-system/icons';\nimport { SegmentedTabs, SegmentedTabsList, SegmentedTabsTrigger } from '@wallarm-org/design-system/SegmentedTabs';\nimport { Skeleton } from '@wallarm-org/design-system/Skeleton';\nimport { HStack } from '@wallarm-org/design-system/Stack';\nimport { Tag, TagClose } from '@wallarm-org/design-system/Tag';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const Wrap = () => (\n  <HStack gap={24} align='start'>\n    <div className='flex flex-col items-end gap-24 w-[400px]'>\n      {/* Title */}\n      <Skeleton>\n        <Heading size='4xl'>Advanced API Security</Heading>\n      </Skeleton>\n\n      {/* Text */}\n      <Skeleton>\n        <Text size='md'>Advanced API Security</Text>\n      </Skeleton>\n\n      {/* Tags row */}\n      <HStack gap={4}>\n        <Skeleton>\n          <Tag>\n            Tag\n            <TagClose />\n          </Tag>\n        </Skeleton>\n        <Skeleton>\n          <Tag>\n            Tag\n            <TagClose />\n          </Tag>\n        </Skeleton>\n        <Skeleton>\n          <Tag>\n            Tag\n            <TagClose />\n          </Tag>\n        </Skeleton>\n        <Skeleton>\n          <Badge>+5</Badge>\n        </Skeleton>\n      </HStack>\n\n      {/* Icon Button */}\n      <Skeleton rounded={8}>\n        <Button variant='outline' color='neutral' size='large'>\n          <CircleDashed />\n        </Button>\n      </Skeleton>\n\n      {/* Circle + text + badge */}\n      <HStack align='center' gap={4}>\n        <Skeleton rounded='full'>\n          <Globe className='size-[20px] text-text-secondary' />\n        </Skeleton>\n        <Skeleton>\n          <Text size='md'>34.74.73.20</Text>\n        </Skeleton>\n        <Skeleton>\n          <Badge>AWS</Badge>\n        </Skeleton>\n      </HStack>\n\n      {/* Button */}\n      <Skeleton rounded={8}>\n        <Button variant='primary' color='brand' size='large'>\n          <CircleDashed />\n          Button\n        </Button>\n      </Skeleton>\n\n      {/* Segmented tabs */}\n      <Skeleton rounded={12}>\n        <SegmentedTabs defaultValue='item1'>\n          <SegmentedTabsList>\n            <SegmentedTabsTrigger value='item1'>Item</SegmentedTabsTrigger>\n            <SegmentedTabsTrigger value='item2'>Item</SegmentedTabsTrigger>\n            <SegmentedTabsTrigger value='item3'>Item</SegmentedTabsTrigger>\n            <SegmentedTabsTrigger value='item4'>Item</SegmentedTabsTrigger>\n            <SegmentedTabsTrigger value='item5'>Item</SegmentedTabsTrigger>\n          </SegmentedTabsList>\n        </SegmentedTabs>\n      </Skeleton>\n    </div>\n\n    <div className='flex flex-col gap-24 w-[400px]'>\n      {/* Title */}\n      <Heading size='4xl'>Advanced API Security</Heading>\n\n      {/* Text */}\n      <Text size='md'>Advanced API Security</Text>\n\n      {/* Tags row */}\n      <div className='flex flex-row gap-4'>\n        <Tag>\n          Tag\n          <TagClose />\n        </Tag>\n        <Tag>\n          Tag\n          <TagClose />\n        </Tag>\n        <Tag>\n          Tag\n          <TagClose />\n        </Tag>\n        <Badge>+5</Badge>\n      </div>\n\n      {/* Icon Button */}\n      <Button variant='outline' color='neutral' size='large'>\n        <CircleDashed />\n      </Button>\n\n      {/* Circle + text + badge */}\n      <div className='flex flex-row items-center gap-4'>\n        <Globe className='size-[20px] text-text-secondary' />\n        <Text size='md'>34.74.73.20</Text>\n        <Badge>AWS</Badge>\n      </div>\n\n      {/* Button */}\n      <div className='flex w-100'>\n        <Button variant='primary' color='brand' size='large'>\n          <CircleDashed />\n          Button\n        </Button>\n      </div>\n\n      {/* Segmented tabs */}\n      <div className='flex w-284'>\n        <SegmentedTabs defaultValue='item1'>\n          <SegmentedTabsList>\n            <SegmentedTabsTrigger value='item1'>Item</SegmentedTabsTrigger>\n            <SegmentedTabsTrigger value='item2'>Item</SegmentedTabsTrigger>\n            <SegmentedTabsTrigger value='item3'>Item</SegmentedTabsTrigger>\n            <SegmentedTabsTrigger value='item4'>Item</SegmentedTabsTrigger>\n            <SegmentedTabsTrigger value='item5'>Item</SegmentedTabsTrigger>\n          </SegmentedTabsList>\n        </SegmentedTabs>\n      </div>\n    </div>\n  </HStack>\n);",
          "storyFile": "Skeleton/Skeleton.stories.tsx",
          "storyTitle": "Loading/Skeleton",
          "description": "The cleaner way — wrap the real content and toggle `loading`. The skeleton takes the content’s exact box, so there is nothing to keep in sync by hand."
        },
        {
          "name": "Transparent",
          "code": "import { Skeleton } from '@wallarm-org/design-system/Skeleton';\n\nexport const Transparent = () => (\n  <div className='flex flex-col gap-8 p-8 rounded-8 bg-orange-100'>\n    <div className='flex items-center justify-end gap-24'>\n      <Skeleton width='200px' height='20px' />\n    </div>\n    <div className='flex items-center justify-end gap-24'>\n      <Skeleton width='200px' height='20px' transparent={false} />\n    </div>\n  </div>\n);",
          "storyFile": "Skeleton/Skeleton.stories.tsx",
          "storyTitle": "Loading/Skeleton",
          "description": "`transparent`, the default, animates over invisible content so the surface behind shows through; `transparent={false}` fills the box with `surface-1`."
        }
      ]
    },
    {
      "name": "Slider",
      "description": "Sets an approximate, bounded value by dragging along a track — reach for `NumberInput` when the exact figure matters, since a slider is faster to move than it is to land. A slider should always show its value: pair it with `SliderInput` for entry, or `SliderValue` for a readout. It implies a continuum, so a few fixed choices belong in `SegmentedControl`, `Radio` or `Select`, and on/off in `Switch`.",
      "importPath": "@wallarm-org/design-system/Slider",
      "props": [
        {
          "name": "error",
          "type": "boolean | undefined",
          "required": false,
          "description": "Error state → maps to Ark `invalid` (repaints the handle; the message is the Field's job).",
          "defaultValue": "false"
        },
        {
          "name": "onValueChange",
          "type": "((value: number[]) => void) | undefined",
          "required": false,
          "description": "Fires live during drag with the current value array (`[n]` single, `[low, high]` range)."
        },
        {
          "name": "onValueChangeEnd",
          "type": "((value: number[]) => void) | undefined",
          "required": false,
          "description": "Fires once on drag release with the committed value array."
        },
        {
          "name": "form",
          "type": "string | undefined",
          "required": false,
          "description": "The associate form of the underlying input element."
        },
        {
          "name": "defaultValue",
          "type": "number[] | undefined",
          "required": false,
          "description": "The initial value of the slider when rendered.\nUse when you don't need to control the value of the slider.",
          "defaultValue": "[50]"
        },
        {
          "name": "disabled",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the slider is disabled"
        },
        {
          "name": "name",
          "type": "string | undefined",
          "required": false,
          "description": "The name associated with each slider thumb (when used in a form)"
        },
        {
          "name": "value",
          "type": "number[] | undefined",
          "required": false,
          "description": "The controlled value of the slider"
        },
        {
          "name": "readOnly",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the slider is read-only"
        },
        {
          "name": "step",
          "type": "number | undefined",
          "required": false,
          "description": "The step value of the slider"
        },
        {
          "name": "max",
          "type": "number | undefined",
          "required": false,
          "description": "The maximum value of the slider"
        },
        {
          "name": "min",
          "type": "number | undefined",
          "required": false,
          "description": "The minimum value of the slider"
        },
        {
          "name": "getAriaValueText",
          "type": "((details: ValueTextDetails) => string) | undefined",
          "required": false,
          "description": "Function that returns a human readable value for the slider thumb"
        },
        {
          "name": "minStepsBetweenThumbs",
          "type": "number | undefined",
          "required": false,
          "description": "The minimum permitted steps between multiple thumbs.\n\n`minStepsBetweenThumbs` * `step` should reflect the gap between the thumbs.\n\n- `step: 1` and `minStepsBetweenThumbs: 10` => gap is `10`\n- `step: 10` and `minStepsBetweenThumbs: 2` => gap is `20`"
        },
        {
          "name": "thumbCollisionBehavior",
          "type": "\"none\" | \"push\" | \"swap\" | undefined",
          "required": false,
          "description": "Controls how thumbs behave when they collide during pointer interactions.\n- `none` (default): Thumbs cannot move past each other; excess movement is ignored.\n- `push`: Thumbs push each other without restoring their previous positions when dragged back.\n- `swap`: Thumbs swap places when dragged past each other."
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [
        {
          "name": "SliderControl",
          "props": []
        },
        {
          "name": "SliderInput",
          "props": [
            {
              "name": "index",
              "type": "number | undefined",
              "required": false,
              "description": "Which thumb this box is bound to (0 = single/low, 1 = high).",
              "defaultValue": "0"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "pattern",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, HTMLInputElement> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "HTMLInputTypeAttribute | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "alt",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "height",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "src",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "width",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "autoComplete",
              "type": "HTMLInputAutoCompleteAttribute | undefined",
              "required": false
            },
            {
              "name": "maxLength",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "minLength",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "placeholder",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "readOnly",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "required",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "checked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "step",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "accept",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "max",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "min",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "multiple",
              "type": "boolean | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "SliderMarks",
          "props": [
            {
              "name": "marks",
              "type": "SliderMark[]",
              "required": true,
              "description": "Each entry places a tick at `value`; an optional `label` renders below it (and\ndrives `aria-valuetext` for ordinal scales). Align `step` to the marks so drag\nand arrow-keys snap onto them."
            }
          ]
        },
        {
          "name": "SliderThumb",
          "props": [
            {
              "name": "index",
              "type": "number | undefined",
              "required": false,
              "description": "Which thumb this is (0 = single/low, 1 = high).",
              "defaultValue": "0"
            },
            {
              "name": "tooltip",
              "type": "boolean | undefined",
              "required": false,
              "description": "Show an on-drag value bubble above this thumb (DS Tooltip, opened by drag).",
              "defaultValue": "false"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "SliderValue",
          "props": [
            {
              "name": "index",
              "type": "number | undefined",
              "required": false,
              "description": "Show one thumb's value (range). Omit to show all (single → \"50\", range → \"20 – 80\")."
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Slider, SliderControl, SliderThumb } from '@wallarm-org/design-system/Slider';\n\nexport const Basic = () => (\n  <Slider>\n    <SliderControl>\n      <SliderThumb aria-label='Value' />\n    </SliderControl>\n  </Slider>\n);",
          "storyFile": "Slider/Slider.stories.tsx",
          "storyTitle": "Inputs/Slider",
          "description": "One handle on a track: arrow keys move by `step`, Page keys jump further, and Home and End go\nto the bounds. `SliderThumb` is the real interactive node, so `aria-label` and analytics\nattributes go on it, and its focus reuses the hover emphasis instead of drawing a ring."
        },
        {
          "name": "Range",
          "code": "import { Slider, SliderControl, SliderThumb } from '@wallarm-org/design-system/Slider';\n\nexport const Range = () => (\n  <Slider defaultValue={[20, 80]}>\n    <SliderControl>\n      <SliderThumb index={0} />\n      <SliderThumb index={1} />\n    </SliderControl>\n  </Slider>\n);",
          "storyFile": "Slider/Slider.stories.tsx",
          "storyTitle": "Inputs/Slider",
          "description": "Two entries in the value make two thumbs; render one `SliderThumb` per entry. The thumbs\ncannot cross, so the pair always reads as a valid range."
        },
        {
          "name": "Ticks",
          "code": "import { Slider, SliderControl, SliderMarks, SliderThumb } from '@wallarm-org/design-system/Slider';\n\nexport const Ticks = () => (\n  <Slider step={25} defaultValue={[50]}>\n    <SliderControl>\n      <SliderThumb aria-label='Volume' />\n      <SliderMarks\n        marks={[\n          { value: 0, label: '0' },\n          { value: 25, label: '25' },\n          { value: 50, label: '50' },\n          { value: 75, label: '75' },\n          { value: 100, label: '100' },\n        ]}\n      />\n    </SliderControl>\n  </Slider>\n);",
          "storyFile": "Slider/Slider.stories.tsx",
          "storyTitle": "Inputs/Slider",
          "description": "`SliderMarks` draws ticks along the scale. Keep `step` aligned to the marks, or the handle\nlands between them and the ticks stop meaning anything."
        },
        {
          "name": "TicksWithoutSnapping",
          "code": "import { Slider, SliderControl, SliderMarks, SliderThumb } from '@wallarm-org/design-system/Slider';\n\nexport const TicksWithoutSnapping = () => (\n  <Slider step={1} defaultValue={[40]}>\n    <SliderControl>\n      <SliderThumb aria-label='Volume' />\n      <SliderMarks\n        marks={[\n          { value: 0, label: '0' },\n          { value: 25, label: '25' },\n          { value: 50, label: '50' },\n          { value: 75, label: '75' },\n          { value: 100, label: '100' },\n        ]}\n      />\n    </SliderControl>\n  </Slider>\n);",
          "storyFile": "Slider/Slider.stories.tsx",
          "storyTitle": "Inputs/Slider",
          "description": "The same marks used purely for orientation, with `step` finer than their spacing. Choose this\nwhen the marks are a guide rather than the only valid answers."
        },
        {
          "name": "Labeled",
          "code": "import { Slider, SliderControl, SliderMarks, SliderThumb } from '@wallarm-org/design-system/Slider';\n\nexport const Labeled = () => (\n  <Slider min={0} max={100} step={50} defaultValue={[50]}>\n    <SliderControl>\n      <SliderThumb aria-label='Risk level' />\n      <SliderMarks\n        marks={[\n          { value: 0, label: 'Low' },\n          { value: 50, label: 'Medium' },\n          { value: 100, label: 'High' },\n        ]}\n      />\n    </SliderControl>\n  </Slider>\n);",
          "storyFile": "Slider/Slider.stories.tsx",
          "storyTitle": "Inputs/Slider",
          "description": "Marks carrying text, for a scale whose steps are named rather than numeric. The handle snaps\nto the labelled positions and announces the label rather than the number, so keep it to a\nhandful of rungs."
        },
        {
          "name": "WithTooltip",
          "code": "import { Slider, SliderControl, SliderThumb } from '@wallarm-org/design-system/Slider';\n\nexport const WithTooltip = () => (\n  <Slider>\n    <SliderControl>\n      <SliderThumb aria-label='Value' tooltip />\n    </SliderControl>\n  </Slider>\n);",
          "storyFile": "Slider/Slider.stories.tsx",
          "storyTitle": "Inputs/Slider",
          "description": "`tooltip` on a `SliderThumb` shows the value while dragging, then hides it. It suits a value\nonly checked mid-gesture; anything needed afterwards wants a persistent readout instead,\nnever both."
        },
        {
          "name": "WithInput",
          "code": "import { Slider, SliderControl, SliderInput, SliderThumb } from '@wallarm-org/design-system/Slider';\n\nexport const WithInput = () => (\n  <Slider data-testid='slider-with-input'>\n    <SliderControl>\n      <SliderThumb aria-label='Value' />\n    </SliderControl>\n    <SliderInput />\n  </Slider>\n);",
          "storyFile": "Slider/Slider.stories.tsx",
          "storyTitle": "Inputs/Slider",
          "description": "`SliderInput` is the precision escape hatch: the track for approximate moves, the field for\nan exact figure. Typing commits on blur or Enter rather than live, so clamping never fights a\nhalf-typed number."
        },
        {
          "name": "RangeWithInput",
          "code": "import { Slider, SliderControl, SliderInput, SliderThumb } from '@wallarm-org/design-system/Slider';\n\nexport const RangeWithInput = () => (\n  <Slider defaultValue={[20, 80]} data-testid='slider-range-with-input'>\n    <SliderInput index={0} />\n    <SliderControl>\n      <SliderThumb index={0} />\n      <SliderThumb index={1} />\n    </SliderControl>\n    <SliderInput index={1} />\n  </Slider>\n);",
          "storyFile": "Slider/Slider.stories.tsx",
          "storyTitle": "Inputs/Slider",
          "description": "A field at each end, low on the left and high on the right. Neither crosses the other, so the\nfields cannot produce a range the track could not."
        },
        {
          "name": "Disabled",
          "code": "import { Slider, SliderControl, SliderThumb } from '@wallarm-org/design-system/Slider';\n\nexport const Disabled = () => (\n  <Slider disabled>\n    <SliderControl>\n      <SliderThumb aria-label='Value' />\n    </SliderControl>\n  </Slider>\n);",
          "storyFile": "Slider/Slider.stories.tsx",
          "storyTitle": "Inputs/Slider",
          "description": "The whole control dims and stops responding, handle included. The value stays legible,\nbecause a locked setting is usually one the reader still needs to read."
        },
        {
          "name": "InField",
          "code": "import { Field, FieldDescription, FieldLabel } from '@wallarm-org/design-system/Field';\nimport { Slider, SliderControl, SliderThumb } from '@wallarm-org/design-system/Slider';\n\nexport const InField = () => (\n  <Field>\n    <FieldLabel>Risk threshold</FieldLabel>\n    <Slider>\n      <SliderControl>\n        <SliderThumb />\n      </SliderControl>\n    </Slider>\n    <FieldDescription>Approximate — fine-tune the exact value later.</FieldDescription>\n  </Field>\n);",
          "storyFile": "Slider/Slider.stories.tsx",
          "storyTitle": "Inputs/Slider",
          "description": "Wrapped in `Field`, which is the form-field shape. The slider reads that context, so the\nlabel and error attach without being passed anything."
        },
        {
          "name": "FieldWithError",
          "code": "import { Field, FieldError, FieldLabel } from '@wallarm-org/design-system/Field';\nimport { Slider, SliderControl, SliderThumb } from '@wallarm-org/design-system/Slider';\n\nexport const FieldWithError = () => (\n  <Field invalid>\n    <FieldLabel>Risk threshold</FieldLabel>\n    <Slider>\n      <SliderControl>\n        <SliderThumb />\n      </SliderControl>\n    </Slider>\n    <FieldError>Enter a value between 0 and 100.</FieldError>\n  </Field>\n);",
          "storyFile": "Slider/Slider.stories.tsx",
          "storyTitle": "Inputs/Slider",
          "description": "`invalid` on the `Field` cascades to the handle. The message is `FieldError`'s job, and it\nmatters here because a slider cannot show a wrong value the way a text field can."
        },
        {
          "name": "FieldWithValue",
          "code": "import { useState } from 'react';\nimport { Field, FieldLabel } from '@wallarm-org/design-system/Field';\nimport { Slider, SliderControl, SliderThumb } from '@wallarm-org/design-system/Slider';\n\nexport const FieldWithValue = () => {\n  const [value, setValue] = useState([40]);\n  return (\n    <Field>\n      <div className='flex w-full items-center justify-between'>\n        <FieldLabel>Risk threshold</FieldLabel>\n        <span className='text-sm font-medium text-text-primary tabular-nums'>{value[0]}</span>\n      </div>\n      <Slider value={value} onValueChange={setValue}>\n        <SliderControl>\n          <SliderThumb />\n        </SliderControl>\n      </Slider>\n    </Field>\n  );\n};",
          "storyFile": "Slider/Slider.stories.tsx",
          "storyTitle": "Inputs/Slider",
          "description": "The value beside the label, which is the readout Figma draws for a slider in a form — value\nbeside label is the drawn default, not one option among several."
        },
        {
          "name": "RangeFieldWithValue",
          "code": "import { useState } from 'react';\nimport { Field, FieldLabel } from '@wallarm-org/design-system/Field';\nimport { Slider, SliderControl, SliderThumb } from '@wallarm-org/design-system/Slider';\n\nexport const RangeFieldWithValue = () => {\n  const [value, setValue] = useState([20, 80]);\n  return (\n    <Field>\n      <div className='flex w-full items-center justify-between'>\n        <FieldLabel>Risk range</FieldLabel>\n        <span className='text-sm font-medium text-text-primary tabular-nums'>\n          {value.join(', ')}\n        </span>\n      </div>\n      <Slider value={value} onValueChange={setValue}>\n        <SliderControl>\n          <SliderThumb index={0} />\n          <SliderThumb index={1} />\n        </SliderControl>\n      </Slider>\n    </Field>\n  );\n};",
          "storyFile": "Slider/Slider.stories.tsx",
          "storyTitle": "Inputs/Slider",
          "description": "Both ends beside the label, comma-separated. For a range this is the only way to read the\nvalue without hovering each thumb."
        },
        {
          "name": "WithValueReadout",
          "code": "import { Slider, SliderControl, SliderThumb, SliderValue } from '@wallarm-org/design-system/Slider';\n\nexport const WithValueReadout = () => (\n  <Slider defaultValue={[60]}>\n    <SliderControl>\n      <SliderThumb aria-label='Volume' />\n    </SliderControl>\n    <SliderValue className='w-32 shrink-0 text-right font-medium' />\n  </Slider>\n);",
          "storyFile": "Slider/Slider.stories.tsx",
          "storyTitle": "Inputs/Slider",
          "description": "`SliderValue` reads the slider's own context, so a live readout needs no controlled state of\nits own."
        }
      ]
    },
    {
      "name": "SplashScreen",
      "description": "The full-screen entrance for a cold start — the brand `Logo` over an indeterminate bar, shown once while the app boots. Never on a route change and never as a general loading veil: in-app waits belong to `Loader`, `Skeleton` or `Progress`, and `AppShell` ships its own first-load reveal, so run one or the other rather than both. You drive `visible` and nothing else — the phases between are internal — and since it enforces no minimum on-screen time, guarding against a flash on a fast boot is the caller’s job.",
      "importPath": "@wallarm-org/design-system/SplashScreen",
      "props": [
        {
          "name": "visible",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "true"
        },
        {
          "name": "shrinkTarget",
          "type": "SplashScreenShrinkTarget | undefined",
          "required": false
        },
        {
          "name": "onPhaseChange",
          "type": "((phase: PhaseType) => void) | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "phase",
          "options": [
            "enter-start",
            "entered",
            "content-fading",
            "shrinking",
            "settled",
            "exiting"
          ]
        }
      ],
      "subComponents": [],
      "examples": [
        {
          "name": "Basic",
          "code": "import { SplashScreen } from '@wallarm-org/design-system/SplashScreen';\n\nexport const Basic = () => <SplashScreen />;",
          "storyFile": "SplashScreen/SplashScreen.stories.tsx",
          "storyTitle": "Loading/SplashScreen",
          "description": "The splash as it looks while the app boots. `visible` defaults to `true`, so this is the state you mount it in."
        },
        {
          "name": "Toggle",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { SplashScreen } from '@wallarm-org/design-system/SplashScreen';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Toggle = () => {\n  const [visible, setVisible] = useState(true);\n\n  return (\n    <VStack align='center'>\n      <div className='flex h-400 w-400 items-center justify-center'>\n        <SplashScreen visible={visible} />\n      </div>\n\n      <Button type='button' onClick={() => setVisible(v => !v)}>\n        {visible ? 'Hide' : 'Show'}\n      </Button>\n    </VStack>\n  );\n};",
          "storyFile": "SplashScreen/SplashScreen.stories.tsx",
          "storyTitle": "Loading/SplashScreen",
          "description": "Flipping `visible` to false is the whole handover: with no `shrinkTarget` the splash fades out and unmounts, and any children are never shown."
        },
        {
          "name": "ShrinkToCard",
          "code": "import { useEffect, useState } from 'react';\nimport { AnimatedBackground } from '@wallarm-org/design-system/AnimatedBackground';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { SplashScreen } from '@wallarm-org/design-system/SplashScreen';\n\nexport const ShrinkToCard = () => {\n  const [visible, setVisible] = useState(true);\n\n  useEffect(() => {\n    if (!visible) return;\n\n    const timer = window.setTimeout(() => {\n      setVisible(false);\n    }, 2000);\n\n    return () => window.clearTimeout(timer);\n  }, [visible]);\n\n  return (\n    <div className='relative h-screen w-screen'>\n      <AnimatedBackground />\n\n      <div className='absolute inset-0 flex items-center justify-center'>\n        <SplashScreen\n          visible={visible}\n          shrinkTarget={{ width: 480, height: 600, borderRadius: 12 }}\n          className='bg-bg-page-bg shadow-lg'\n        >\n          <div className='flex h-full flex-col items-center justify-center gap-4 p-8'>\n            <h2 className='text-lg font-semibold text-text-primary'>Welcome</h2>\n            <p className='text-center text-sm text-text-secondary'>\n              Content revealed after splash animation.\n            </p>\n            <Button type='button' onClick={() => setVisible(true)}>\n              Replay\n            </Button>\n          </div>\n        </SplashScreen>\n      </div>\n    </div>\n  );\n};",
          "storyFile": "SplashScreen/SplashScreen.stories.tsx",
          "storyTitle": "Loading/SplashScreen",
          "description": "With a `shrinkTarget` it morphs into that box and reveals its children inside — the entrance becomes the first view, typically a sign-in card."
        },
        {
          "name": "MeasuredHeight",
          "code": "import { useEffect, useState } from 'react';\nimport { AnimatedBackground } from '@wallarm-org/design-system/AnimatedBackground';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Input } from '@wallarm-org/design-system/Input';\nimport { SplashScreen } from '@wallarm-org/design-system/SplashScreen';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const MeasuredHeight = () => {\n  const [visible, setVisible] = useState(true);\n\n  useEffect(() => {\n    if (!visible) return;\n\n    const timer = window.setTimeout(() => {\n      setVisible(false);\n    }, 2000);\n\n    return () => window.clearTimeout(timer);\n  }, [visible]);\n\n  const handleSignIn = () => {\n    setVisible(true);\n  };\n\n  return (\n    <div className='relative h-screen w-screen'>\n      <AnimatedBackground />\n\n      <div className='absolute inset-0 flex items-center justify-center'>\n        <SplashScreen\n          visible={visible}\n          shrinkTarget={{ width: 480, borderRadius: 12 }}\n          className='bg-bg-page-bg shadow-lg'\n        >\n          <div className='flex h-full w-full flex-col items-center justify-center gap-16 p-24'>\n            <Text size='xl'>Sign In</Text>\n            <div className='flex w-full flex-col gap-12'>\n              <Input placeholder='Email' />\n              <Input placeholder='Password' type='password' />\n            </div>\n            <Button variant='primary' color='brand' className='w-full' onClick={handleSignIn}>\n              Sign In\n            </Button>\n          </div>\n        </SplashScreen>\n      </div>\n    </div>\n  );\n};",
          "storyFile": "SplashScreen/SplashScreen.stories.tsx",
          "storyTitle": "Loading/SplashScreen",
          "description": "The splash can measure its own content height when `shrinkTarget.height` is omitted — the animation shrinks to fit whatever you put inside, no hardcoded constant needed."
        }
      ]
    },
    {
      "name": "SplitButton",
      "description": "Pairs one action with a menu of related ones, for when a second action matters enough that burying it in a `DropdownMenu` would hide it. Both halves are ordinary `Button`s, so they must share a variant, colour and size — the group only joins their facing corners.",
      "importPath": "@wallarm-org/design-system/SplitButton",
      "props": [
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [],
      "examples": [
        {
          "name": "Default",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { ChevronDown } from '@wallarm-org/design-system/icons';\nimport { SplitButton } from '@wallarm-org/design-system/SplitButton';\n\nexport const Default = () => (\n  <SplitButton data-testid='split-button'>\n    <Button variant='primary' color='brand'>\n      Button\n    </Button>\n    <Button variant='primary' color='brand'>\n      <ChevronDown />\n    </Button>\n  </SplitButton>\n);",
          "storyFile": "SplitButton/SplitButton.stories.tsx",
          "storyTitle": "Actions/SplitButton",
          "description": "The two halves are plain `Button` children. `SplitButton` strips their facing corners and\ngives the pair a `role='group'` so it reads as one control."
        },
        {
          "name": "Variants",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { ChevronDown } from '@wallarm-org/design-system/icons';\nimport { SplitButton } from '@wallarm-org/design-system/SplitButton';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Variants = () => (\n  <VStack>\n    <HStack>\n      <SplitButton>\n        <Button variant='primary' color='brand'>\n          Button\n        </Button>\n        <Button variant='primary' color='brand'>\n          <ChevronDown />\n        </Button>\n      </SplitButton>\n    </HStack>\n    <HStack>\n      <SplitButton>\n        <Button variant='outline' color='neutral'>\n          Button\n        </Button>\n        <Button variant='outline' color='neutral'>\n          <ChevronDown />\n        </Button>\n      </SplitButton>\n    </HStack>\n    <HStack>\n      <SplitButton>\n        <Button variant='secondary' color='neutral'>\n          Button\n        </Button>\n        <Button variant='secondary' color='neutral'>\n          <ChevronDown />\n        </Button>\n      </SplitButton>\n    </HStack>\n    <HStack>\n      <SplitButton>\n        <Button variant='ghost' color='neutral'>\n          Button\n        </Button>\n        <Button variant='ghost' color='neutral'>\n          <ChevronDown />\n        </Button>\n      </SplitButton>\n    </HStack>\n    <HStack>\n      <SplitButton>\n        <Button variant='secondary' color='brand'>\n          Button\n        </Button>\n        <Button variant='secondary' color='brand'>\n          <ChevronDown />\n        </Button>\n      </SplitButton>\n    </HStack>\n    <HStack>\n      <SplitButton>\n        <Button variant='ghost' color='brand'>\n          Button\n        </Button>\n        <Button variant='ghost' color='brand'>\n          <ChevronDown />\n        </Button>\n      </SplitButton>\n    </HStack>\n    <div className='flex flex-col gap-16 rounded-lg bg-component-tooltip-bg p-8'>\n      <HStack>\n        <SplitButton>\n          <Button variant='ghost' color='neutral-alt'>\n            Button\n          </Button>\n          <Button variant='ghost' color='neutral-alt'>\n            <ChevronDown />\n          </Button>\n        </SplitButton>\n      </HStack>\n    </div>\n    <div className='flex flex-col gap-16 rounded-lg bg-component-tooltip-bg p-8'>\n      <HStack>\n        <SplitButton>\n          <Button variant='secondary' color='neutral-alt'>\n            Button\n          </Button>\n          <Button variant='secondary' color='neutral-alt'>\n            <ChevronDown />\n          </Button>\n        </SplitButton>\n      </HStack>\n    </div>\n  </VStack>\n);",
          "storyFile": "SplitButton/SplitButton.stories.tsx",
          "storyTitle": "Actions/SplitButton",
          "description": "Every sanctioned pairing, and the reason the pair must match: outline buttons drop the\ngap and overlap their borders into a single hairline, which only looks right when both halves\ncarry the same variant."
        },
        {
          "name": "Sizes",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { ChevronDown } from '@wallarm-org/design-system/icons';\nimport { SplitButton } from '@wallarm-org/design-system/SplitButton';\nimport { HStack } from '@wallarm-org/design-system/Stack';\n\nexport const Sizes = () => (\n  <HStack align='end' justify='center'>\n    <SplitButton>\n      <Button variant='primary' color='brand' size='small'>\n        Small\n      </Button>\n      <Button variant='primary' color='brand' size='small'>\n        <ChevronDown />\n      </Button>\n    </SplitButton>\n    <SplitButton>\n      <Button variant='primary' color='brand' size='medium'>\n        Medium\n      </Button>\n      <Button variant='primary' color='brand' size='medium'>\n        <ChevronDown />\n      </Button>\n    </SplitButton>\n    <SplitButton>\n      <Button variant='primary' color='brand' size='large'>\n        Large\n      </Button>\n      <Button variant='primary' color='brand' size='large'>\n        <ChevronDown />\n      </Button>\n    </SplitButton>\n  </HStack>\n);",
          "storyFile": "SplitButton/SplitButton.stories.tsx",
          "storyTitle": "Actions/SplitButton",
          "description": "Both halves take the same `size`, since the group aligns them rather than sizing them."
        },
        {
          "name": "Content",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { ChevronDown, CircleDashed } from '@wallarm-org/design-system/icons';\nimport { NumericBadge } from '@wallarm-org/design-system/NumericBadge';\nimport { SplitButton } from '@wallarm-org/design-system/SplitButton';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Content = () => (\n  <VStack>\n    <HStack align='end'>\n      <SplitButton>\n        <Button variant='primary' color='brand' size='large'>\n          Large\n        </Button>\n        <Button variant='primary' color='brand' size='large'>\n          <ChevronDown />\n        </Button>\n      </SplitButton>\n      <SplitButton>\n        <Button variant='outline' color='neutral' size='large'>\n          Large\n        </Button>\n        <Button variant='outline' color='neutral' size='large'>\n          <ChevronDown />\n        </Button>\n      </SplitButton>\n      <SplitButton>\n        <Button variant='secondary' color='neutral' size='large'>\n          Large\n        </Button>\n        <Button variant='secondary' color='neutral' size='large'>\n          <ChevronDown />\n        </Button>\n      </SplitButton>\n    </HStack>\n    <HStack align='end'>\n      <SplitButton>\n        <Button variant='primary' color='brand' size='large'>\n          <CircleDashed />\n          Large\n        </Button>\n        <Button variant='primary' color='brand' size='large'>\n          <ChevronDown />\n        </Button>\n      </SplitButton>\n      <SplitButton>\n        <Button variant='outline' color='neutral' size='large'>\n          <CircleDashed />\n          Large\n        </Button>\n        <Button variant='outline' color='neutral' size='large'>\n          <ChevronDown />\n        </Button>\n      </SplitButton>\n      <SplitButton>\n        <Button variant='secondary' color='neutral' size='large'>\n          <CircleDashed />\n          Large\n        </Button>\n        <Button variant='secondary' color='neutral' size='large'>\n          <ChevronDown />\n        </Button>\n      </SplitButton>\n    </HStack>\n    <HStack align='end'>\n      <SplitButton>\n        <Button variant='primary' color='brand' size='large'>\n          <CircleDashed />\n          Large\n          <NumericBadge type='outline'>1</NumericBadge>\n        </Button>\n        <Button variant='primary' color='brand' size='large'>\n          <ChevronDown />\n        </Button>\n      </SplitButton>\n      <SplitButton>\n        <Button variant='outline' color='neutral' size='large'>\n          <CircleDashed />\n          Large\n          <NumericBadge type='outline'>1</NumericBadge>\n        </Button>\n        <Button variant='outline' color='neutral' size='large'>\n          <ChevronDown />\n        </Button>\n      </SplitButton>\n      <SplitButton>\n        <Button variant='secondary' color='neutral' size='large'>\n          <CircleDashed />\n          Large\n          <NumericBadge type='outline'>1</NumericBadge>\n        </Button>\n        <Button variant='secondary' color='neutral' size='large'>\n          <ChevronDown />\n        </Button>\n      </SplitButton>\n    </HStack>\n    <HStack align='end'>\n      <SplitButton>\n        <Button variant='primary' color='brand' size='large'>\n          <CircleDashed />\n        </Button>\n        <Button variant='primary' color='brand' size='large'>\n          <ChevronDown />\n        </Button>\n      </SplitButton>\n      <SplitButton>\n        <Button variant='outline' color='neutral' size='large'>\n          <CircleDashed />\n        </Button>\n        <Button variant='outline' color='neutral' size='large'>\n          <ChevronDown />\n        </Button>\n      </SplitButton>\n      <SplitButton>\n        <Button variant='secondary' color='neutral' size='large'>\n          <CircleDashed />\n        </Button>\n        <Button variant='secondary' color='neutral' size='large'>\n          <ChevronDown />\n        </Button>\n      </SplitButton>\n    </HStack>\n  </VStack>\n);",
          "storyFile": "SplitButton/SplitButton.stories.tsx",
          "storyTitle": "Actions/SplitButton",
          "description": "Text, icon-and-text, and icon-only leading halves. The trailing half stays a bare\nchevron — giving it a label doubles the width and makes the menu look like a second action."
        },
        {
          "name": "WithDropdownMenu",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { ChevronDown } from '@wallarm-org/design-system/icons';\nimport { SplitButton } from '@wallarm-org/design-system/SplitButton';\n\nexport const WithDropdownMenu = () => (\n  <DropdownMenu>\n    <SplitButton data-testid='split-button-dropdown'>\n      <Button variant='primary' color='brand'>\n        Save\n      </Button>\n      <DropdownMenuTrigger asChild>\n        <Button variant='primary' color='brand'>\n          <ChevronDown />\n        </Button>\n      </DropdownMenuTrigger>\n    </SplitButton>\n    <DropdownMenuContent>\n      <DropdownMenuItem value='draft'>Save as draft</DropdownMenuItem>\n      <DropdownMenuItem value='publish'>Save and publish</DropdownMenuItem>\n      <DropdownMenuItem value='template'>Save as template</DropdownMenuItem>\n    </DropdownMenuContent>\n  </DropdownMenu>\n);",
          "storyFile": "SplitButton/SplitButton.stories.tsx",
          "storyTitle": "Actions/SplitButton",
          "description": "The real shape: the leading half performs the default action, and only the chevron opens\nthe menu. Repeat the default inside the menu only if its wording differs there."
        }
      ]
    },
    {
      "name": "Stack",
      "description": "A column or row of children with a gap from the spacing scale — `gap` defaults to 4, which is the practical difference from `Flex`. Reach for `VStack` or `HStack` rather than `Stack` with a `direction`: they read better in a tree, and `HStack` centres its items for you. Children have to be elements — a bare string is dropped rather than rendered.",
      "importPath": "@wallarm-org/design-system/Stack",
      "props": [
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "align",
          "type": "{ start: string; center: string; end: string; stretch: string; baseline: string; }",
          "required": false,
          "defaultValue": "stretch"
        },
        {
          "name": "inline",
          "type": "{ true: string; false: string; }",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "fullWidth",
          "type": "{ true: string; }",
          "required": false
        },
        {
          "name": "wrap",
          "type": "{ wrap: string; nowrap: string; reverse: string; }",
          "required": false,
          "defaultValue": "nowrap"
        },
        {
          "name": "direction",
          "type": "{ row: string; column: string; 'row-reverse': string; 'column-reverse': string; }",
          "required": false,
          "defaultValue": "column"
        },
        {
          "name": "justify",
          "type": "{ start: string; center: string; end: string; between: string; around: string; evenly: string; }",
          "required": false,
          "defaultValue": "start"
        },
        {
          "name": "gap",
          "type": "complex",
          "required": false,
          "defaultValue": "4"
        },
        {
          "name": "flexGrow",
          "type": "{ true: string; }",
          "required": false
        },
        {
          "name": "flexShrink",
          "type": "{ true: string; false: string; }",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "asChild",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "false"
        }
      ],
      "variants": [
        {
          "name": "inline",
          "options": [
            "true",
            "false"
          ]
        },
        {
          "name": "direction",
          "options": [
            "row",
            "column",
            "row-reverse",
            "column-reverse"
          ]
        },
        {
          "name": "align",
          "options": [
            "start",
            "center",
            "end",
            "stretch",
            "baseline"
          ]
        },
        {
          "name": "justify",
          "options": [
            "start",
            "center",
            "end",
            "between",
            "around",
            "evenly"
          ]
        },
        {
          "name": "wrap",
          "options": [
            "wrap",
            "nowrap",
            "reverse"
          ]
        },
        {
          "name": "fullWidth",
          "options": [
            "true"
          ]
        },
        {
          "name": "flexGrow",
          "options": [
            "true"
          ]
        },
        {
          "name": "flexShrink",
          "options": [
            "true",
            "false"
          ]
        },
        {
          "name": "gap",
          "options": [
            "0",
            "1",
            "2",
            "4",
            "6",
            "8",
            "12",
            "16",
            "20",
            "24",
            "28",
            "32",
            "36",
            "40",
            "44",
            "48",
            "56",
            "64",
            "80",
            "96",
            "112",
            "128",
            "144"
          ]
        }
      ],
      "subComponents": [
        {
          "name": "HStack",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "align",
              "type": "{ start: string; center: string; end: string; stretch: string; baseline: string; }",
              "required": false,
              "defaultValue": "center"
            },
            {
              "name": "inline",
              "type": "{ true: string; false: string; }",
              "required": false
            },
            {
              "name": "fullWidth",
              "type": "{ true: string; }",
              "required": false
            },
            {
              "name": "wrap",
              "type": "{ wrap: string; nowrap: string; reverse: string; }",
              "required": false
            },
            {
              "name": "justify",
              "type": "{ start: string; center: string; end: string; between: string; around: string; evenly: string; }",
              "required": false,
              "defaultValue": "start"
            },
            {
              "name": "gap",
              "type": "complex",
              "required": false
            },
            {
              "name": "flexGrow",
              "type": "{ true: string; }",
              "required": false
            },
            {
              "name": "flexShrink",
              "type": "{ true: string; false: string; }",
              "required": false
            }
          ]
        },
        {
          "name": "VStack",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "align",
              "type": "{ start: string; center: string; end: string; stretch: string; baseline: string; }",
              "required": false
            },
            {
              "name": "inline",
              "type": "{ true: string; false: string; }",
              "required": false
            },
            {
              "name": "fullWidth",
              "type": "{ true: string; }",
              "required": false
            },
            {
              "name": "wrap",
              "type": "{ wrap: string; nowrap: string; reverse: string; }",
              "required": false
            },
            {
              "name": "justify",
              "type": "{ start: string; center: string; end: string; between: string; around: string; evenly: string; }",
              "required": false
            },
            {
              "name": "gap",
              "type": "complex",
              "required": false
            },
            {
              "name": "flexGrow",
              "type": "{ true: string; }",
              "required": false
            },
            {
              "name": "flexShrink",
              "type": "{ true: string; false: string; }",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Stack } from '@wallarm-org/design-system/Stack';\n\nexport const Basic = () => (\n  <Stack gap={4}>\n    <Box>A</Box>\n    <Box>B</Box>\n    <Box>C</Box>\n  </Stack>\n);",
          "storyFile": "Stack/Stack.stories.tsx",
          "storyTitle": "Layout/Stack",
          "description": "The bare `Stack`: a column, because that is its default direction, with the default gap already applied."
        },
        {
          "name": "Direction",
          "code": "import { Flex } from '@wallarm-org/design-system/Flex';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Direction = () => (\n  <Flex direction='column' gap={8}>\n    <Flex direction='column'>\n      <VStack gap={4}>\n        <Box>1</Box>\n        <Box>2</Box>\n        <Box>3</Box>\n      </VStack>\n    </Flex>\n    <Flex direction='column'>\n      <HStack gap={4}>\n        <Box>1</Box>\n        <Box>2</Box>\n        <Box>3</Box>\n      </HStack>\n    </Flex>\n  </Flex>\n);",
          "storyFile": "Stack/Stack.stories.tsx",
          "storyTitle": "Layout/Stack",
          "description": "`VStack` and `HStack` are the same component with the direction fixed — and `HStack` also switches `align` to `center`, since a row of mixed heights almost always wants that."
        },
        {
          "name": "Alignment",
          "code": "import { Flex } from '@wallarm-org/design-system/Flex';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Alignment = () => (\n  <Flex direction='column' gap={8}>\n    <Flex direction='column'>\n      <VStack align='start'>\n        <Box>A</Box>\n        <Box>B</Box>\n        <Box>C</Box>\n      </VStack>\n    </Flex>\n    <Flex direction='column'>\n      <VStack align='center'>\n        <Box>A</Box>\n        <Box>B</Box>\n        <Box>C</Box>\n      </VStack>\n    </Flex>\n    <Flex direction='column'>\n      <VStack align='end'>\n        <Box>A</Box>\n        <Box>B</Box>\n        <Box>C</Box>\n      </VStack>\n    </Flex>\n  </Flex>\n);",
          "storyFile": "Stack/Stack.stories.tsx",
          "storyTitle": "Layout/Stack",
          "description": "`align` positions the children across the stack, not along it: in a column that is left, centre and right."
        },
        {
          "name": "Spacing",
          "code": "import { Flex } from '@wallarm-org/design-system/Flex';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Spacing = () => (\n  <Flex direction='column' gap={8}>\n    <Flex direction='column'>\n      <VStack gap={2}>\n        <Box>A</Box>\n        <Box>B</Box>\n        <Box>C</Box>\n      </VStack>\n    </Flex>\n    <Flex direction='column'>\n      <VStack gap={4}>\n        <Box>A</Box>\n        <Box>B</Box>\n        <Box>C</Box>\n      </VStack>\n    </Flex>\n    <Flex direction='column'>\n      <VStack gap={8}>\n        <Box>A</Box>\n        <Box>B</Box>\n        <Box>C</Box>\n      </VStack>\n    </Flex>\n  </Flex>\n);",
          "storyFile": "Stack/Stack.stories.tsx",
          "storyTitle": "Layout/Stack",
          "description": "`gap` takes the spacing scale rather than a free number, which is what keeps rhythm consistent between two screens built by two people."
        },
        {
          "name": "Wrap",
          "code": "import { Flex } from '@wallarm-org/design-system/Flex';\nimport { HStack } from '@wallarm-org/design-system/Stack';\n\nexport const Wrap = () => (\n  <Flex direction='column'>\n    <HStack gap={2} wrap='wrap'>\n      {new Array(40).fill(null).map((_, index) => {\n        const key = `${index + 1}`;\n        return <Box key={key}>{key}</Box>;\n      })}\n    </HStack>\n  </Flex>\n);",
          "storyFile": "Stack/Stack.stories.tsx",
          "storyTitle": "Layout/Stack",
          "description": "With `wrap`, a row that runs out of width breaks onto the next line instead of overflowing its container."
        },
        {
          "name": "FlexBehavior",
          "code": "import { Flex } from '@wallarm-org/design-system/Flex';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\n\nexport const FlexBehavior = () => (\n  <Flex direction='column' gap={8}>\n    <Flex direction='column'>\n      <HStack gap={4}>\n        <Box>A</Box>\n        <Box>B</Box>\n        <Box>C</Box>\n      </HStack>\n    </Flex>\n    <Flex direction='column'>\n      <HStack gap={4} fullWidth>\n        <Box>A</Box>\n        <Box>B</Box>\n        <Box>C</Box>\n      </HStack>\n    </Flex>\n    <Flex direction='column'>\n      <HStack>\n        <VStack gap={4} flexGrow>\n          <Box>A</Box>\n          <Box>B</Box>\n        </VStack>\n        <VStack gap={4}>\n          <Box>C</Box>\n        </VStack>\n      </HStack>\n    </Flex>\n    <Flex direction='column'>\n      <div className='w-48 overflow-hidden border border-gray-300 rounded'>\n        <HStack gap={4} flexShrink={false}>\n          <Box>A</Box>\n          <Box>B</Box>\n          <Box>C</Box>\n          <Box>D</Box>\n          <Box>E</Box>\n        </HStack>\n      </div>\n    </Flex>\n  </Flex>\n);",
          "storyFile": "Stack/Stack.stories.tsx",
          "storyTitle": "Layout/Stack",
          "description": "The four sizing knobs against a fixed parent: `fullWidth` fills it, `flexGrow` takes the leftover space, and `flexShrink={false}` refuses to be squeezed — which is what makes the last row overflow on purpose."
        }
      ]
    },
    {
      "name": "Stepper",
      "description": "A horizontal row of numbered steps for a flow that is split into a few screens, such as a create drawer — it shows where the reader is and lets them jump to any step. It is compound, like Ark UI Steps: `count` on the root and `index` on every `StepperItem` and `StepperContent` are explicit. `StepperContent` shows the current step’s body, and `StepperPrevTrigger` / `StepperNextTrigger` move between steps; Next stops at the last step, where the page renders its own submit button. It never blocks a step: the page owns each step’s `status` (`completed`, `danger`, `upcoming`), and the current step always renders as active. Reach for `Timeline` for a history of events, `Tour` for guided onboarding, `Progress` for how far along a task is, and `Tabs` for sections that have no order.",
      "importPath": "@wallarm-org/design-system/Stepper",
      "props": [
        {
          "name": "statusLabels",
          "type": "StepperStatusLabels | undefined",
          "required": false,
          "description": "Screen-reader-only suffixes for completed and danger steps."
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "ids",
          "type": "ElementIds | undefined",
          "required": false,
          "description": "The custom ids for the stepper elements"
        },
        {
          "name": "count",
          "type": "number",
          "required": true,
          "description": "Number of steps, 1–6. Required: each `StepperItem` and `StepperContent` takes its `index`."
        },
        {
          "name": "step",
          "type": "number | undefined",
          "required": false,
          "description": "Controlled current step, 0-based. Clamped to `[0, count - 1]`."
        },
        {
          "name": "defaultStep",
          "type": "number | undefined",
          "required": false,
          "description": "Uncontrolled initial step. Default `0`. Clamped to `[0, count - 1]`."
        },
        {
          "name": "onStepChange",
          "type": "((details: StepChangeDetails) => void) | undefined",
          "required": false,
          "description": "Fires when a click changes the step, back or forward: `({ step }) => void`. A click on the\ncurrent step does not fire it; use the trigger's `onClick` to observe that."
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "status",
          "options": [
            "active",
            "danger",
            "completed",
            "upcoming"
          ],
          "defaultValue": "upcoming"
        }
      ],
      "subComponents": [
        {
          "name": "StepperContent",
          "props": [
            {
              "name": "index",
              "type": "number",
              "required": true,
              "description": "0-based step this body belongs to."
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "StepperDescription",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "StepperIndicator",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "StepperItem",
          "props": [
            {
              "name": "index",
              "type": "number",
              "required": true,
              "description": "0-based position of this step. Required, like Ark's `Steps.Item`."
            },
            {
              "name": "status",
              "type": "StepperItemStatus | undefined",
              "required": false,
              "description": "Status set by the page. Ignored while this item is the current step. Default `'upcoming'`."
            },
            {
              "name": "statusLabel",
              "type": "string | undefined",
              "required": false,
              "description": "Overrides the root `statusLabels` suffix for this item."
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "StepperList",
          "props": [
            {
              "name": "type",
              "type": "\"a\" | \"i\" | \"1\" | \"A\" | \"I\" | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "StepperNextTrigger",
          "props": [
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "description": "Render the child (e.g. a `Button`) as the trigger instead of a plain `<button>`."
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "StepperPrevTrigger",
          "props": [
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "description": "Render the child (e.g. a `Button`) as the trigger instead of a plain `<button>`."
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "StepperRootProvider",
          "props": [
            {
              "name": "value",
              "type": "complex",
              "required": true,
              "description": "The machine from `useStepper()`, so the page can drive the steps from outside."
            },
            {
              "name": "statusLabels",
              "type": "StepperStatusLabels | undefined",
              "required": false,
              "description": "Screen-reader-only suffixes for completed and danger steps."
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "StepperSeparator",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "StepperTitle",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "StepperTrigger",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Stepper, StepperIndicator, StepperItem, StepperList, StepperSeparator, StepperTitle, StepperTrigger } from '@wallarm-org/design-system/Stepper';\n\nexport const Basic = ({ count, ...args }) => (\n  <Stepper data-testid='stepper' defaultStep={0} count={count}>\n    <StepperList aria-label='Create policy steps'>\n      {basicTitles(count).map((title, i) => (\n        <StepperItem key={title} index={i}>\n          <StepperTrigger>\n            <StepperIndicator />\n            <StepperTitle>{title}</StepperTitle>\n          </StepperTrigger>\n          <StepperSeparator />\n        </StepperItem>\n      ))}\n    </StepperList>\n  </Stepper>\n);",
          "storyFile": "Stepper/Stepper.stories.tsx",
          "storyTitle": "Navigation/Stepper",
          "description": "Four steps, uncontrolled: click any step to make it current. The `count` control adds or removes steps."
        },
        {
          "name": "StepTypes",
          "code": "import { HStack, VStack } from '@wallarm-org/design-system/Stack';\nimport { Stepper, StepperIndicator, StepperItem, StepperList, StepperSeparator, StepperTitle, StepperTrigger } from '@wallarm-org/design-system/Stepper';\n\nexport const StepTypes = () => (\n  <VStack gap={24}>\n    <Stepper data-testid='stepper' count={TYPED_STEPS.length} step={2}>\n      <StepperList aria-label='Create policy steps'>\n        {TYPED_STEPS.map(({ title, status }, i) => (\n          <StepperItem key={title} index={i} status={status}>\n            <StepperTrigger>\n              <StepperIndicator />\n              <StepperTitle>{title}</StepperTitle>\n            </StepperTrigger>\n            <StepperSeparator />\n          </StepperItem>\n        ))}\n      </StepperList>\n    </Stepper>\n    <HStack gap={32} align='center'>\n      {STEP_TYPES.map(({ type, status }) => (\n        <VStack key={type} gap={4} align='start'>\n          {/* A lone step is always current, so the non-active types sit at index 1 of 2. */}\n          <Stepper data-testid={`stepper-type-${type}`} count={type === 'active' ? 1 : 2} step={0}>\n            <StepperList className={SINGLE_STEP_CLASSES} aria-label={`${type} step`}>\n              <StepperItem index={type === 'active' ? 0 : 1} status={status}>\n                <StepperTrigger>\n                  <StepperIndicator />\n                  <StepperTitle>Step</StepperTitle>\n                </StepperTrigger>\n                <StepperSeparator />\n              </StepperItem>\n            </StepperList>\n          </Stepper>\n        </VStack>\n      ))}\n    </HStack>\n  </VStack>\n);",
          "storyFile": "Stepper/Stepper.stories.tsx",
          "storyTitle": "Navigation/Stepper",
          "description": "The four step types: the page sets `completed`, `danger` or `upcoming`, and the current step is\nalways active — a current `danger` step (Scope) shows as active too, since active is the only\nstep in brand."
        },
        {
          "name": "WithDescription",
          "code": "import { Stepper, StepperDescription, StepperIndicator, StepperItem, StepperList, StepperSeparator, StepperTitle, StepperTrigger } from '@wallarm-org/design-system/Stepper';\n\nexport const WithDescription = () => (\n  <Stepper data-testid='stepper' count={DESCRIBED_STEPS.length} defaultStep={1}>\n    <StepperList aria-label='Create policy steps'>\n      {DESCRIBED_STEPS.map(({ title, description, status }, i) => (\n        <StepperItem key={title} index={i} status={status}>\n          <StepperTrigger>\n            <StepperIndicator />\n            <StepperTitle>{title}</StepperTitle>\n            {description && <StepperDescription>{description}</StepperDescription>}\n          </StepperTrigger>\n          <StepperSeparator />\n        </StepperItem>\n      ))}\n    </StepperList>\n  </Stepper>\n);",
          "storyFile": "Stepper/Stepper.stories.tsx",
          "storyTitle": "Navigation/Stepper",
          "description": "An optional second line under the title; the separator stays on the first row."
        },
        {
          "name": "Navigation",
          "code": "import { useState } from 'react';\nimport { VStack } from '@wallarm-org/design-system/Stack';\nimport { Stepper, StepperIndicator, StepperItem, StepperList, StepperSeparator, StepperTitle, StepperTrigger } from '@wallarm-org/design-system/Stepper';\n\nexport const Navigation = () => {\n  const [step, setStep] = useState(0);\n  return (\n    <VStack gap={16}>\n      <Stepper\n        data-testid='stepper'\n        count={POLICY_STEPS.length}\n        step={step}\n        onStepChange={details => setStep(details.step)}\n      >\n        <StepperList aria-label='Create policy steps'>\n          {POLICY_STEPS.map((title, i) => (\n            <StepperItem key={title} index={i}>\n              <StepperTrigger>\n                <StepperIndicator />\n                <StepperTitle>{title}</StepperTitle>\n              </StepperTrigger>\n              <StepperSeparator />\n            </StepperItem>\n          ))}\n        </StepperList>\n      </Stepper>\n    </VStack>\n  );\n};",
          "storyFile": "Stepper/Stepper.stories.tsx",
          "storyTitle": "Navigation/Stepper",
          "description": "Controlled with `step` and `onStepChange`; every step is clickable, back and forward."
        },
        {
          "name": "InDrawer",
          "code": "import { type FormEvent, useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Drawer, DrawerBody, DrawerContent, DrawerFooter, DrawerFooterControls, DrawerHeader, DrawerTitle, DrawerTrigger } from '@wallarm-org/design-system/Drawer';\nimport { Stepper, StepperContent, StepperIndicator, StepperItem, StepperList, StepperNextTrigger, StepperPrevTrigger, StepperSeparator, StepperTitle, StepperTrigger } from '@wallarm-org/design-system/Stepper';\n\nexport const InDrawer = () => {\n  const { step, statuses, goTo } = usePolicyFlow();\n  const { nextRef, submitRef, onBackClick, onNextClick } = useFooterFocus(step);\n  const [submitted, setSubmitted] = useState(0);\n  const last = step === POLICY_STEPS.length - 1;\n  const onSubmit = (event: FormEvent) => {\n    event.preventDefault();\n    setSubmitted(n => n + 1);\n  };\n  return (\n    <Drawer data-testid='drawer' width={640}>\n      <DrawerTrigger asChild>\n        <Button variant='outline' color='neutral' data-testid='drawer-open'>\n          Create policy\n        </Button>\n      </DrawerTrigger>\n      <DrawerContent>\n        <DrawerHeader>\n          <DrawerTitle>Create policy</DrawerTitle>\n        </DrawerHeader>\n        <form onSubmit={onSubmit} className='flex min-h-0 flex-1 flex-col'>\n          <Stepper\n            data-testid='stepper'\n            count={POLICY_STEPS.length}\n            step={step}\n            onStepChange={details => goTo(details.step)}\n            className='flex min-h-0 flex-1 flex-col'\n          >\n            <StepperList aria-label='Create policy steps'>\n              {POLICY_STEPS.map((title, i) => (\n                <StepperItem key={title} index={i} status={statuses[i]}>\n                  <StepperTrigger>\n                    <StepperIndicator />\n                    <StepperTitle>{title}</StepperTitle>\n                  </StepperTrigger>\n                  <StepperSeparator />\n                </StepperItem>\n              ))}\n            </StepperList>\n            <DrawerBody>\n              {POLICY_STEPS.map((title, i) => (\n                <StepperContent key={title} index={i} className='py-16'>\n                  <BodyPlaceholder label={`${title} fields`} />\n                </StepperContent>\n              ))}\n            </DrawerBody>\n            <DrawerFooter>\n              {step > 0 && (\n                <DrawerFooterControls placement='left'>\n                  <StepperPrevTrigger asChild onClick={onBackClick}>\n                    <Button variant='outline' color='neutral' size='large'>\n                      Back\n                    </Button>\n                  </StepperPrevTrigger>\n                </DrawerFooterControls>\n              )}\n              <DrawerFooterControls placement='right'>\n                {last ? (\n                  <Button\n                    ref={submitRef}\n                    type='submit'\n                    variant='primary'\n                    color='brand'\n                    size='large'\n                  >\n                    Create policy\n                  </Button>\n                ) : (\n                  <StepperNextTrigger asChild onClick={onNextClick}>\n                    <Button ref={nextRef} variant='primary' color='brand' size='large'>\n                      Next: {POLICY_STEPS[step + 1]}\n                    </Button>\n                  </StepperNextTrigger>\n                )}\n              </DrawerFooterControls>\n            </DrawerFooter>\n          </Stepper>\n        </form>\n      </DrawerContent>\n    </Drawer>\n  );\n};",
          "storyFile": "Stepper/Stepper.stories.tsx",
          "storyTitle": "Navigation/Stepper",
          "description": "Inside a create drawer: the step list sits under the header, `StepperContent` shows the current\nstep's body (every body stays mounted, so fields keep their values) and the footer moves with\nBack / Next. Steps never submit the form; only the last step's own submit button does. Focus\nstays on the footer when Back or Next unmounts. The list sits directly below the header,\nwith 24px side insets, 12px bottom padding and no divider. Drawer parts inside the `Stepper`\nroot take its test ids (`stepper--body`, `stepper--footer`), not the Drawer's."
        },
        {
          "name": "LongLabel",
          "code": "import { Stepper, StepperDescription, StepperIndicator, StepperItem, StepperList, StepperSeparator, StepperTitle, StepperTrigger } from '@wallarm-org/design-system/Stepper';\n\nexport const LongLabel = () => (\n  <Stepper data-testid='stepper' count={3} defaultStep={0}>\n    <StepperList aria-label='Create policy steps'>\n      <StepperItem index={0}>\n        <StepperTrigger>\n          <StepperIndicator />\n          <StepperTitle>General</StepperTitle>\n        </StepperTrigger>\n        <StepperSeparator />\n      </StepperItem>\n      <StepperItem index={1} data-testid='stepper-long'>\n        <StepperTrigger>\n          <StepperIndicator />\n          <StepperTitle>\n            Rules applied to every request that matches the selected application and path\n          </StepperTitle>\n          <StepperDescription>\n            Request · Lua · HMAC auth · Response headers · Rate limit · Custom blocking page\n          </StepperDescription>\n        </StepperTrigger>\n        <StepperSeparator />\n      </StepperItem>\n      <StepperItem index={2}>\n        <StepperTrigger>\n          <StepperIndicator />\n          <StepperTitle>Review</StepperTitle>\n        </StepperTrigger>\n        <StepperSeparator />\n      </StepperItem>\n    </StepperList>\n  </Stepper>\n);",
          "storyFile": "Stepper/Stepper.stories.tsx",
          "storyTitle": "Navigation/Stepper",
          "description": "A title over 320px ellipsizes, with the full text in a tooltip on hover; so does a long description."
        },
        {
          "name": "SixSteps",
          "code": "import { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const SixSteps = () => (\n  <VStack gap={24}>\n    <SixStepStepper testId='stepper' />\n    <div className='w-640'>\n      <SixStepStepper testId='stepper-narrow' />\n    </div>\n  </VStack>\n);",
          "storyFile": "Stepper/Stepper.stories.tsx",
          "storyTitle": "Navigation/Stepper",
          "description": "Six steps, the most the design supports — at full width, then in a 640px drawer where titles truncate earlier."
        },
        {
          "name": "WithFooter",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { DrawerFooter, DrawerFooterControls } from '@wallarm-org/design-system/Drawer';\nimport { Stepper, StepperContent, StepperIndicator, StepperItem, StepperList, StepperNextTrigger, StepperPrevTrigger, StepperSeparator, StepperTitle, StepperTrigger } from '@wallarm-org/design-system/Stepper';\n\nexport const WithFooter = () => {\n  const { step, statuses, goTo } = usePolicyFlow();\n  const { nextRef, submitRef, onBackClick, onNextClick } = useFooterFocus(step);\n  const last = step === POLICY_STEPS.length - 1;\n  return (\n    <form\n      onSubmit={event => event.preventDefault()}\n      className='flex w-640 flex-col overflow-hidden rounded-12 border-1 border-border-primary-light'\n    >\n      <Stepper\n        data-testid='stepper'\n        count={POLICY_STEPS.length}\n        step={step}\n        onStepChange={details => goTo(details.step)}\n      >\n        <StepperList aria-label='Create policy steps'>\n          {POLICY_STEPS.map((title, i) => (\n            <StepperItem key={title} index={i} status={statuses[i]}>\n              <StepperTrigger>\n                <StepperIndicator />\n                <StepperTitle>{title}</StepperTitle>\n              </StepperTrigger>\n              <StepperSeparator />\n            </StepperItem>\n          ))}\n        </StepperList>\n        {POLICY_STEPS.map((title, i) => (\n          <StepperContent key={title} index={i} className='px-24 py-16'>\n            <BodyPlaceholder label={`${title} fields`} />\n          </StepperContent>\n        ))}\n        <DrawerFooter>\n          {step > 0 && (\n            <DrawerFooterControls placement='left'>\n              <StepperPrevTrigger asChild data-testid='stepper-back' onClick={onBackClick}>\n                <Button variant='outline' color='neutral' size='large'>\n                  Back\n                </Button>\n              </StepperPrevTrigger>\n            </DrawerFooterControls>\n          )}\n          <DrawerFooterControls placement='right'>\n            {last ? (\n              <Button\n                ref={submitRef}\n                type='submit'\n                variant='primary'\n                color='brand'\n                size='large'\n                data-testid='stepper-submit'\n              >\n                Create policy\n              </Button>\n            ) : (\n              <StepperNextTrigger asChild data-testid='stepper-next' onClick={onNextClick}>\n                <Button ref={nextRef} variant='primary' color='brand' size='large'>\n                  Next: {POLICY_STEPS[step + 1]}\n                </Button>\n              </StepperNextTrigger>\n            )}\n          </DrawerFooterControls>\n        </DrawerFooter>\n      </Stepper>\n    </form>\n  );\n};",
          "storyFile": "Stepper/Stepper.stories.tsx",
          "storyTitle": "Navigation/Stepper",
          "description": "The footer recipe: `StepperPrevTrigger` on the left (hidden on the first step) and\n`StepperNextTrigger` as `Next: <destination>` on the right, both `asChild` with a `Button`. On\nthe last step the page renders its own submit button instead: Next is disabled there. When\nBack or Next unmounts under the keyboard, the page moves focus to the right-hand footer button\n(`useFooterFocus` here), so it never falls to `<body>`."
        },
        {
          "name": "CustomIndicator",
          "code": "import { Lock } from '@wallarm-org/design-system/icons';\nimport { Stepper, StepperIndicator, StepperItem, StepperList, StepperSeparator, StepperTitle, StepperTrigger } from '@wallarm-org/design-system/Stepper';\n\nexport const CustomIndicator = () => (\n  <Stepper data-testid='stepper' count={3} defaultStep={0}>\n    <StepperList aria-label='Create policy steps'>\n      {['General', 'Rules', 'Billing'].map((title, i) => (\n        <StepperItem key={title} index={i}>\n          <StepperTrigger>\n            <StepperIndicator>{i === 2 ? <Lock size='sm' /> : undefined}</StepperIndicator>\n            <StepperTitle>{title}</StepperTitle>\n          </StepperTrigger>\n          <StepperSeparator />\n        </StepperItem>\n      ))}\n    </StepperList>\n  </Stepper>\n);",
          "storyFile": "Stepper/Stepper.stories.tsx",
          "storyTitle": "Navigation/Stepper",
          "description": "`children` on `StepperIndicator` replaces the number, `!` or check, here with an icon on a locked step."
        },
        {
          "name": "AnalyticsAndTestIds",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\nimport { Stepper, StepperIndicator, StepperItem, StepperList, StepperNextTrigger, StepperPrevTrigger, StepperSeparator, StepperTitle, StepperTrigger } from '@wallarm-org/design-system/Stepper';\n\nexport const AnalyticsAndTestIds = () => (\n  <VStack gap={16}>\n    <Stepper data-testid='stepper' count={POLICY_STEPS.length} defaultStep={1}>\n      <StepperList aria-label='Create policy steps'>\n        {ANALYTICS_STEPS.map(({ title, analyticsId, analyticsProps, testId }, i) => (\n          <StepperItem key={title} index={i}>\n            <StepperTrigger\n              data-analytics-id={analyticsId}\n              data-analytics-props={analyticsProps}\n              {...(testId === 'step-review' && { 'data-testid': testId })}\n            >\n              <StepperIndicator />\n              <StepperTitle>{title}</StepperTitle>\n            </StepperTrigger>\n            <StepperSeparator />\n          </StepperItem>\n        ))}\n      </StepperList>\n      <HStack gap={8} className='px-24 py-16'>\n        <StepperPrevTrigger asChild data-analytics-id='POLICY_STEP_BACK'>\n          <Button variant='outline' color='neutral'>\n            Back\n          </Button>\n        </StepperPrevTrigger>\n        <StepperNextTrigger asChild data-analytics-id='POLICY_STEP_NEXT'>\n          <Button>Next</Button>\n        </StepperNextTrigger>\n      </HStack>\n    </Stepper>\n    <VStack gap={4} align='start'>\n      {ANALYTICS_STEPS.map(({ title, analyticsId, analyticsProps, testId }) => (\n        <span key={title} className='sb-annotation'>\n          {`<button> data-testid=\"${testId}\" data-analytics-id=\"${analyticsId}\" data-analytics-props='${analyticsProps}'`}\n        </span>\n      ))}\n    </VStack>\n  </VStack>\n);",
          "storyFile": "Stepper/Stepper.stories.tsx",
          "storyTitle": "Navigation/Stepper",
          "description": "`data-analytics-id` and `data-analytics-props` land on each step's button and on the Back / Next\nbuttons, and `data-testid` cascades from the root (`{id}--item-{index}--trigger`) unless a part\nsets its own."
        }
      ]
    },
    {
      "name": "Switch",
      "description": "Turns one setting on or off, and takes effect the moment it is flipped — reach for `Checkbox` when the answer is submitted with a form, and `ToggleButton` when the control belongs in a toolbar rather than a settings list. Because there is no Save to undo it, avoid a switch for anything destructive or slow.",
      "importPath": "@wallarm-org/design-system/Switch",
      "props": [
        {
          "name": "a11yMode",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "htmlFor",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "label",
          "type": "string | undefined",
          "required": false,
          "description": "Specifies the localized strings that identifies the accessibility elements and their states"
        },
        {
          "name": "disabled",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the switch is disabled."
        },
        {
          "name": "name",
          "type": "string | undefined",
          "required": false,
          "description": "The name of the input field in a switch\n(Useful for form submission)."
        },
        {
          "name": "value",
          "type": "string | number | undefined",
          "required": false,
          "description": "The value of switch input. Useful for form submission."
        },
        {
          "name": "ids",
          "type": "ElementIds | undefined",
          "required": false,
          "description": "The ids of the elements in the switch. Useful for composition."
        },
        {
          "name": "readOnly",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the switch is read-only"
        },
        {
          "name": "required",
          "type": "boolean | undefined",
          "required": false,
          "description": "If `true`, the switch input is marked as required,"
        },
        {
          "name": "onCheckedChange",
          "type": "((details: CheckedChangeDetails) => void) | undefined",
          "required": false,
          "description": "Function to call when the switch is clicked."
        },
        {
          "name": "invalid",
          "type": "boolean | undefined",
          "required": false,
          "description": "If `true`, the switch is marked as invalid."
        },
        {
          "name": "checked",
          "type": "boolean | undefined",
          "required": false,
          "description": "The controlled checked state of the switch"
        },
        {
          "name": "asChild",
          "type": "boolean | undefined",
          "required": false,
          "description": "Use the provided child element as the default rendered element, combining their props and behavior."
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [
        {
          "name": "SwitchDescription",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "SwitchLabel",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "description": "Use the provided child element as the default rendered element, combining their props and behavior."
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Switch, SwitchControl, SwitchLabel } from '@wallarm-org/design-system/Switch';\n\nexport const Basic = () => (\n  <Switch data-testid='switch'>\n    <SwitchControl />\n    <SwitchLabel>Enable notifications </SwitchLabel>\n  </Switch>\n);",
          "storyFile": "Switch/Switch.stories.tsx",
          "storyTitle": "Inputs/Switch",
          "description": "`SwitchControl` plus `SwitchLabel`. Name the thing being switched rather than the action, since\nthe control already carries the verb: \"Email notifications\", not \"Enable notifications\"."
        },
        {
          "name": "Checked",
          "code": "import { Switch, SwitchControl, SwitchLabel } from '@wallarm-org/design-system/Switch';\n\nexport const Checked = () => (\n  <Switch checked>\n    <SwitchControl />\n    <SwitchLabel>Enable notifications</SwitchLabel>\n  </Switch>\n);",
          "storyFile": "Switch/Switch.stories.tsx",
          "storyTitle": "Inputs/Switch",
          "description": "The on state. The track fills with brand and the thumb travels, so on and off differ by\nboth colour and position."
        },
        {
          "name": "Disabled",
          "code": "import { VStack } from '@wallarm-org/design-system/Stack';\nimport { Switch, SwitchControl, SwitchLabel } from '@wallarm-org/design-system/Switch';\n\nexport const Disabled = () => (\n  <VStack>\n    <Switch disabled>\n      <SwitchControl />\n      <SwitchLabel>Enable notifications</SwitchLabel>\n    </Switch>\n\n    <Switch checked disabled>\n      <SwitchControl />\n      <SwitchLabel>Enable notifications</SwitchLabel>\n    </Switch>\n  </VStack>\n);",
          "storyFile": "Switch/Switch.stories.tsx",
          "storyTitle": "Inputs/Switch",
          "description": "Dimmed and not clickable, in both states. A disabled switch still shows where the setting\nstands, which is the point of showing it at all."
        },
        {
          "name": "WithDescription",
          "code": "import { Switch, SwitchControl, SwitchDescription, SwitchLabel } from '@wallarm-org/design-system/Switch';\n\nexport const WithDescription = () => (\n  <Switch>\n    <SwitchControl />\n    <SwitchLabel>Enable notifications</SwitchLabel>\n    <SwitchDescription>Receive notifications about updates and new features.</SwitchDescription>\n  </Switch>\n);",
          "storyFile": "Switch/Switch.stories.tsx",
          "storyTitle": "Inputs/Switch",
          "description": "`SwitchDescription` adds a second line and switches the row to a grid, so the text aligns\nwith the label rather than the track."
        },
        {
          "name": "Multiple",
          "code": "import { Info } from '@wallarm-org/design-system/icons';\nimport { VStack } from '@wallarm-org/design-system/Stack';\nimport { Switch, SwitchControl, SwitchDescription, SwitchLabel } from '@wallarm-org/design-system/Switch';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@wallarm-org/design-system/Tooltip';\n\nexport const Multiple = () => (\n  <VStack align='start'>\n    <Switch>\n      <SwitchControl />\n      <SwitchLabel>\n        Email notifications{' '}\n        <Tooltip>\n          <TooltipTrigger>\n            <Info />\n          </TooltipTrigger>\n          <TooltipContent>Additional information</TooltipContent>\n        </Tooltip>\n      </SwitchLabel>\n      <SwitchDescription>Receive email notifications about important updates.</SwitchDescription>\n    </Switch>\n\n    <Switch checked>\n      <SwitchControl />\n      <SwitchLabel>\n        Push notifications{' '}\n        <Tooltip>\n          <TooltipTrigger>\n            <Info />\n          </TooltipTrigger>\n          <TooltipContent>Additional information</TooltipContent>\n        </Tooltip>\n      </SwitchLabel>\n      <SwitchDescription>Get push notifications on your mobile device.</SwitchDescription>\n    </Switch>\n\n    <Switch>\n      <SwitchControl />\n      <SwitchLabel>\n        SMS notifications{' '}\n        <Tooltip>\n          <TooltipTrigger>\n            <Info />\n          </TooltipTrigger>\n          <TooltipContent>Additional information</TooltipContent>\n        </Tooltip>\n      </SwitchLabel>\n      <SwitchDescription>Receive SMS notifications for critical alerts.</SwitchDescription>\n    </Switch>\n  </VStack>\n);",
          "storyFile": "Switch/Switch.stories.tsx",
          "storyTitle": "Inputs/Switch",
          "description": "Several switches in a column. They are independent settings, not a choice between\noptions — if only one may be on, that is a `Radio` group."
        },
        {
          "name": "AccessibilityMode",
          "code": "import { VStack } from '@wallarm-org/design-system/Stack';\nimport { Switch, SwitchControl, SwitchLabel } from '@wallarm-org/design-system/Switch';\n\nexport const AccessibilityMode = () => (\n  <VStack>\n    <Switch a11yMode>\n      <SwitchControl />\n      <SwitchLabel>Enable notifications</SwitchLabel>\n    </Switch>\n\n    <Switch a11yMode checked>\n      <SwitchControl />\n      <SwitchLabel>Enable notifications</SwitchLabel>\n    </Switch>\n  </VStack>\n);",
          "storyFile": "Switch/Switch.stories.tsx",
          "storyTitle": "Inputs/Switch",
          "description": "`a11yMode` draws a tick or a cross inside the track, so the state survives being read\nwithout colour. Worth turning on wherever the setting matters more than the aesthetic."
        }
      ]
    },
    {
      "name": "Table",
      "description": "The grid for many records of one shape — reach for a `Card` grid when a row reads better as an object than as a set of columns, and for `Attribute` when you are showing one record rather than many. Everything interactive is controlled: sorting, selection, expansion, column order, pinning, sizing and visibility are each a state prop with a callback, so nothing moves unless you move it, and `manualSorting` hands the sort to the server. Filtering belongs above the grid in a `FilterInput`, and a long collection scrolls rather than paginates — `Pagination` is the deliberate exception, for when a page number is part of the task.",
      "importPath": "@wallarm-org/design-system/Table",
      "props": [
        {
          "name": "data",
          "type": "T[]",
          "required": true,
          "description": "Data array for rows"
        },
        {
          "name": "columns",
          "type": "TableColumnDef<T>[]",
          "required": true,
          "description": "Column definitions"
        },
        {
          "name": "isLoading",
          "type": "boolean | undefined",
          "required": false,
          "description": "Show skeleton rows",
          "defaultValue": "false"
        },
        {
          "name": "isLoadingPrevious",
          "type": "boolean | undefined",
          "required": false,
          "description": "Show skeleton rows above the first row while a previous page is being\nfetched (bidirectional infinite scroll — the start-edge counterpart of\n`isLoading`). Pair with `onStartReached`."
        },
        {
          "name": "skeletonCount",
          "type": "number | undefined",
          "required": false,
          "description": "Number of skeleton rows to display when loading (default: 6)"
        },
        {
          "name": "getRowId",
          "type": "((row: T, index: number) => string) | undefined",
          "required": false,
          "description": "Row id accessor for stable row identity"
        },
        {
          "name": "aria-label",
          "type": "string | undefined",
          "required": false,
          "description": "Accessible label for the table"
        },
        {
          "name": "sorting",
          "type": "TableSortingState | undefined",
          "required": false
        },
        {
          "name": "onSortingChange",
          "type": "complex",
          "required": false
        },
        {
          "name": "manualSorting",
          "type": "boolean | undefined",
          "required": false,
          "description": "When `true`, disables TanStack's client-side sort. The table renders rows\nin the order they appear in `data` and only fires `onSortingChange` on\nheader clicks. Use this when sorting is performed server-side and the\nserver returns pre-sorted rows.\n\nDefault: `false` (client-side sort via TanStack's `getSortedRowModel`)."
        },
        {
          "name": "rowSelection",
          "type": "TableRowSelectionState | undefined",
          "required": false
        },
        {
          "name": "onRowSelectionChange",
          "type": "complex",
          "required": false
        },
        {
          "name": "enableSelectAllRows",
          "type": "boolean | undefined",
          "required": false,
          "description": "Renders the master checkbox in the selection column header.\n\nSet `false` when \"all rows\" is not a selection the consumer can act on —\na listing whose scope the consumer cannot express, for instance — leaving\nper-row checkboxes (shift-click range selection included) as the only way\nto select. The column itself stays, so the layout does not shift.\n\nDefault: `true`."
        },
        {
          "name": "onSelectAllRows",
          "type": "((selected: boolean) => void) | undefined",
          "required": false,
          "description": "Called when the master checkbox is toggled, with its new state, in\naddition to the `onRowSelectionChange` the toggle produces.\n\nThe state change alone cannot identify the gesture: \"every loaded row is\nselected\" is also what checking the last row by hand produces. A consumer\nthat treats the master checkbox as meaning more than the loaded rows —\neverything matching a server-side filter, say — needs to know the\ndifference, which is what this reports."
        },
        {
          "name": "columnSizing",
          "type": "TableColumnSizingState | undefined",
          "required": false
        },
        {
          "name": "onColumnSizingChange",
          "type": "complex",
          "required": false
        },
        {
          "name": "columnPinning",
          "type": "TableColumnPinningState | undefined",
          "required": false
        },
        {
          "name": "onColumnPinningChange",
          "type": "complex",
          "required": false
        },
        {
          "name": "columnOrder",
          "type": "string[] | undefined",
          "required": false
        },
        {
          "name": "onColumnOrderChange",
          "type": "TableOnChangeFn<string[]> | undefined",
          "required": false
        },
        {
          "name": "grouping",
          "type": "TableGroupingState | undefined",
          "required": false
        },
        {
          "name": "onGroupingChange",
          "type": "complex",
          "required": false
        },
        {
          "name": "renderGroupRow",
          "type": "((row: TableRow<T>) => ReactNode) | undefined",
          "required": false,
          "description": "Group row content for `getSubRows` grouping. Passing it switches the table\nto sub-row grouping mode: the auto-injected expand column is dropped, so\nthe content is responsible for its own expand/collapse toggle\n(`row.getToggleExpandedHandler()`).\n\nRendered only with `groupRowSpan: 'full'`. With the default `'master'` the\ngroup row shows its master (first data) column cell, as before."
        },
        {
          "name": "groupRowSpan",
          "type": "\"full\" | \"master\" | undefined",
          "required": false,
          "description": "How a group row lays out its content.\n\n- `'master'` (default): the master column's cell, then empty filler cells —\n  the content is confined to the master column width.\n- `'full'`: `renderGroupRow(row)` in a single cell spanning every data\n  column (system cells — selection, drag handle — keep their own cells).\n  Use for a group header with a title on the left and actions pinned to the\n  right edge of the table. Requires `renderGroupRow`."
        },
        {
          "name": "groupExpandColumn",
          "type": "boolean | undefined",
          "required": false,
          "description": "Keep the expand column in sub-row grouping mode (`renderGroupRow`), which\notherwise drops it and leaves the toggle to the group row's content. The\ncolumn comes first, ahead of the drag handle, and shows a toggle on group\nrows only — so the rows of a group, drag handle included, sit inside it."
        },
        {
          "name": "getSubRows",
          "type": "((row: T) => T[] | undefined) | undefined",
          "required": false,
          "description": "Sub-row accessor for hierarchical/tree data (used with renderGroupRow)"
        },
        {
          "name": "showEmptyGroups",
          "type": "boolean | undefined",
          "required": false,
          "description": "Render a top-level row whose `getSubRows` returns an empty array as an\n(empty) group row instead of a plain row — for groups that stay visible\nwith nothing in them yet. Return `undefined` for rows that are not groups."
        },
        {
          "name": "expanded",
          "type": "TableExpandedState | undefined",
          "required": false
        },
        {
          "name": "onExpandedChange",
          "type": "complex",
          "required": false
        },
        {
          "name": "renderExpandedRow",
          "type": "((row: TableRow<T>) => ReactNode) | undefined",
          "required": false
        },
        {
          "name": "columnVisibility",
          "type": "TableVisibilityState | undefined",
          "required": false
        },
        {
          "name": "onColumnVisibilityChange",
          "type": "complex",
          "required": false
        },
        {
          "name": "defaultColumnVisibility",
          "type": "TableVisibilityState | undefined",
          "required": false
        },
        {
          "name": "defaultColumnOrder",
          "type": "string[] | undefined",
          "required": false
        },
        {
          "name": "columnGroups",
          "type": "TableColumnGroup[] | undefined",
          "required": false,
          "description": "Labeled sections for the column-settings menu. When set, the menu renders\nthese groups (flat, non-reorderable — like the FilterInput field menu)\ninstead of the default pinned/unpinned drag-reorder list. See\n{@link TableColumnGroup}."
        },
        {
          "name": "onSettingsOpenChange",
          "type": "((open: boolean) => void) | undefined",
          "required": false,
          "description": "Fired when the built-in column-settings menu opens (`true`) or closes\n(`false`). The menu's open state otherwise lives inside the DS and is not\nobservable, so consumers that want to defer expensive work — e.g. refetch\nonce with the final column selection instead of on every toggle — can hook\nthe close edge here."
        },
        {
          "name": "deferColumnVisibility",
          "type": "boolean | undefined",
          "required": false,
          "description": "Hold column-visibility toggles in the built-in settings menu until it\ncloses, then apply them as one `columnVisibility` change. Without it each\nswitch shows or hides its column at once — a column whose data the consumer\nonly fetches on close then sits empty while the menu is open."
        },
        {
          "name": "virtualized",
          "type": "TableVirtualized | undefined",
          "required": false,
          "description": "Enable row virtualization. `'container'` virtualizes within the table's own scroll container;\n`'window'` follows the page scroll — the nearest scrollable ancestor, or the browser window."
        },
        {
          "name": "stretch",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether columns stretch proportionally to fill the container width.\nWhen `false`, columns use their defined sizes and the table may be\nnarrower than its container.\n\nDefault: `true`."
        },
        {
          "name": "estimateRowHeight",
          "type": "((index: number) => number) | undefined",
          "required": false
        },
        {
          "name": "overscan",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "onEndReached",
          "type": "(() => void) | undefined",
          "required": false,
          "description": "Callback fired when the user scrolls near the end (bottom) of the table"
        },
        {
          "name": "onEndReachedThreshold",
          "type": "number | undefined",
          "required": false,
          "description": "Distance from the bottom (in px) to trigger onEndReached (default: 200)"
        },
        {
          "name": "onStartReached",
          "type": "(() => void) | undefined",
          "required": false,
          "description": "Callback fired when the user scrolls near the start (top) of the table"
        },
        {
          "name": "onStartReachedThreshold",
          "type": "number | undefined",
          "required": false,
          "description": "Distance from the top (in px) to trigger onStartReached (default: 200)"
        },
        {
          "name": "initialScrollToRowId",
          "type": "string | undefined",
          "required": false,
          "description": "Row id to anchor the initial scroll position to. The table scrolls this row\ninto view on mount and arms the edge detectors only after that initial\nscroll settles. Use for deep-linking into the middle of a dataset."
        },
        {
          "name": "onRowReorder",
          "type": "((event: TableRowReorderEvent) => void) | undefined",
          "required": false,
          "description": "Callback fired when a row is dragged to a new position. When provided,\na drag-handle column is auto-injected and row DnD is enabled.\nWith `getSubRows` grouping, group rows stay put and a row moves only\namong the rows of its own group."
        },
        {
          "name": "getRowCanDrag",
          "type": "((row: TableRow<T>) => boolean) | undefined",
          "required": false,
          "description": "Per-row drag control for `onRowReorder`. A row for which it returns\n`false` shows a disabled grip (none on a full-width row), cannot be dragged and is not a drop target — the\nother rows of its group move around it. Group rows never move regardless.\n\nDefault: every non-group row can be dragged."
        },
        {
          "name": "renderFullWidthRow",
          "type": "((row: TableRow<T>) => ReactNode) | undefined",
          "required": false,
          "description": "Renders a non-group row as a single cell spanning every data column — a\nbanner or notice row among regular rows. Return `undefined` to render the\nrow normally, with a cell per column. System cells (selection, drag\nhandle) keep their own cells. Pair with `getRowCanDrag` to keep such a row\nin place in a reorderable table.\n\nCalled on every render of the row: return elements, do not call hooks in\nthe callback itself (components it returns may)."
        },
        {
          "name": "onMasterCellClick",
          "type": "((rowId: string) => void) | undefined",
          "required": false,
          "description": "Callback fired when the master cell is clicked. Receives the row ID."
        },
        {
          "name": "activeRowId",
          "type": "string | null | undefined",
          "required": false,
          "description": "ID of the currently active (highlighted) row, or null. Controls row highlighting via data-preview-active attribute."
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "interactive",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        },
        {
          "name": "sorted",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        },
        {
          "name": "pinned",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        },
        {
          "name": "lastPinnedLeft",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        },
        {
          "name": "draggable",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        },
        {
          "name": "dragging",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        },
        {
          "name": "expanded",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        },
        {
          "name": "lastRow",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        },
        {
          "name": "virtualized",
          "options": [
            "container",
            "window"
          ]
        }
      ],
      "subComponents": [
        {
          "name": "BulkBarSummaryClear",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false,
              "defaultValue": "false"
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "BulkBarSummaryCount",
          "props": [
            {
              "name": "count",
              "type": "number | undefined",
              "required": false,
              "description": "Renders the default \"{count} selected\" label."
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "color",
              "type": "{ primary: string; 'primary-alt': string; secondary: string; 'secondary-alt': string; 'tertiary-alt': string; danger: string; inherit: string; }",
              "required": false,
              "defaultValue": "primary-alt"
            },
            {
              "name": "size",
              "type": "{ xs: string; sm: string; md: string; lg: string; xl: string; }",
              "required": false,
              "defaultValue": "sm"
            },
            {
              "name": "weight",
              "type": "{ light: string; regular: string; medium: string; bold: string; }",
              "required": false,
              "defaultValue": "medium"
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "BulkBarSummary",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "BulkBarSummarySelectAll",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false,
              "defaultValue": "false"
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "EditableSelectCell",
          "props": [
            {
              "name": "value",
              "type": "string | null",
              "required": true,
              "description": "Current committed value; `null` / `''` renders the placeholder."
            },
            {
              "name": "onCommit",
              "type": "(value: string) => void",
              "required": true,
              "description": "Called with the picked value when the selection changes."
            },
            {
              "name": "items",
              "type": "SelectDataItem[]",
              "required": true,
              "description": "Options for the dropdown."
            },
            {
              "name": "placeholder",
              "type": "ReactNode",
              "required": false,
              "description": "Shown when nothing is selected. Defaults to `'Select'`.",
              "defaultValue": "Select"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "EditableTextCell",
          "props": [
            {
              "name": "value",
              "type": "string",
              "required": true,
              "description": "Current committed value."
            },
            {
              "name": "onCommit",
              "type": "(value: string) => void",
              "required": true,
              "description": "Called with the new value on Enter / blur (only when it actually changed)."
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "TableActionBarSelection",
          "props": []
        },
        {
          "name": "TableColumnMenuHideItem",
          "props": [
            {
              "name": "inset",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "onSelect",
              "type": "(() => void) | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | undefined",
              "required": false,
              "description": "Explicit value for programmatic highlighting via highlightedValue"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "variant",
              "type": "{ default: string; brand: string; destructive: string; }",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "TableColumnMenuMoveLeftItem",
          "props": [
            {
              "name": "inset",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "onSelect",
              "type": "(() => void) | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | undefined",
              "required": false,
              "description": "Explicit value for programmatic highlighting via highlightedValue"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "variant",
              "type": "{ default: string; brand: string; destructive: string; }",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "TableColumnMenuMoveRightItem",
          "props": [
            {
              "name": "inset",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "onSelect",
              "type": "(() => void) | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | undefined",
              "required": false,
              "description": "Explicit value for programmatic highlighting via highlightedValue"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "variant",
              "type": "{ default: string; brand: string; destructive: string; }",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "TableColumnMenuPinItem",
          "props": [
            {
              "name": "inset",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "onSelect",
              "type": "(() => void) | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | undefined",
              "required": false,
              "description": "Explicit value for programmatic highlighting via highlightedValue"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "variant",
              "type": "{ default: string; brand: string; destructive: string; }",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "TableColumnMenu",
          "props": [
            {
              "name": "column",
              "type": "complex",
              "required": true,
              "description": "Column from the header render context."
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "TableColumnMenuSortItem",
          "props": [
            {
              "name": "direction",
              "type": "\"desc\" | \"asc\"",
              "required": true,
              "description": "Direction this item commits when selected."
            },
            {
              "name": "inset",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "onSelect",
              "type": "(() => void) | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | undefined",
              "required": false,
              "description": "Explicit value for programmatic highlighting via highlightedValue"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "variant",
              "type": "{ default: string; brand: string; destructive: string; }",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "TableScrollHandlerLeft",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "TableScrollHandler",
          "props": []
        },
        {
          "name": "TableScrollHandlerRight",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "TableSettingsMenuItem",
          "props": [
            {
              "name": "columnId",
              "type": "string",
              "required": true,
              "description": "Column id from the table's column definitions."
            },
            {
              "name": "label",
              "type": "string | undefined",
              "required": false,
              "description": "Specifies the localized strings that identifies the accessibility elements and their states"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false,
              "description": "The name of the input field in a switch\n(Useful for form submission)."
            },
            {
              "name": "value",
              "type": "string | number | undefined",
              "required": false,
              "description": "The value of switch input. Useful for form submission."
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "description": "Use the provided child element as the default rendered element, combining their props and behavior."
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "ids",
              "type": "ElementIds | undefined",
              "required": false,
              "description": "The ids of the elements in the switch. Useful for composition."
            },
            {
              "name": "readOnly",
              "type": "boolean | undefined",
              "required": false,
              "description": "Whether the switch is read-only"
            },
            {
              "name": "required",
              "type": "boolean | undefined",
              "required": false,
              "description": "If `true`, the switch input is marked as required,"
            },
            {
              "name": "htmlFor",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "invalid",
              "type": "boolean | undefined",
              "required": false,
              "description": "If `true`, the switch is marked as invalid."
            },
            {
              "name": "a11yMode",
              "type": "boolean | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "TableSettingsMenu",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "TableSettingsMenuReset",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "TableSettingsMenuSearch",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "pattern",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "alt",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "height",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "src",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "width",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "autoComplete",
              "type": "HTMLInputAutoCompleteAttribute | undefined",
              "required": false
            },
            {
              "name": "maxLength",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "minLength",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "placeholder",
              "type": "string | undefined",
              "required": false,
              "defaultValue": "Search"
            },
            {
              "name": "readOnly",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "required",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "checked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "step",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "accept",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "max",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "min",
              "type": "string | number | undefined",
              "required": false
            },
            {
              "name": "multiple",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "TableSortTrigger",
          "props": [
            {
              "name": "column",
              "type": "complex",
              "required": true,
              "description": "Column from the header render context — wires the trigger to TanStack's\nsort state. Pass `header.column` directly:\n\n```tsx\nheader: ({ column }) => (\n  <TableSortTrigger column={column} data-analytics-id='users.sort.name'>\n    Name\n  </TableSortTrigger>\n)\n```"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Basic",
          "code": "import { useState } from 'react';\nimport { Table, type TableSortingState } from '@wallarm-org/design-system/Table';\nimport { securityColumns, securityEvents } from './mocks';\n\nexport const Basic = () => {\n  const [sorting, setSorting] = useState<TableSortingState>([{ id: 'firstDetected', desc: true }]);\n\n  return (\n    <Table\n      data={securityEvents}\n      columns={securityColumns}\n      getRowId={row => row.id}\n      sorting={sorting}\n      onSortingChange={setSorting}\n    />\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "description": "The minimum — `data`, `columns`, `getRowId` and a column to open sorted on. The header stays\nput as the body scrolls."
        },
        {
          "name": "NoStretch",
          "code": "import { Table, type TableColumnDef } from '@wallarm-org/design-system/Table';\nimport { type SecurityEvent, securityColumnHelper, securityEvents } from './mocks';\n\nexport const NoStretch = () => {\n  const narrowColumns: TableColumnDef<SecurityEvent>[] = [\n    securityColumnHelper.accessor('objectName', {\n      header: 'Object name',\n      size: 200,\n    }),\n    securityColumnHelper.accessor('status', {\n      header: 'Status',\n      size: 120,\n    }),\n    securityColumnHelper.accessor('requests', {\n      header: 'Requests',\n      size: 100,\n    }),\n  ];\n\n  return (\n    <Table data={securityEvents} columns={narrowColumns} getRowId={row => row.id} stretch={false} />\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "description": "`stretch={false}` — columns keep their defined widths and do not expand to fill the container.\nEmpty space appears on the right when the total column width is less than the container width."
        },
        {
          "name": "WithPagination",
          "code": "import { useMemo } from 'react';\nimport { Pagination, PaginationList, PaginationNext, PaginationPageSize, PaginationPrevious, useClientPagination } from '@wallarm-org/design-system/Pagination';\nimport { VStack } from '@wallarm-org/design-system/Stack';\nimport { Table } from '@wallarm-org/design-system/Table';\nimport { createLargeSecurityEvents, securityColumns } from './mocks';\n\nexport const WithPagination = () => {\n  const allData = useMemo(() => createLargeSecurityEvents(47), []);\n  const { pageData, ...pagination } = useClientPagination(allData, 10);\n\n  return (\n    <VStack gap={12}>\n      <Table data={pageData} columns={securityColumns} getRowId={row => row.id} />\n      <Pagination {...pagination} align='right' aria-label='Security events'>\n        <PaginationPageSize options={[10, 25, 50]} />\n        <PaginationPrevious />\n        <PaginationList />\n        <PaginationNext />\n      </Pagination>\n    </VStack>\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "description": "`useClientPagination` slices the rows and the pager sits right-aligned below the table,\nsharing its footer with the rows-per-page control."
        },
        {
          "name": "Sorting",
          "code": "import { useState } from 'react';\nimport { Table, type TableSortingState } from '@wallarm-org/design-system/Table';\nimport { securityColumns, securityEvents } from './mocks';\n\nexport const Sorting = () => {\n  const [sorting, setSorting] = useState<TableSortingState>([]);\n\n  return (\n    <Table\n      data={securityEvents}\n      columns={securityColumns}\n      getRowId={row => row.id}\n      sorting={sorting}\n      onSortingChange={setSorting}\n    />\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "description": "Sorting held in state, so the arrow and the row order are the same fact — click a header to\ncycle through the directions."
        },
        {
          "name": "ManualSorting",
          "code": "import { useMemo, useState } from 'react';\nimport { Table, type TableSortingState } from '@wallarm-org/design-system/Table';\nimport { securityColumns } from './mocks';\n\nexport const ManualSorting = () => {\n  const [sorting, setSorting] = useState<TableSortingState>([]);\n  const data = useMemo(() => sortSecurityEvents(sorting), [sorting]);\n\n  return (\n    <Table\n      data={data}\n      columns={securityColumns}\n      getRowId={row => row.id}\n      sorting={sorting}\n      onSortingChange={setSorting}\n      manualSorting\n      data-testid='manual-sort-table'\n    />\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "description": "`manualSorting` stops the table sorting anything itself: it only reports the change, and the\nstory re-derives `data` the way a refetch would."
        },
        {
          "name": "WithAnalytics",
          "code": "import { useCallback, useMemo, useState } from 'react';\nimport { BulkBarSummaryClear, BulkBarSummaryCount, BulkBarSummarySelectAll, BulkBarSummarySeparator } from '@wallarm-org/design-system/BulkBar';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuItemIcon, DropdownMenuItemText, DropdownMenuSeparator, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { Copy, Ellipsis, Filter, FilterX, Trash2 } from '@wallarm-org/design-system/icons';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\nimport { Table, TableActionBar, TableActionBarSelection, TableColumnMenu, TableColumnMenuHideItem, TableColumnMenuMoveLeftItem, TableColumnMenuMoveRightItem, TableColumnMenuPinItem, TableColumnMenuSortItem, TableScrollHandler, TableScrollHandlerLeft, TableScrollHandlerRight, TableSortTrigger, type TableColumnDef, type TableColumnPinningState, type TableColumnSizingState, type TableExpandedState, type TableRowSelectionState, type TableSortingState, type TableVisibilityState } from '@wallarm-org/design-system/Table';\nimport { Text } from '@wallarm-org/design-system/Text';\nimport { type SecurityEvent, securityColumnHelper, securityEvents } from './mocks';\n\nexport const WithAnalytics = () => {\n  const [sorting, setSorting] = useState<TableSortingState>([]);\n  const [rowSelection, setRowSelection] = useState<TableRowSelectionState>({});\n  const [expanded, setExpanded] = useState<TableExpandedState>({});\n  const [columnVisibility, setColumnVisibility] = useState<TableVisibilityState>({});\n  const [columnOrder, setColumnOrder] = useState<string[]>([]);\n  const [columnPinning, setColumnPinning] = useState<TableColumnPinningState>({});\n  const [columnSizing, setColumnSizing] = useState<TableColumnSizingState>({});\n\n  // Pretend SDK call — every analytics signal in this story funnels through\n  // it so the Storybook actions panel shows one consistent stream.\n  const track = useCallback(\n    (event: string, props?: Record<string, unknown>) =>\n      // biome-ignore lint/suspicious/noConsole: demo story stand-in for an SDK call\n      console.info('[analytics]', event, props ?? {}),\n    [],\n  );\n\n  const columnsWithAnalytics = useMemo<TableColumnDef<SecurityEvent>[]>(\n    () => [\n      // Master column — sortable header, link cell with analytics, per-row\n      // menu action with analytics on every menu item.\n      securityColumnHelper.accessor('objectName', {\n        header: ({ column }) => (\n          <TableSortTrigger\n            column={column}\n            data-analytics-id='SECURITY_SORT_OBJECT_NAME'\n            data-analytics-props='{\"surface\":\"events-table\"}'\n          >\n            Object name\n          </TableSortTrigger>\n        ),\n        size: 320,\n        enableSorting: true,\n        meta: {\n          sortType: 'text' as const,\n          resizeType: 'cut' as const,\n          renderMenuAction: row => (\n            <DropdownMenu>\n              <DropdownMenuTrigger asChild>\n                <Button\n                  variant='ghost'\n                  color='neutral'\n                  size='small'\n                  aria-label='Row actions'\n                  data-analytics-id='SECURITY_ROW_MENU_OPEN'\n                  data-analytics-props={`{\"rowId\":\"${row.original.id}\"}`}\n                >\n                  <Ellipsis />\n                </Button>\n              </DropdownMenuTrigger>\n              <DropdownMenuContent>\n                <DropdownMenuItem\n                  data-analytics-id='SECURITY_ROW_COPY_NAME'\n                  data-analytics-props={`{\"rowId\":\"${row.original.id}\"}`}\n                  onSelect={() => navigator.clipboard.writeText(row.original.objectName)}\n                >\n                  <DropdownMenuItemIcon>\n                    <Copy />\n                  </DropdownMenuItemIcon>\n                  <DropdownMenuItemText>Copy name</DropdownMenuItemText>\n                </DropdownMenuItem>\n                <DropdownMenuSeparator />\n                <DropdownMenuItem\n                  data-analytics-id='SECURITY_ROW_FILTER'\n                  data-analytics-props={`{\"rowId\":\"${row.original.id}\"}`}\n                  onSelect={() => track('SECURITY_ROW_FILTER_APPLIED', { rowId: row.original.id })}\n                >\n                  <DropdownMenuItemIcon>\n                    <Filter />\n                  </DropdownMenuItemIcon>\n                  <DropdownMenuItemText>Show only</DropdownMenuItemText>\n                </DropdownMenuItem>\n                <DropdownMenuItem\n                  data-analytics-id='SECURITY_ROW_EXCLUDE'\n                  data-analytics-props={`{\"rowId\":\"${row.original.id}\"}`}\n                  onSelect={() => track('SECURITY_ROW_EXCLUDE_APPLIED', { rowId: row.original.id })}\n                >\n                  <DropdownMenuItemIcon>\n                    <FilterX />\n                  </DropdownMenuItemIcon>\n                  <DropdownMenuItemText>Exclude</DropdownMenuItemText>\n                </DropdownMenuItem>\n              </DropdownMenuContent>\n            </DropdownMenu>\n          ),\n        },\n        cell: ({ row }) => (\n          <a\n            href={`#/events/${row.original.id}`}\n            data-analytics-id='SECURITY_ROW_OPEN'\n            data-analytics-props={`{\"rowId\":\"${row.original.id}\"}`}\n          >\n            {row.original.objectName}\n          </a>\n        ),\n      }),\n      // Other sortable columns — each one declares its own sort target.\n      securityColumnHelper.accessor('requests', {\n        header: ({ column }) => (\n          <TableSortTrigger column={column} data-analytics-id='SECURITY_SORT_REQUESTS'>\n            Requests\n          </TableSortTrigger>\n        ),\n        size: 140,\n        enableSorting: true,\n      }),\n      securityColumnHelper.accessor('sourceIp', {\n        header: ({ column }) => (\n          <TableSortTrigger column={column} data-analytics-id='SECURITY_SORT_SOURCE_IP'>\n            Source\n          </TableSortTrigger>\n        ),\n        size: 180,\n        enableSorting: true,\n        meta: { sortType: 'text' as const },\n      }),\n      // Status column — demonstrates the column header menu seam with\n      // per-item analytics, rendered as a sibling of the sort trigger inside\n      // a Fragment.\n      securityColumnHelper.accessor('status', {\n        header: ({ column }) => (\n          <>\n            <TableSortTrigger column={column} data-analytics-id='SECURITY_SORT_STATUS'>\n              Status\n            </TableSortTrigger>\n            <TableColumnMenu column={column} data-analytics-id='SECURITY_COLMENU_STATUS'>\n              <TableColumnMenuSortItem\n                direction='asc'\n                data-analytics-id='SECURITY_COLMENU_STATUS_SORT_ASC'\n              />\n              <TableColumnMenuSortItem\n                direction='desc'\n                data-analytics-id='SECURITY_COLMENU_STATUS_SORT_DESC'\n              />\n              <TableColumnMenuPinItem data-analytics-id='SECURITY_COLMENU_STATUS_PIN' />\n              <TableColumnMenuHideItem data-analytics-id='SECURITY_COLMENU_STATUS_HIDE' />\n              <TableColumnMenuMoveLeftItem data-analytics-id='SECURITY_COLMENU_STATUS_MOVE_LEFT' />\n              <TableColumnMenuMoveRightItem data-analytics-id='SECURITY_COLMENU_STATUS_MOVE_RIGHT' />\n            </TableColumnMenu>\n          </>\n        ),\n        size: 130,\n        enableSorting: true,\n        meta: { sortType: 'text' as const, resizeType: 'cut' as const },\n      }),\n      securityColumnHelper.accessor('firstDetected', {\n        header: ({ column }) => (\n          <TableSortTrigger column={column} data-analytics-id='SECURITY_SORT_FIRST_DETECTED'>\n            First detected\n          </TableSortTrigger>\n        ),\n        size: 160,\n        enableSorting: true,\n        meta: { sortType: 'date' as const, resizeType: 'cut' as const },\n      }),\n    ],\n    [track],\n  );\n\n  return (\n    <Table\n      data-testid='security-events-table'\n      data={securityEvents}\n      columns={columnsWithAnalytics}\n      getRowId={row => row.id}\n      // Sort: DOM seam on the icon (TableSortTrigger) + callback for direction.\n      sorting={sorting}\n      onSortingChange={updater => {\n        setSorting(prev => {\n          const next = typeof updater === 'function' ? updater(prev) : updater;\n          track('SECURITY_TABLE_SORT_CHANGED', { columnId: next[0]?.id, desc: !!next[0]?.desc });\n          return next;\n        });\n      }}\n      // Selection / expand / settings menu — no DOM seam yet; callbacks carry\n      // the resulting state.\n      rowSelection={rowSelection}\n      onRowSelectionChange={updater => {\n        setRowSelection(prev => {\n          const next = typeof updater === 'function' ? updater(prev) : updater;\n          track('SECURITY_TABLE_SELECTION_CHANGED', { selectedIds: Object.keys(next) });\n          return next;\n        });\n      }}\n      expanded={expanded}\n      onExpandedChange={updater => {\n        setExpanded(prev => {\n          const next = typeof updater === 'function' ? updater(prev) : updater;\n          track('SECURITY_TABLE_EXPAND_CHANGED', { state: next });\n          return next;\n        });\n      }}\n      columnVisibility={columnVisibility}\n      onColumnVisibilityChange={updater => {\n        setColumnVisibility(prev => {\n          const next = typeof updater === 'function' ? updater(prev) : updater;\n          track('SECURITY_TABLE_COLUMNS_VISIBILITY_CHANGED', next);\n          return next;\n        });\n      }}\n      columnOrder={columnOrder}\n      onColumnOrderChange={updater => {\n        setColumnOrder(prev => {\n          const next = typeof updater === 'function' ? updater(prev) : updater;\n          track('SECURITY_TABLE_COLUMNS_REORDERED', { order: next });\n          return next;\n        });\n      }}\n      columnPinning={columnPinning}\n      onColumnPinningChange={updater => {\n        setColumnPinning(prev => {\n          const next = typeof updater === 'function' ? updater(prev) : updater;\n          track('SECURITY_TABLE_COLUMNS_PINNED', next);\n          return next;\n        });\n      }}\n      columnSizing={columnSizing}\n      onColumnSizingChange={updater => {\n        setColumnSizing(prev => {\n          const next = typeof updater === 'function' ? updater(prev) : updater;\n          track('SECURITY_TABLE_COLUMN_RESIZED', next);\n          return next;\n        });\n      }}\n      onMasterCellClick={rowId => track('SECURITY_TABLE_MASTER_CELL_CLICKED', { rowId })}\n      renderExpandedRow={row => (\n        <div className='p-16 bg-states-primary-default-alt rounded-8'>\n          <HStack justify='between' align='center'>\n            <VStack gap={2}>\n              <Text size='xs' color='secondary'>\n                Source IP\n              </Text>\n              <Text size='sm'>{row.original.sourceIp}</Text>\n            </VStack>\n            <Button\n              variant='outline'\n              color='neutral'\n              size='small'\n              data-analytics-id='SECURITY_EXPANDED_VIEW_DETAILS'\n              data-analytics-props={`{\"rowId\":\"${row.original.id}\"}`}\n              onClick={() =>\n                track('SECURITY_EXPANDED_VIEW_DETAILS_CLICKED', { rowId: row.original.id })\n              }\n            >\n              View full details\n            </Button>\n          </HStack>\n        </div>\n      )}\n    >\n      <TableActionBar>\n        {/*\n          Selection summary — override the default block to attach analytics to\n          the \"Select all\" / \"Clear\" controls. The DS keeps the wiring (toggle /\n          reset, disabled, count); the consumer onClick runs first and feeds the\n          same `track` stream (call preventDefault() to skip the DS action).\n        */}\n        <TableActionBarSelection>\n          <BulkBarSummaryCount />\n          <BulkBarSummarySelectAll\n            data-analytics-id='SECURITY_BULK_SELECT_ALL'\n            onClick={() => track('SECURITY_BULK_SELECT_ALL_CLICKED')}\n          />\n          <BulkBarSummarySeparator />\n          <BulkBarSummaryClear\n            data-analytics-id='SECURITY_BULK_CLEAR'\n            onClick={() => track('SECURITY_BULK_CLEAR_CLICKED')}\n          />\n        </TableActionBarSelection>\n\n        <Button\n          variant='ghost'\n          color='neutral-alt'\n          data-analytics-id='SECURITY_BULK_DUPLICATE'\n          data-analytics-props={`{\"count\":${Object.keys(rowSelection).length}}`}\n          onClick={() =>\n            track('SECURITY_BULK_DUPLICATE_CLICKED', {\n              selectedIds: Object.keys(rowSelection),\n            })\n          }\n        >\n          <Copy /> Duplicate\n        </Button>\n        <Button\n          color='brand'\n          data-analytics-id='SECURITY_BULK_DELETE'\n          data-analytics-props={`{\"count\":${Object.keys(rowSelection).length}}`}\n          onClick={() =>\n            track('SECURITY_BULK_DELETE_CLICKED', {\n              selectedIds: Object.keys(rowSelection),\n            })\n          }\n        >\n          <Trash2 /> Delete\n        </Button>\n      </TableActionBar>\n\n      <TableScrollHandler>\n        <TableScrollHandlerLeft data-analytics-id='SECURITY_SCROLL_LEFT' />\n        <TableScrollHandlerRight data-analytics-id='SECURITY_SCROLL_RIGHT' />\n      </TableScrollHandler>\n    </Table>\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "description": "Every analytics seam at once — `TableSortTrigger`, `TableColumnMenu` and each of its items,\nthe action bar, the scroll handlers — plus the state callbacks, which carry the resulting\nsort, selection and column layout rather than just a click."
        },
        {
          "name": "LoadingState",
          "code": "import { Table } from '@wallarm-org/design-system/Table';\nimport { securityColumns } from './mocks';\n\nexport const LoadingState = () => (\n  <Table data={[]} columns={securityColumns} isLoading />\n);",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "description": "`isLoading` with nothing to show yet: skeleton rows under a real header, so the columns do\nnot jump when the data lands."
        },
        {
          "name": "LoadingWithData",
          "code": "import { Table } from '@wallarm-org/design-system/Table';\nimport { securityColumns, securityEvents } from './mocks';\n\nexport const LoadingWithData = () => (\n  <Table\n    className='h-500'\n    data={securityEvents}\n    columns={securityColumns}\n    getRowId={row => row.id}\n    isLoading\n  />\n);",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "description": "The same flag with rows already present appends the skeletons below them — this is the shape\nfor fetching the next batch, not for replacing what is on screen."
        },
        {
          "name": "EmptyCollection",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { EmptyState, EmptyStateActions, EmptyStateDescription, EmptyStateIllustration, EmptyStateMessage, EmptyStateTitle } from '@wallarm-org/design-system/EmptyState';\nimport { Database } from '@wallarm-org/design-system/icons';\nimport { Table, TableEmptyState } from '@wallarm-org/design-system/Table';\nimport { securityColumns } from './mocks';\n\nexport const EmptyCollection = () => (\n  <Table data={[]} columns={securityColumns} getRowId={row => row.id}>\n    <TableEmptyState>\n      <EmptyState type='collection-empty'>\n        <EmptyStateIllustration>\n          <Database />\n        </EmptyStateIllustration>\n        <EmptyStateMessage>\n          <EmptyStateTitle>No events yet</EmptyStateTitle>\n          <EmptyStateDescription>\n            Security events will appear here as soon as Wallarm detects traffic.\n          </EmptyStateDescription>\n        </EmptyStateMessage>\n        <EmptyStateActions>\n          <Button size='medium'>Configure source</Button>\n        </EmptyStateActions>\n      </EmptyState>\n    </TableEmptyState>\n  </Table>\n);",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "description": "`TableEmptyState` holding an `EmptyState` of `type='collection-empty'`: nothing exists yet,\nso the action creates the first thing."
        },
        {
          "name": "NoResults",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { EmptyState, EmptyStateActions, EmptyStateDescription, EmptyStateIllustration, EmptyStateMessage, EmptyStateTitle } from '@wallarm-org/design-system/EmptyState';\nimport { FilterX, SearchX } from '@wallarm-org/design-system/icons';\nimport { Table, TableEmptyState } from '@wallarm-org/design-system/Table';\nimport { securityColumns } from './mocks';\n\nexport const NoResults = () => (\n  <Table data={[]} columns={securityColumns} getRowId={row => row.id}>\n    <TableEmptyState>\n      <EmptyState type='collection-empty'>\n        <EmptyStateIllustration>\n          <SearchX />\n        </EmptyStateIllustration>\n        <EmptyStateMessage>\n          <EmptyStateTitle>No results found</EmptyStateTitle>\n          <EmptyStateDescription>\n            No events match your current filters. Try adjusting or resetting them.\n          </EmptyStateDescription>\n        </EmptyStateMessage>\n        <EmptyStateActions>\n          <Button size='medium' variant='outline' color='neutral'>\n            <FilterX />\n            Reset filters\n          </Button>\n        </EmptyStateActions>\n      </EmptyState>\n    </TableEmptyState>\n  </Table>\n);",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "description": "When data exists but the current filters or search matched nothing, stay at\nthe `collection-empty` scale — a table body is a page-level surface, and\n`no-results` is the compact treatment for a card or menu. What changes is the\naction: a neutral one that clears the filters, never a primary \"create\"."
        },
        {
          "name": "ColumnResizing",
          "code": "import { useState } from 'react';\nimport { Table, type TableColumnSizingState } from '@wallarm-org/design-system/Table';\nimport { securityColumns, securityEvents } from './mocks';\n\nexport const ColumnResizing = () => {\n  const [columnSizing, setColumnSizing] = useState<TableColumnSizingState>({});\n\n  return (\n    <Table\n      data={securityEvents}\n      columns={securityColumns}\n      getRowId={row => row.id}\n      columnSizing={columnSizing}\n      onColumnSizingChange={setColumnSizing}\n    />\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "description": "Drag a header edge to resize. `columnSizing` is state like everything else, so a width can\nbe remembered between visits."
        },
        {
          "name": "ColumnResizingWithOverflowList",
          "code": "import { useMemo, useState } from 'react';\nimport { OverflowList } from '@wallarm-org/design-system/OverflowList';\nimport { Table, type TableColumnDef, type TableColumnSizingState } from '@wallarm-org/design-system/Table';\nimport { Tag } from '@wallarm-org/design-system/Tag';\nimport { type SecurityEvent, securityColumnHelper, securityColumns, securityEvents } from './mocks';\n\nexport const ColumnResizingWithOverflowList = () => {\n  const [columnSizing, setColumnSizing] = useState<TableColumnSizingState>({});\n\n  const columns = useMemo<TableColumnDef<SecurityEvent>[]>(\n    () => [\n      ...securityColumns.slice(0, 1),\n      securityColumnHelper.display({\n        id: 'tags',\n        header: 'Tags',\n        size: 240,\n        cell: ({ row }) => (\n          <OverflowList\n            data-testid='tags-overflow-list'\n            className='gap-4'\n            items={row.original.tags}\n            itemRenderer={(item: string) => (\n              <Tag key={item} data-testid='tag'>\n                {item}\n              </Tag>\n            )}\n          />\n        ),\n      }),\n      ...securityColumns.slice(1),\n    ],\n    [],\n  );\n\n  return (\n    <Table\n      data={securityEvents}\n      columns={columns}\n      getRowId={row => row.id}\n      columnSizing={columnSizing}\n      onColumnSizingChange={setColumnSizing}\n      data-testid='resizing-overflow-table'\n    />\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "description": "A resizable column whose cell holds an `OverflowList`: the tags re-measure as the column\nnarrows instead of being clipped by it."
        },
        {
          "name": "ColumnResizingWithPinning",
          "code": "import { useState } from 'react';\nimport { Table, type TableColumnPinningState, type TableColumnSizingState } from '@wallarm-org/design-system/Table';\nimport { securityColumns, securityEvents } from './mocks';\n\nexport const ColumnResizingWithPinning = () => {\n  const [columnSizing, setColumnSizing] = useState<TableColumnSizingState>({});\n  const [columnPinning, setColumnPinning] = useState<TableColumnPinningState>({\n    left: ['objectName'],\n  });\n\n  return (\n    <Table\n      className='max-w-920'\n      data={securityEvents}\n      columns={securityColumns}\n      getRowId={row => row.id}\n      columnSizing={columnSizing}\n      onColumnSizingChange={setColumnSizing}\n      columnPinning={columnPinning}\n      onColumnPinningChange={setColumnPinning}\n    />\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "description": "Resizing alongside a pinned column — the pinned one holds its position while the rest of the\nrow moves underneath it."
        },
        {
          "name": "ColumnPinning",
          "code": "import { useState } from 'react';\nimport { Table, type TableColumnPinningState } from '@wallarm-org/design-system/Table';\nimport { securityColumns, securityEvents } from './mocks';\n\nexport const ColumnPinning = () => {\n  const [columnPinning, setColumnPinning] = useState<TableColumnPinningState>({\n    left: ['objectName'],\n  });\n\n  return (\n    <Table\n      className='max-w-920'\n      data={securityEvents}\n      columns={securityColumns}\n      getRowId={row => row.id}\n      columnPinning={columnPinning}\n      onColumnPinningChange={setColumnPinning}\n    />\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "description": "`columnPinning` freezes a column to the left, so the name of the thing stays readable\nhowever far sideways the table scrolls."
        },
        {
          "name": "ColumnDragAndDrop",
          "code": "import { useState } from 'react';\nimport { Table } from '@wallarm-org/design-system/Table';\nimport { securityColumns, securityEvents } from './mocks';\n\nexport const ColumnDragAndDrop = () => {\n  const [columnOrder, setColumnOrder] = useState<string[]>([]);\n\n  return (\n    <Table\n      data={securityEvents}\n      columns={securityColumns}\n      getRowId={row => row.id}\n      columnOrder={columnOrder}\n      onColumnOrderChange={setColumnOrder}\n    />\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "description": "Drag a header to reorder the columns. `columnOrder` is the same state the settings menu\nwrites, so the two never disagree."
        },
        {
          "name": "ColumnHeaderMenu",
          "code": "import { useState } from 'react';\nimport { Table, type TableColumnPinningState, type TableSortingState, type TableVisibilityState } from '@wallarm-org/design-system/Table';\nimport { securityColumns, securityEvents } from './mocks';\n\nexport const ColumnHeaderMenu = () => {\n  const [sorting, setSorting] = useState<TableSortingState>([]);\n  const [columnVisibility, setColumnVisibility] = useState<TableVisibilityState>({});\n  const [columnPinning, setColumnPinning] = useState<TableColumnPinningState>({});\n  const [columnOrder, setColumnOrder] = useState<string[]>([]);\n\n  return (\n    <Table\n      data={securityEvents}\n      columns={securityColumns}\n      getRowId={row => row.id}\n      sorting={sorting}\n      onSortingChange={setSorting}\n      columnVisibility={columnVisibility}\n      onColumnVisibilityChange={setColumnVisibility}\n      columnPinning={columnPinning}\n      onColumnPinningChange={setColumnPinning}\n      columnOrder={columnOrder}\n      onColumnOrderChange={setColumnOrder}\n    />\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "description": "The per-column menu that appears on hover — sort, pin, hide, move — which is where the\ncolumn controls live once a header is too narrow to show them."
        },
        {
          "name": "RowSelection",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Copy, Trash2 } from '@wallarm-org/design-system/icons';\nimport { Table, TableActionBar, type TableRowSelectionState } from '@wallarm-org/design-system/Table';\nimport { securityColumns, securityEvents } from './mocks';\n\nexport const RowSelection = () => {\n  const [rowSelection, setRowSelection] = useState<TableRowSelectionState>({});\n\n  return (\n    <Table\n      data={securityEvents}\n      columns={securityColumns}\n      getRowId={row => row.id}\n      rowSelection={rowSelection}\n      onRowSelectionChange={setRowSelection}\n    >\n      <TableActionBar>\n        <Button variant='ghost' color='neutral-alt' onClick={onDuplicate}>\n          <Copy /> Duplicate\n        </Button>\n        <Button color='brand' onClick={onDelete}>\n          <Trash2 /> Delete\n        </Button>\n      </TableActionBar>\n    </Table>\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "description": "Checkboxes plus `TableActionBar`, which rises from the bottom once a row is ticked and\ncarries the verbs that apply to the whole selection."
        },
        {
          "name": "SelectAllRowsGesture",
          "code": "import { useState } from 'react';\nimport { BulkBarSummaryClear, BulkBarSummaryCount } from '@wallarm-org/design-system/BulkBar';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Trash2 } from '@wallarm-org/design-system/icons';\nimport { Table, TableActionBar, TableActionBarSelection, type TableRowSelectionState } from '@wallarm-org/design-system/Table';\nimport { securityColumns, securityEvents } from './mocks';\n\nexport const SelectAllRowsGesture = () => {\n  const [rowSelection, setRowSelection] = useState<TableRowSelectionState>({});\n  const [filterWide, setFilterWide] = useState(false);\n  const MATCHING_THE_FILTER = 1474;\n\n  const selectedCount = filterWide ? MATCHING_THE_FILTER : Object.keys(rowSelection).length;\n\n  return (\n    <Table\n      data={securityEvents}\n      columns={securityColumns}\n      getRowId={row => row.id}\n      rowSelection={rowSelection}\n      onRowSelectionChange={updater => {\n        setRowSelection(updater);\n        // \"Everything matching the filter, minus this one row\" is not a filter,\n        // so any hand-made change falls back to the explicit list.\n        setFilterWide(false);\n      }}\n      onSelectAllRows={setFilterWide}\n    >\n      <TableActionBar>\n        <TableActionBarSelection>\n          <BulkBarSummaryCount>\n            {selectedCount} {selectedCount === 1 ? 'event' : 'events'} selected\n          </BulkBarSummaryCount>\n          <BulkBarSummaryClear />\n        </TableActionBarSelection>\n        <Button color='brand' onClick={onDelete}>\n          <Trash2 /> Delete\n        </Button>\n      </TableActionBar>\n    </Table>\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "description": "`onSelectAllRows` separates the master checkbox from a hand-made full selection, which the\nrow state alone cannot tell apart. Here the gesture means \"every row matching the filter\",\nincluding the ones the server has not sent — so the bar jumps to the filter's total, and any\nmanual change drops back to the rows actually loaded."
        },
        {
          "name": "SelectAllRowsDisabled",
          "code": "import { useState } from 'react';\nimport { Table, type TableRowSelectionState } from '@wallarm-org/design-system/Table';\nimport { securityColumns, securityEvents } from './mocks';\n\nexport const SelectAllRowsDisabled = () => {\n  const [rowSelection, setRowSelection] = useState<TableRowSelectionState>({});\n\n  return (\n    <Table\n      data={securityEvents}\n      columns={securityColumns}\n      getRowId={row => row.id}\n      rowSelection={rowSelection}\n      onRowSelectionChange={setRowSelection}\n      enableSelectAllRows={false}\n    />\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "description": "`enableSelectAllRows={false}` drops the master checkbox while keeping the column, for a\nlisting where \"all rows\" is not a scope the consumer can act on. Per-row checkboxes stay,\nshift-click range selection included."
        },
        {
          "name": "RowSelectionWindowScroll",
          "code": "import { useMemo, useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Copy, Trash2 } from '@wallarm-org/design-system/icons';\nimport { Table, TableActionBar, type TableRowSelectionState } from '@wallarm-org/design-system/Table';\nimport { createLargeSecurityEvents, securityColumns } from './mocks';\n\nexport const RowSelectionWindowScroll = () => {\n  const largeData = useMemo(() => createLargeSecurityEvents(100), []);\n  const [rowSelection, setRowSelection] = useState<TableRowSelectionState>({});\n\n  return (\n    <>\n      <Table\n        data-testid='row-selection-window-scroll-table'\n        data={largeData}\n        columns={securityColumns}\n        getRowId={row => row.id}\n        virtualized='window'\n        rowSelection={rowSelection}\n        onRowSelectionChange={setRowSelection}\n      >\n        <TableActionBar>\n          <Button variant='ghost' color='neutral-alt' onClick={onDuplicate}>\n            <Copy /> Duplicate\n          </Button>\n          <Button color='brand' onClick={onDelete}>\n            <Trash2 /> Delete\n          </Button>\n        </TableActionBar>\n      </Table>\n      {/* Filler so the e2e suite can scroll the table fully out of view while a\n          selection stays active — this story's only content otherwise fills\n          exactly to the table's own height, so max scroll would always leave\n          the table's tail in view. Generous margin over the viewport height\n          (800px in the e2e config) so the anchor is unambiguously out of view\n          at max scroll, not just mostly. */}\n      <div style={{ height: 3000 }} />\n    </>\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "tags": [
            "!autodocs"
          ],
          "description": "A selection that outlives the table scrolling away: under `virtualized='window'` the bar is\npinned to the viewport rather than to the table."
        },
        {
          "name": "RowGrouping",
          "code": "import { useState } from 'react';\nimport { Table, type TableExpandedState, type TableRowSelectionState, type TableSortingState } from '@wallarm-org/design-system/Table';\nimport { groupedHeaderData, headerColumns, type SecurityHeaderEntry } from './mocks';\n\nexport const RowGrouping = () => {\n  const [expanded, setExpanded] = useState<TableExpandedState>({ 'group-cto': true });\n  const [sorting, setSorting] = useState<TableSortingState>([{ id: 'lastEdited', desc: true }]);\n  const [rowSelection, setRowSelection] = useState<TableRowSelectionState>({});\n\n  return (\n    <Table<SecurityHeaderEntry>\n      data={groupedHeaderData}\n      columns={headerColumns}\n      getRowId={row => row.id}\n      getSubRows={row => row.children}\n      expanded={expanded}\n      onExpandedChange={setExpanded}\n      sorting={sorting}\n      onSortingChange={setSorting}\n      rowSelection={rowSelection}\n      onRowSelectionChange={setRowSelection}\n    />\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "description": "`getSubRows` turns flat data into groups — each group row counts its children and collapses\nthem, keyed in the same `expanded` state a row detail uses."
        },
        {
          "name": "RowExpanding",
          "code": "import { useState } from 'react';\nimport { HttpMethod } from '@wallarm-org/design-system/HttpMethod';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\nimport { Table, type TableExpandedState } from '@wallarm-org/design-system/Table';\nimport { Text } from '@wallarm-org/design-system/Text';\nimport { securityColumns, securityEvents } from './mocks';\n\nexport const RowExpanding = () => {\n  const [expanded, setExpanded] = useState<TableExpandedState>({});\n\n  return (\n    <Table\n      data={securityEvents}\n      columns={securityColumns}\n      getRowId={row => row.id}\n      expanded={expanded}\n      onExpandedChange={setExpanded}\n      renderExpandedRow={row => (\n        <div className='p-16 bg-states-primary-default-alt rounded-8'>\n          <Text size='sm' weight='medium'>\n            Event Details\n          </Text>\n          <div className='grid grid-cols-3 gap-8 mt-8'>\n            <VStack gap={2}>\n              <Text size='xs' color='secondary'>\n                Source IP\n              </Text>\n              <Text size='sm'>{row.original.sourceIp}</Text>\n            </VStack>\n            <VStack gap={2}>\n              <Text size='xs' color='secondary'>\n                Provider\n              </Text>\n              <Text size='sm'>{row.original.sourceProvider}</Text>\n            </VStack>\n            <VStack gap={2}>\n              <Text size='xs' color='secondary'>\n                Endpoint\n              </Text>\n              <HStack gap={4}>\n                <HttpMethod method={row.original.endpointMethod} />\n                <Text size='sm'>{row.original.endpointPath}</Text>\n              </HStack>\n            </VStack>\n          </div>\n        </div>\n      )}\n    />\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "description": "`renderExpandedRow` draws a panel beneath the row, for the two or three fields that do not\ndeserve columns of their own."
        },
        {
          "name": "ContextMenu",
          "code": "import { Badge } from '@wallarm-org/design-system/Badge';\nimport { InlineCodeSnippet } from '@wallarm-org/design-system/CodeSnippet';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuContextTrigger, DropdownMenuItem, DropdownMenuItemContent, DropdownMenuItemDescription, DropdownMenuItemIcon, DropdownMenuItemText, DropdownMenuSeparator } from '@wallarm-org/design-system/DropdownMenu';\nimport { Copy, Filter, FilterX } from '@wallarm-org/design-system/icons';\nimport { Table, type TableColumnDef } from '@wallarm-org/design-system/Table';\nimport { Text } from '@wallarm-org/design-system/Text';\nimport { securityColumnHelper, securityEvents } from './mocks';\n\nexport const ContextMenu = () => {\n  const contextMenuColumns: TableColumnDef<(typeof securityEvents)[number]>[] = [\n    securityColumnHelper.accessor('objectName', {\n      header: 'Object name',\n      cell: ({ getValue }) => (\n        <DropdownMenu>\n          <DropdownMenuContextTrigger>\n            <Text size='sm'>{getValue()}</Text>\n          </DropdownMenuContextTrigger>\n          <DropdownMenuContent>\n            <DropdownMenuItem onSelect={onCopyValue}>\n              <DropdownMenuItemIcon>\n                <Copy />\n              </DropdownMenuItemIcon>\n              <DropdownMenuItemText>Copy value</DropdownMenuItemText>\n            </DropdownMenuItem>\n\n            <DropdownMenuSeparator />\n\n            <DropdownMenuItem onSelect={onShowOnly}>\n              <DropdownMenuItemIcon>\n                <Filter />\n              </DropdownMenuItemIcon>\n              <DropdownMenuItemContent>\n                <DropdownMenuItemText>Show only</DropdownMenuItemText>\n                <DropdownMenuItemDescription>Filter to matching rows</DropdownMenuItemDescription>\n              </DropdownMenuItemContent>\n            </DropdownMenuItem>\n\n            <DropdownMenuItem onSelect={onExclude}>\n              <DropdownMenuItemIcon>\n                <FilterX />\n              </DropdownMenuItemIcon>\n              <DropdownMenuItemContent>\n                <DropdownMenuItemText>Exclude</DropdownMenuItemText>\n                <DropdownMenuItemDescription>Filter out matching rows</DropdownMenuItemDescription>\n              </DropdownMenuItemContent>\n            </DropdownMenuItem>\n          </DropdownMenuContent>\n        </DropdownMenu>\n      ),\n    }),\n    securityColumnHelper.accessor('parameter', {\n      header: 'Parameters',\n      cell: ({ getValue }) => (\n        <DropdownMenu>\n          <DropdownMenuContextTrigger>\n            <InlineCodeSnippet code={getValue()} size='sm' copyable={false} />\n          </DropdownMenuContextTrigger>\n          <DropdownMenuContent>\n            <DropdownMenuItem onSelect={onExecute}>\n              <DropdownMenuItemIcon>\n                <Copy />\n              </DropdownMenuItemIcon>\n              <DropdownMenuItemText>Execute</DropdownMenuItemText>\n            </DropdownMenuItem>\n          </DropdownMenuContent>\n        </DropdownMenu>\n      ),\n    }),\n    securityColumnHelper.accessor('status', {\n      header: 'Status',\n      cell: ({ getValue }) => {\n        const status = getValue();\n        return (\n          <Badge\n            variant='dotted'\n            color={status === 'Blocked' ? 'red' : 'yellow'}\n            type='secondary'\n            size='medium'\n          >\n            {status}\n          </Badge>\n        );\n      },\n    }),\n    securityColumnHelper.accessor('cweId', {\n      header: 'Security info',\n      cell: ({ getValue }) => (\n        <Badge color='rose' type='secondary' size='medium' textVariant='code'>\n          {getValue()}\n        </Badge>\n      ),\n    }),\n  ];\n\n  return <Table data={securityEvents} columns={contextMenuColumns} getRowId={row => row.id} />;\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "description": "Right-click inside a cell: `DropdownMenuContextTrigger` puts that column's verbs where the\npointer already is, so each column can offer its own."
        },
        {
          "name": "SettingsMenu",
          "code": "import { useState } from 'react';\nimport { Table, type TableVisibilityState } from '@wallarm-org/design-system/Table';\nimport { securityColumnIds, securityColumns, securityEvents } from './mocks';\n\nexport const SettingsMenu = () => {\n  const [columnVisibility, setColumnVisibility] = useState<TableVisibilityState>({});\n  const [columnOrder, setColumnOrder] = useState<string[]>([]);\n\n  return (\n    <Table\n      data={securityEvents}\n      columns={securityColumns}\n      getRowId={row => row.id}\n      columnVisibility={columnVisibility}\n      onColumnVisibilityChange={setColumnVisibility}\n      columnOrder={columnOrder}\n      onColumnOrderChange={setColumnOrder}\n      defaultColumnVisibility={{}}\n      defaultColumnOrder={securityColumnIds}\n    />\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "description": "The gear at the end of the header — search the columns, show and hide them, reorder them,\nreset — writing the same visibility and order state as the header menu."
        },
        {
          "name": "SettingsMenuDeferred",
          "code": "import { useState } from 'react';\nimport { Table, type TableVisibilityState } from '@wallarm-org/design-system/Table';\nimport { securityColumnIds, securityColumns, securityEvents } from './mocks';\n\nexport const SettingsMenuDeferred = () => {\n  const [columnVisibility, setColumnVisibility] = useState<TableVisibilityState>({});\n  const [columnOrder, setColumnOrder] = useState<string[]>([]);\n\n  return (\n    <Table\n      data={securityEvents}\n      columns={securityColumns}\n      getRowId={row => row.id}\n      columnVisibility={columnVisibility}\n      onColumnVisibilityChange={setColumnVisibility}\n      columnOrder={columnOrder}\n      onColumnOrderChange={setColumnOrder}\n      defaultColumnVisibility={{}}\n      defaultColumnOrder={securityColumnIds}\n      deferColumnVisibility\n    />\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "description": "`deferColumnVisibility` holds switch toggles and \"Reset to default\" while the\nsettings menu is open and applies them as one `columnVisibility` change on\nclose — for consumers that fetch a column's data only once the menu closes,\nso a new column never sits empty behind the open menu."
        },
        {
          "name": "SettingsMenuGrouped",
          "code": "import { useState } from 'react';\nimport { Table, type TableColumnGroup, type TableVisibilityState } from '@wallarm-org/design-system/Table';\nimport { securityColumns, securityEvents } from './mocks';\n\nexport const SettingsMenuGrouped = () => {\n  const [columnVisibility, setColumnVisibility] = useState<TableVisibilityState>({});\n\n  const columnGroups: TableColumnGroup[] = [\n    {\n      label: 'Threat classification',\n      columns: ['objectName', 'status', 'firstDetected', 'lastSeen'],\n    },\n    { label: 'Request features', columns: ['sourceIp', 'parameter', 'endpoint', 'requests'] },\n  ];\n\n  return (\n    <Table\n      data={securityEvents}\n      columns={securityColumns}\n      getRowId={row => row.id}\n      columnVisibility={columnVisibility}\n      onColumnVisibilityChange={setColumnVisibility}\n      columnGroups={columnGroups}\n    />\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "description": "`columnGroups` turns the settings menu into labeled, non-reorderable sections\n(the FilterInput field-menu pattern): no drag handle, columns rendered under\ntheir group header in the given order. Column ids absent from every group\n(`cweId` here) fall into a trailing headerless section."
        },
        {
          "name": "Virtualization",
          "code": "import { useMemo } from 'react';\nimport { Table } from '@wallarm-org/design-system/Table';\nimport { createLargeSecurityEvents, securityColumns } from './mocks';\n\nexport const Virtualization = () => {\n  const largeData = useMemo(() => createLargeSecurityEvents(1000), []);\n\n  return (\n    <Table\n      className='h-500'\n      data={largeData}\n      columns={securityColumns}\n      getRowId={row => row.id}\n      virtualized='container'\n    />\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "tags": [
            "!autodocs"
          ],
          "description": "`virtualized='container'` inside a fixed height renders only the rows in view, which is what\nlets a thousand rows behave like ten."
        },
        {
          "name": "WindowVirtualization",
          "code": "import { useMemo, useState } from 'react';\nimport { Table, type TableColumnSizingState } from '@wallarm-org/design-system/Table';\nimport { createLargeSecurityEvents, securityColumns } from './mocks';\n\nexport const WindowVirtualization = () => {\n  const largeData = useMemo(() => createLargeSecurityEvents(1000), []);\n  const [columnOrder, setColumnOrder] = useState<string[]>([]);\n  const [columnSizing, setColumnSizing] = useState<TableColumnSizingState>({});\n\n  return (\n    <Table\n      data={largeData}\n      columns={securityColumns}\n      getRowId={row => row.id}\n      virtualized='window'\n      columnOrder={columnOrder}\n      onColumnOrderChange={setColumnOrder}\n      columnSizing={columnSizing}\n      onColumnSizingChange={setColumnSizing}\n    />\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "tags": [
            "!autodocs"
          ],
          "description": "`virtualized='window'` measures against the page's own scroll instead, for a table that is\nthe page rather than a panel inside one."
        },
        {
          "name": "ScrollToRow",
          "code": "import { useMemo, useRef, useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\nimport { Table, type TableHandle } from '@wallarm-org/design-system/Table';\nimport { Text } from '@wallarm-org/design-system/Text';\nimport { createLargeSecurityEvents, securityColumns } from './mocks';\n\nexport const ScrollToRow = () => {\n  const largeData = useMemo(() => createLargeSecurityEvents(1000), []);\n  const tableRef = useRef<TableHandle>(null);\n  const [lastResult, setLastResult] = useState<string | null>(null);\n\n  const scroll = (index: number, align: 'start' | 'center' | 'end' | 'auto' = 'center') => {\n    const row = largeData[index];\n    if (!row) return;\n    const ok = tableRef.current?.scrollToRow(row.id, { align, behavior: 'smooth' }) ?? false;\n    setLastResult(`scrollToRow(\"${row.id}\", { align: \"${align}\" }) → ${ok}`);\n  };\n\n  return (\n    <VStack gap={8}>\n      <HStack gap={8}>\n        <Button variant='outline' color='neutral' onClick={() => scroll(0, 'start')}>\n          Top\n        </Button>\n        <Button variant='outline' color='neutral' onClick={() => scroll(499, 'center')}>\n          Middle\n        </Button>\n        <Button variant='outline' color='neutral' onClick={() => scroll(999, 'end')}>\n          Bottom\n        </Button>\n        <Button\n          variant='secondary'\n          color='neutral'\n          onClick={() => {\n            const ok = tableRef.current?.scrollToRow('does-not-exist') ?? false;\n            setLastResult(`scrollToRow(\"does-not-exist\") → ${ok}`);\n          }}\n        >\n          Missing id (returns false)\n        </Button>\n      </HStack>\n      {lastResult && (\n        <Text size='sm' color='secondary'>\n          {lastResult}\n        </Text>\n      )}\n      <Table\n        ref={tableRef}\n        className='h-500'\n        data={largeData}\n        columns={securityColumns}\n        getRowId={row => row.id}\n        virtualized='container'\n      />\n    </VStack>\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "tags": [
            "!autodocs"
          ],
          "description": "The imperative escape hatch: `scrollToRow(id, { align })` off the ref, returning false for\nan id the table does not have so a deep link can fall back."
        },
        {
          "name": "InfiniteScroll",
          "code": "import { VStack } from '@wallarm-org/design-system/Stack';\nimport { Table } from '@wallarm-org/design-system/Table';\nimport { Text } from '@wallarm-org/design-system/Text';\nimport { securityColumns, useInfiniteData } from './mocks';\n\nexport const InfiniteScroll = () => {\n  const { data, isFetching, hasMore, totalItems, fetchNextPage } = useInfiniteData();\n\n  return (\n    <VStack gap={8}>\n      <Text size='sm' color='secondary'>\n        Loaded {data.length} of {totalItems} rows {isFetching && '— loading...'}\n        {!hasMore && ' — all loaded'}\n      </Text>\n      <Table\n        className='h-500'\n        data={data}\n        columns={securityColumns}\n        getRowId={row => row.id}\n        virtualized='container'\n        isLoading={isFetching}\n        onEndReached={fetchNextPage}\n        onEndReachedThreshold={200}\n      />\n    </VStack>\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "tags": [
            "!autodocs"
          ],
          "description": "`onEndReached` with `isLoading` — the house default for a long collection, where rows arrive\nas you reach them and there is no page number to lose."
        },
        {
          "name": "InfiniteScrollWindow",
          "code": "import { VStack } from '@wallarm-org/design-system/Stack';\nimport { Table } from '@wallarm-org/design-system/Table';\nimport { Text } from '@wallarm-org/design-system/Text';\nimport { securityColumns, useInfiniteData } from './mocks';\n\nexport const InfiniteScrollWindow = () => {\n  const { data, isFetching, hasMore, totalItems, fetchNextPage } = useInfiniteData();\n\n  return (\n    <VStack gap={8}>\n      <Text size='sm' color='secondary'>\n        Loaded {data.length} of {totalItems} rows {isFetching && '— loading...'}\n        {!hasMore && ' — all loaded'}\n      </Text>\n      <Table\n        data={data}\n        columns={securityColumns}\n        getRowId={row => row.id}\n        virtualized='window'\n        isLoading={isFetching}\n        onEndReached={fetchNextPage}\n        onEndReachedThreshold={300}\n      />\n    </VStack>\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "tags": [
            "!autodocs"
          ],
          "description": "The same fetch-on-approach against the page's scroll, where the trigger has to account for\neverything else on the page as well as the table."
        },
        {
          "name": "BidirectionalInfiniteScroll",
          "code": "import { VStack } from '@wallarm-org/design-system/Stack';\nimport { Table } from '@wallarm-org/design-system/Table';\nimport { Text } from '@wallarm-org/design-system/Text';\nimport { securityColumns, useBidirectionalData } from './mocks';\n\nexport const BidirectionalInfiniteScroll = () => {\n  const {\n    data,\n    anchorId,\n    isFetchingPrev,\n    isFetchingNext,\n    hasPrev,\n    hasNext,\n    fetchPrevPage,\n    fetchNextPage,\n  } = useBidirectionalData();\n\n  return (\n    <VStack gap={8}>\n      <Text size='sm' color='secondary'>\n        Window of {data.length} rows around the anchor — scroll up for top skeletons, down for\n        bottom ones{(isFetchingPrev || isFetchingNext) && ' — loading...'}\n        {!hasPrev && ' — top reached'}\n        {!hasNext && ' — bottom reached'}\n      </Text>\n      <Table\n        className='h-500'\n        data={data}\n        columns={securityColumns}\n        getRowId={row => row.id}\n        virtualized='container'\n        isLoading={isFetchingNext}\n        isLoadingPrevious={isFetchingPrev}\n        initialScrollToRowId={anchorId}\n        onStartReached={fetchPrevPage}\n        onStartReachedThreshold={200}\n        onEndReached={fetchNextPage}\n        onEndReachedThreshold={200}\n      />\n    </VStack>\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "tags": [
            "!autodocs"
          ],
          "description": "Both ends at once: `onStartReached` prepends, and the scroll position is compensated so the\nrow you were reading does not slide out from under you."
        },
        {
          "name": "BidirectionalInfiniteScrollWindow",
          "code": "import { VStack } from '@wallarm-org/design-system/Stack';\nimport { Table } from '@wallarm-org/design-system/Table';\nimport { Text } from '@wallarm-org/design-system/Text';\nimport { securityColumns, useBidirectionalData } from './mocks';\n\nexport const BidirectionalInfiniteScrollWindow = () => {\n  const {\n    data,\n    anchorId,\n    isFetchingPrev,\n    isFetchingNext,\n    hasPrev,\n    hasNext,\n    fetchPrevPage,\n    fetchNextPage,\n  } = useBidirectionalData();\n\n  return (\n    <VStack gap={8}>\n      <Text size='sm' color='secondary'>\n        Window of {data.length} rows around the anchor\n        {(isFetchingPrev || isFetchingNext) && ' — loading...'}\n        {!hasPrev && ' — top reached'}\n        {!hasNext && ' — bottom reached'}\n      </Text>\n      <Table\n        data={data}\n        columns={securityColumns}\n        getRowId={row => row.id}\n        virtualized='window'\n        isLoading={isFetchingNext}\n        isLoadingPrevious={isFetchingPrev}\n        initialScrollToRowId={anchorId}\n        onStartReached={fetchPrevPage}\n        onStartReachedThreshold={200}\n        onEndReached={fetchNextPage}\n        onEndReachedThreshold={200}\n      />\n    </VStack>\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "tags": [
            "!autodocs"
          ],
          "description": "The prepend case against the document scroll, where unrelated page content shares the height\nbeing measured — the regression this story exists to catch."
        },
        {
          "name": "InfiniteScrollWindowInPane",
          "code": "import { VStack } from '@wallarm-org/design-system/Stack';\nimport { Table } from '@wallarm-org/design-system/Table';\nimport { Text } from '@wallarm-org/design-system/Text';\nimport { securityColumns, useBidirectionalData } from './mocks';\n\nexport const InfiniteScrollWindowInPane = () => {\n  const { data, isFetchingPrev, isFetchingNext, hasPrev, hasNext, fetchPrevPage, fetchNextPage } =\n    useBidirectionalData();\n\n  return (\n    <div data-testid='scroll-pane' style={{ height: 480, overflowY: 'auto' }}>\n      <div style={{ overflowX: 'hidden' }}>\n        <VStack gap={8}>\n          <Text size='sm' color='secondary'>\n            Window of {data.length} rows around the anchor\n            {(isFetchingPrev || isFetchingNext) && ' — loading...'}\n            {!hasPrev && ' — top reached'}\n            {!hasNext && ' — bottom reached'}\n          </Text>\n          <Table\n            data={data}\n            columns={securityColumns}\n            getRowId={row => row.id}\n            virtualized='window'\n            isLoading={isFetchingNext}\n            isLoadingPrevious={isFetchingPrev}\n            onStartReached={fetchPrevPage}\n            onStartReachedThreshold={200}\n            onEndReached={fetchNextPage}\n            onEndReachedThreshold={200}\n          />\n        </VStack>\n      </div>\n    </div>\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "tags": [
            "!autodocs"
          ],
          "description": "`virtualized='window'` in an app shell that scrolls a content pane instead of the document: the\ntable follows the pane. The `overflow-x: hidden` wrapper in between never scrolls (its\n`overflow-y` only computes to `auto`), so it must not be taken for the scroll root."
        },
        {
          "name": "InfiniteScrollWindowInPaneAnchored",
          "code": "import { Table } from '@wallarm-org/design-system/Table';\nimport { securityColumns, useBidirectionalData } from './mocks';\n\nexport const InfiniteScrollWindowInPaneAnchored = () => {\n  const { data, anchorId, isFetchingPrev, isFetchingNext, fetchPrevPage, fetchNextPage } =\n    useBidirectionalData();\n\n  return (\n    <div data-testid='scroll-pane' style={{ height: 480, overflowY: 'auto' }}>\n      <Table\n        data={data}\n        columns={securityColumns}\n        getRowId={row => row.id}\n        virtualized='window'\n        isLoading={isFetchingNext}\n        isLoadingPrevious={isFetchingPrev}\n        initialScrollToRowId={anchorId}\n        onStartReached={fetchPrevPage}\n        onStartReachedThreshold={200}\n        onEndReached={fetchNextPage}\n        onEndReachedThreshold={200}\n      />\n    </div>\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "tags": [
            "!autodocs"
          ],
          "description": "A share-link landing in a pane host: the window-mode table opens scrolled to its anchor row,\ninside the pane — the document stays put."
        },
        {
          "name": "InfiniteScrollWindowInPaneLateRows",
          "code": "import { useEffect, useState } from 'react';\nimport { Table } from '@wallarm-org/design-system/Table';\nimport { Text } from '@wallarm-org/design-system/Text';\nimport { securityColumns, useBidirectionalData } from './mocks';\n\nexport const InfiniteScrollWindowInPaneLateRows = () => {\n  const { data, isFetchingPrev, isFetchingNext, fetchPrevPage, fetchNextPage } =\n    useBidirectionalData();\n  const [hasLoaded, setHasLoaded] = useState(false);\n  const [calls, setCalls] = useState({ start: 0, end: 0 });\n  useEffect(() => {\n    const timer = setTimeout(() => setHasLoaded(true), 500);\n    return () => clearTimeout(timer);\n  }, []);\n\n  return (\n    <div data-testid='scroll-pane' style={{ height: 480, overflowY: 'auto' }}>\n      <Text size='sm' color='secondary'>\n        Edge calls: start {calls.start}, end {calls.end}\n      </Text>\n      <Table\n        data={hasLoaded ? data : []}\n        columns={securityColumns}\n        getRowId={row => row.id}\n        virtualized='window'\n        isLoading={!hasLoaded || isFetchingNext}\n        isLoadingPrevious={isFetchingPrev}\n        // Nothing to page from before the first page — as with a real cursor.\n        onStartReached={\n          hasLoaded\n            ? () => {\n                setCalls(prev => ({ ...prev, start: prev.start + 1 }));\n                fetchPrevPage();\n              }\n            : undefined\n        }\n        onStartReachedThreshold={200}\n        onEndReached={\n          hasLoaded\n            ? () => {\n                setCalls(prev => ({ ...prev, end: prev.end + 1 }));\n                fetchNextPage();\n              }\n            : undefined\n        }\n        onEndReachedThreshold={200}\n      />\n    </div>\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "tags": [
            "!autodocs"
          ],
          "description": "A pane host that mounts the table before its data: rows arrive after a delay. Neither edge may\nfire against the window meanwhile — only the edge the user scrolls to."
        },
        {
          "name": "InfiniteScrollWindowInHiddenPaneAnchored",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { VStack } from '@wallarm-org/design-system/Stack';\nimport { Table } from '@wallarm-org/design-system/Table';\nimport { securityColumns, useBidirectionalData } from './mocks';\n\nexport const InfiniteScrollWindowInHiddenPaneAnchored = () => {\n  const [isShown, setIsShown] = useState(false);\n  const { data, anchorId, isFetchingPrev, isFetchingNext, fetchPrevPage, fetchNextPage } =\n    useBidirectionalData();\n\n  return (\n    <VStack gap={8}>\n      <Button data-testid='show-table' onClick={() => setIsShown(true)}>\n        Show table\n      </Button>\n      <div\n        data-testid='scroll-pane'\n        style={{ height: 480, overflowY: 'auto', display: isShown ? 'block' : 'none' }}\n      >\n        <Table\n          data={data}\n          columns={securityColumns}\n          getRowId={row => row.id}\n          virtualized='window'\n          isLoading={isFetchingNext}\n          isLoadingPrevious={isFetchingPrev}\n          initialScrollToRowId={anchorId}\n          onStartReached={fetchPrevPage}\n          onStartReachedThreshold={200}\n          onEndReached={fetchNextPage}\n          onEndReachedThreshold={200}\n        />\n      </div>\n    </VStack>\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "tags": [
            "!autodocs"
          ],
          "description": "A share-link landing in a pane that starts hidden (a closed tab or drawer): the anchor waits\nuntil the table is shown and laid out, then lands inside the pane."
        },
        {
          "name": "InfiniteScrollWindowInScrolledPane",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { VStack } from '@wallarm-org/design-system/Stack';\nimport { Table } from '@wallarm-org/design-system/Table';\nimport { Text } from '@wallarm-org/design-system/Text';\nimport { securityColumns, useBidirectionalData } from './mocks';\n\nexport const InfiniteScrollWindowInScrolledPane = () => {\n  const [isShown, setIsShown] = useState(false);\n  const { data, isFetchingNext, fetchNextPage } = useBidirectionalData();\n\n  return (\n    <VStack gap={8}>\n      <Button data-testid='show-table' onClick={() => setIsShown(true)}>\n        Show table\n      </Button>\n      <div data-testid='scroll-pane' style={{ height: 480, overflowY: 'auto' }}>\n        <div style={{ height: 800 }}>\n          <Text size='sm' color='secondary'>\n            Content above the table\n          </Text>\n        </div>\n        {isShown && (\n          <Table\n            data={data}\n            columns={securityColumns}\n            getRowId={row => row.id}\n            virtualized='window'\n            isLoading={isFetchingNext}\n            onEndReached={fetchNextPage}\n            onEndReachedThreshold={200}\n          />\n        )}\n      </div>\n    </VStack>\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "tags": [
            "!autodocs"
          ],
          "description": "A window-mode table mounting into a pane the user already scrolled (content above it): the pane\nkeeps its position — adopting the root must not reset it."
        },
        {
          "name": "HeaderColumnDescription",
          "code": "import { useMemo, useState } from 'react';\nimport { Table, type TableColumnDef, type TableSortingState } from '@wallarm-org/design-system/Table';\nimport { securityColumns, securityEvents } from './mocks';\n\nexport const HeaderColumnDescription = () => {\n  const [sorting, setSorting] = useState<TableSortingState>([]);\n\n  const columns = useMemo<TableColumnDef<(typeof securityEvents)[number]>[]>(\n    () =>\n      securityColumns.map(col => {\n        const key = 'accessorKey' in col ? col.accessorKey : undefined;\n        if (key === 'objectName') {\n          return {\n            ...col,\n            meta: {\n              ...col.meta,\n              description: { type: 'text' as const, content: 'Target resource' },\n            },\n          };\n        }\n        if (key === 'sourceIp') {\n          return {\n            ...col,\n            meta: {\n              ...col.meta,\n              description: { type: 'tooltip' as const, content: 'Request origin IP' },\n            },\n          };\n        }\n        if (key === 'requests') {\n          return {\n            ...col,\n            meta: { ...col.meta, description: { type: 'tooltip' as const, content: 'Total hits' } },\n          };\n        }\n        if (key === 'parameter') {\n          return {\n            ...col,\n            meta: {\n              ...col.meta,\n              description: { type: 'text' as const, content: 'Affected param' },\n            },\n          };\n        }\n        return col;\n      }),\n    [],\n  );\n\n  return (\n    <Table\n      data={securityEvents}\n      columns={columns}\n      getRowId={row => row.id}\n      sorting={sorting}\n      onSortingChange={setSorting}\n    />\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "description": "A column can explain itself: `description` renders as a second line under the title, or as a\ntooltip behind a dashed underline when the header has no room for one."
        },
        {
          "name": "MasterCellWithActions",
          "code": "import { useMemo, useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuItemIcon, DropdownMenuItemText, DropdownMenuSeparator, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { Copy, Ellipsis, Filter, FilterX } from '@wallarm-org/design-system/icons';\nimport { Table, type TableColumnDef, type TableColumnSizingState, type TableSortingState } from '@wallarm-org/design-system/Table';\nimport { multiplySecurityEvents, type SecurityEvent, securityColumns } from './mocks';\n\nexport const MasterCellWithActions = () => {\n  const [sorting, setSorting] = useState<TableSortingState>([]);\n  const [columnSizing, setColumnSizing] = useState<TableColumnSizingState>({});\n\n  const data = useMemo(() => multiplySecurityEvents(), []);\n\n  const columns = useMemo<TableColumnDef<SecurityEvent>[]>(\n    () =>\n      securityColumns.map((col, i) =>\n        i === 0\n          ? {\n              ...col,\n              meta: {\n                ...col.meta,\n                size: 400,\n                resizeType: 'resize',\n                renderMenuAction: (row: { original: SecurityEvent }) => (\n                  <DropdownMenu>\n                    <DropdownMenuTrigger asChild>\n                      <Button variant='ghost' color='neutral' size='small' aria-label='More'>\n                        <Ellipsis />\n                      </Button>\n                    </DropdownMenuTrigger>\n                    <DropdownMenuContent>\n                      <DropdownMenuItem\n                        onSelect={() => navigator.clipboard.writeText(row.original.objectName)}\n                      >\n                        <DropdownMenuItemIcon>\n                          <Copy />\n                        </DropdownMenuItemIcon>\n                        <DropdownMenuItemText>Copy name</DropdownMenuItemText>\n                      </DropdownMenuItem>\n                      <DropdownMenuSeparator />\n                      <DropdownMenuItem onSelect={() => onShowOnly(row.original.objectName)}>\n                        <DropdownMenuItemIcon>\n                          <Filter />\n                        </DropdownMenuItemIcon>\n                        <DropdownMenuItemText>Show only</DropdownMenuItemText>\n                      </DropdownMenuItem>\n                      <DropdownMenuItem onSelect={() => onExclude(row.original.objectName)}>\n                        <DropdownMenuItemIcon>\n                          <FilterX />\n                        </DropdownMenuItemIcon>\n                        <DropdownMenuItemText>Exclude</DropdownMenuItemText>\n                      </DropdownMenuItem>\n                    </DropdownMenuContent>\n                  </DropdownMenu>\n                ),\n              },\n            }\n          : col,\n      ),\n    [],\n  );\n\n  return (\n    <Table\n      className='max-w-920'\n      data={data}\n      columns={columns}\n      getRowId={row => row.id}\n      sorting={sorting}\n      onSortingChange={setSorting}\n      columnSizing={columnSizing}\n      onColumnSizingChange={setColumnSizing}\n    />\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "description": "The first column is the master cell — pinned, and the place per-row actions appear on hover,\nso every row keeps its verbs in one predictable spot."
        },
        {
          "name": "MasterCellWithDrawer",
          "code": "import { useCallback, useMemo, useState } from 'react';\nimport { Drawer, DrawerBody, DrawerContent, DrawerHeader } from '@wallarm-org/design-system/Drawer';\nimport { Table, type TableColumnDef, type TableSortingState } from '@wallarm-org/design-system/Table';\nimport { Text } from '@wallarm-org/design-system/Text';\nimport { renderSecurityPreviewContent, renderSecurityPreviewHeader, type SecurityEvent, securityColumns, securityEvents } from './mocks';\n\nexport const MasterCellWithDrawer = () => {\n  const [sorting, setSorting] = useState<TableSortingState>([]);\n  const [activeRowId, setActiveRowId] = useState<string | null>(null);\n\n  const data = useMemo(\n    () =>\n      Array.from({ length: 4 }, (_, batch) =>\n        securityEvents.map(row => ({\n          ...row,\n          id: `${row.id}-${batch}`,\n          objectName: batch === 0 ? row.objectName : `${row.objectName} (${batch + 1})`,\n        })),\n      ).flat(),\n    [],\n  );\n\n  const columns = useMemo<TableColumnDef<SecurityEvent>[]>(\n    () =>\n      securityColumns.map((col, i) =>\n        i === 0\n          ? {\n              ...col,\n              cell: ({ row }: { row: { original: SecurityEvent } }) => (\n                <Text size='xs'>{row.original.objectName}</Text>\n              ),\n            }\n          : col,\n      ),\n    [],\n  );\n\n  const handleMasterCellClick = useCallback((rowId: string) => {\n    setActiveRowId(prev => (prev === rowId ? null : rowId));\n  }, []);\n\n  const activeRow = useMemo(() => data.find(d => d.id === activeRowId), [data, activeRowId]);\n\n  return (\n    <>\n      <Table\n        className='max-w-920'\n        data={data}\n        columns={columns}\n        getRowId={row => row.id}\n        sorting={sorting}\n        onSortingChange={setSorting}\n        onMasterCellClick={handleMasterCellClick}\n        activeRowId={activeRowId}\n      />\n      <Drawer\n        open={!!activeRow}\n        onOpenChange={open => {\n          if (!open) setActiveRowId(null);\n        }}\n        modal={false}\n        overlay={false}\n        closeOnOutsideClick={false}\n        width={960}\n      >\n        <DrawerContent>\n          {activeRow ? (\n            renderSecurityPreviewHeader({ original: activeRow })\n          ) : (\n            <DrawerHeader>\n              <span />\n            </DrawerHeader>\n          )}\n          <DrawerBody>\n            {activeRow && renderSecurityPreviewContent({ original: activeRow })}\n          </DrawerBody>\n        </DrawerContent>\n      </Drawer>\n    </>\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "description": "`onMasterCellClick` with `activeRowId`: the master cell opens a `Drawer` and the row it\nbelongs to stays marked while the panel is open."
        },
        {
          "name": "MasterCellWithActionsAndDrawer",
          "code": "import { useCallback, useMemo, useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Drawer, DrawerBody, DrawerContent, DrawerHeader } from '@wallarm-org/design-system/Drawer';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuItemIcon, DropdownMenuItemText, DropdownMenuSeparator, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { Copy, Ellipsis, Filter, FilterX } from '@wallarm-org/design-system/icons';\nimport { Table, type TableColumnDef, type TableSortingState } from '@wallarm-org/design-system/Table';\nimport { Text } from '@wallarm-org/design-system/Text';\nimport { multiplySecurityEvents, renderSecurityPreviewContent, renderSecurityPreviewHeader, type SecurityEvent, securityColumns } from './mocks';\n\nexport const MasterCellWithActionsAndDrawer = () => {\n  const [sorting, setSorting] = useState<TableSortingState>([]);\n  const [activeRowId, setActiveRowId] = useState<string | null>(null);\n\n  const data = useMemo(() => multiplySecurityEvents(), []);\n\n  const columns = useMemo<TableColumnDef<SecurityEvent>[]>(\n    () =>\n      securityColumns.map((col, i) =>\n        i === 0\n          ? {\n              ...col,\n              cell: ({ row }: { row: { original: SecurityEvent } }) => (\n                <Text size='xs'>{row.original.objectName}</Text>\n              ),\n              meta: {\n                ...col.meta,\n                resizeType: 'resize',\n                renderMenuAction: (row: { original: SecurityEvent }) => (\n                  <DropdownMenu>\n                    <DropdownMenuTrigger asChild>\n                      <Button variant='ghost' color='neutral' size='small' aria-label='More'>\n                        <Ellipsis />\n                      </Button>\n                    </DropdownMenuTrigger>\n                    <DropdownMenuContent>\n                      <DropdownMenuItem\n                        onSelect={() => navigator.clipboard.writeText(row.original.objectName)}\n                      >\n                        <DropdownMenuItemIcon>\n                          <Copy />\n                        </DropdownMenuItemIcon>\n                        <DropdownMenuItemText>Copy name</DropdownMenuItemText>\n                      </DropdownMenuItem>\n                      <DropdownMenuSeparator />\n                      <DropdownMenuItem onSelect={() => onShowOnly(row.original.objectName)}>\n                        <DropdownMenuItemIcon>\n                          <Filter />\n                        </DropdownMenuItemIcon>\n                        <DropdownMenuItemText>Show only</DropdownMenuItemText>\n                      </DropdownMenuItem>\n                      <DropdownMenuItem onSelect={() => onExclude(row.original.objectName)}>\n                        <DropdownMenuItemIcon>\n                          <FilterX />\n                        </DropdownMenuItemIcon>\n                        <DropdownMenuItemText>Exclude</DropdownMenuItemText>\n                      </DropdownMenuItem>\n                    </DropdownMenuContent>\n                  </DropdownMenu>\n                ),\n              },\n            }\n          : col,\n      ),\n    [],\n  );\n\n  const handleMasterCellClick = useCallback((rowId: string) => {\n    setActiveRowId(prev => (prev === rowId ? null : rowId));\n  }, []);\n\n  const activeRow = useMemo(() => data.find(d => d.id === activeRowId), [data, activeRowId]);\n\n  return (\n    <>\n      <Table\n        className='max-w-920'\n        data={data}\n        columns={columns}\n        getRowId={row => row.id}\n        sorting={sorting}\n        onSortingChange={setSorting}\n        onMasterCellClick={handleMasterCellClick}\n        activeRowId={activeRowId}\n      />\n      <Drawer\n        open={!!activeRow}\n        onOpenChange={open => {\n          if (!open) setActiveRowId(null);\n        }}\n        modal={false}\n        overlay={false}\n        closeOnOutsideClick={false}\n        width={960}\n      >\n        <DrawerContent>\n          {activeRow ? (\n            renderSecurityPreviewHeader({ original: activeRow })\n          ) : (\n            <DrawerHeader>\n              <span />\n            </DrawerHeader>\n          )}\n          <DrawerBody>\n            {activeRow && renderSecurityPreviewContent({ original: activeRow })}\n          </DrawerBody>\n        </DrawerContent>\n      </Drawer>\n    </>\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "description": "Master cell with both an action menu and a drawer:\nclicking the cell body opens the drawer, clicking the action button opens the menu\nwithout triggering the drawer."
        },
        {
          "name": "FullFeatured",
          "code": "import { useMemo, useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Copy, Trash2 } from '@wallarm-org/design-system/icons';\nimport { Table, TableActionBar, type TableColumnPinningState, type TableColumnSizingState, type TableExpandedState, type TableRowSelectionState, type TableSortingState, type TableVisibilityState } from '@wallarm-org/design-system/Table';\nimport { createLargeGroupedData, fullFeaturedColumns, headerColumnIds, type SecurityHeaderEntry } from './mocks';\n\nexport const FullFeatured = () => {\n  const data = useMemo(() => createLargeGroupedData(12, 50), []);\n\n  const [sorting, setSorting] = useState<TableSortingState>([{ id: 'lastEdited', desc: true }]);\n  const [rowSelection, setRowSelection] = useState<TableRowSelectionState>({});\n  const [columnSizing, setColumnSizing] = useState<TableColumnSizingState>({});\n  const [columnPinning, setColumnPinning] = useState<TableColumnPinningState>({\n    left: ['objectName'],\n  });\n  const [columnOrder, setColumnOrder] = useState<string[]>([]);\n  const [columnVisibility, setColumnVisibility] = useState<TableVisibilityState>({});\n  const [expanded, setExpanded] = useState<TableExpandedState>({\n    'group-0': true,\n    'group-1': true,\n  });\n\n  return (\n    <Table<SecurityHeaderEntry>\n      className='h-500'\n      data={data}\n      columns={fullFeaturedColumns}\n      getRowId={row => row.id}\n      getSubRows={row => row.children}\n      // Grouping\n      expanded={expanded}\n      onExpandedChange={setExpanded}\n      // Sorting\n      sorting={sorting}\n      onSortingChange={setSorting}\n      // Row selection\n      rowSelection={rowSelection}\n      onRowSelectionChange={setRowSelection}\n      // Column resizing\n      columnSizing={columnSizing}\n      onColumnSizingChange={setColumnSizing}\n      // Column pinning\n      columnPinning={columnPinning}\n      onColumnPinningChange={setColumnPinning}\n      // Column DnD ordering\n      columnOrder={columnOrder}\n      onColumnOrderChange={setColumnOrder}\n      // Column visibility + settings\n      columnVisibility={columnVisibility}\n      onColumnVisibilityChange={setColumnVisibility}\n      defaultColumnVisibility={{}}\n      defaultColumnOrder={headerColumnIds}\n      // Virtual scrolling\n      virtualized='container'\n    >\n      <TableActionBar>\n        <Button variant='ghost' color='neutral-alt' onClick={onDuplicate}>\n          <Copy /> Duplicate\n        </Button>\n        <Button color='brand' onClick={onDelete}>\n          <Trash2 /> Delete\n        </Button>\n      </TableActionBar>\n    </Table>\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "tags": [
            "!autodocs"
          ],
          "description": "Grouping, expansion, selection, pinning, virtualization and the action bar in one table —\nthe honest test of whether the features cooperate rather than merely exist."
        },
        {
          "name": "RowReordering",
          "code": "import { useCallback, useState } from 'react';\nimport { arrayMove } from '@dnd-kit/sortable';\nimport { Table, type TableRowReorderEvent } from '@wallarm-org/design-system/Table';\nimport { securityColumns, securityEvents } from './mocks';\n\nexport const RowReordering = () => {\n  const [data, setData] = useState(() => securityEvents.slice(0, 6));\n\n  const handleRowReorder = useCallback((event: TableRowReorderEvent) => {\n    setData(prev => {\n      const oldIndex = prev.findIndex(row => row.id === event.activeRowId);\n      const newIndex = prev.findIndex(row => row.id === event.overRowId);\n      if (oldIndex === -1 || newIndex === -1) return prev;\n      return arrayMove(prev, oldIndex, newIndex);\n    });\n  }, []);\n\n  return (\n    <Table\n      data={data}\n      columns={securityColumns}\n      getRowId={row => row.id}\n      onRowReorder={handleRowReorder}\n      data-testid='row-reorder-table'\n    />\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "description": "`EditableTextCell` and `EditableSelectCell` in the plain columns, with the master column\ndeliberately read-only — editing in place suits a value the user owns, not one the system\nreports. Hovering highlights the whole cell, clicking opens it without the content shifting,\nand Enter or blur commits while Escape reverts."
        },
        {
          "name": "RowReorderingInGroups",
          "code": "import { useCallback, useState } from 'react';\nimport { arrayMove } from '@dnd-kit/sortable';\nimport { Table, type TableExpandedState, type TableRowReorderEvent } from '@wallarm-org/design-system/Table';\nimport { groupedHeaderData, headerColumns, type SecurityHeaderEntry } from './mocks';\n\nexport const RowReorderingInGroups = () => {\n  const [data, setData] = useState<SecurityHeaderEntry[]>(() => [\n    ...groupedHeaderData,\n    { ...groupedHeaderData[0]!, id: 'group-empty', objectName: 'Nothing here yet', children: [] },\n  ]);\n  const [expanded, setExpanded] = useState<TableExpandedState>(true);\n\n  const handleRowReorder = useCallback((event: TableRowReorderEvent) => {\n    setData(prev =>\n      prev.map(group => {\n        const children = group.children ?? [];\n        const oldIndex = children.findIndex(row => row.id === event.activeRowId);\n        const newIndex = children.findIndex(row => row.id === event.overRowId);\n        if (oldIndex === -1 || newIndex === -1) return group;\n        return { ...group, children: arrayMove(children, oldIndex, newIndex) };\n      }),\n    );\n  }, []);\n\n  return (\n    <Table<SecurityHeaderEntry>\n      data={data}\n      columns={headerColumns}\n      getRowId={row => row.id}\n      getSubRows={row => row.children}\n      showEmptyGroups\n      expanded={expanded}\n      onExpandedChange={setExpanded}\n      onRowReorder={handleRowReorder}\n      data-testid='row-reorder-groups-table'\n    />\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "description": "With `getSubRows` grouping, a row moves only among the rows of its own group; group rows stay\nput. `showEmptyGroups` keeps a group whose `getSubRows` returns `[]` on screen as a group row."
        },
        {
          "name": "GroupedWithFullWidthRows",
          "code": "import { useCallback, useState } from 'react';\nimport { arrayMove } from '@dnd-kit/sortable';\nimport { Badge } from '@wallarm-org/design-system/Badge';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { ChevronDown, ChevronRight, Ellipsis, Plus, Shield } from '@wallarm-org/design-system/icons';\nimport { HStack } from '@wallarm-org/design-system/Stack';\nimport { Table, type TableExpandedState, type TableRowReorderEvent } from '@wallarm-org/design-system/Table';\nimport { Text } from '@wallarm-org/design-system/Text';\nimport { groupedHeaderData, headerColumns, type SecurityHeaderEntry } from './mocks';\n\nexport const GroupedWithFullWidthRows = () => {\n  const [data, setData] = useState<SecurityHeaderEntry[]>(() => [\n    {\n      ...groupedHeaderData[0]!,\n      children: [\n        { ...groupedHeaderData[0]!, id: `${BANNER_ROW_PREFIX}csp`, children: undefined },\n        ...(groupedHeaderData[0]!.children ?? []),\n      ],\n    },\n    ...groupedHeaderData.slice(1, 3),\n    { ...groupedHeaderData[0]!, id: 'group-empty', objectName: 'Nothing here yet', children: [] },\n  ]);\n  const [expanded, setExpanded] = useState<TableExpandedState>(true);\n\n  const handleRowReorder = useCallback((event: TableRowReorderEvent) => {\n    setData(prev =>\n      prev.map(group => {\n        const children = group.children ?? [];\n        const oldIndex = children.findIndex(row => row.id === event.activeRowId);\n        const newIndex = children.findIndex(row => row.id === event.overRowId);\n        if (oldIndex === -1 || newIndex === -1) return group;\n        return { ...group, children: arrayMove(children, oldIndex, newIndex) };\n      }),\n    );\n  }, []);\n\n  return (\n    <Table<SecurityHeaderEntry>\n      data={data}\n      columns={headerColumns}\n      getRowId={row => row.id}\n      getSubRows={row => row.children}\n      showEmptyGroups\n      expanded={expanded}\n      onExpandedChange={setExpanded}\n      onRowReorder={handleRowReorder}\n      groupRowSpan='full'\n      renderGroupRow={row => {\n        const isExpanded = row.getIsExpanded();\n        return (\n          <HStack gap={8} align='center'>\n            <Button\n              variant='ghost'\n              color='neutral'\n              size='small'\n              aria-expanded={isExpanded}\n              aria-label={isExpanded ? 'Collapse group' : 'Expand group'}\n              onClick={row.getToggleExpandedHandler()}\n            >\n              {isExpanded ? <ChevronDown /> : <ChevronRight />}\n            </Button>\n            <Text weight='medium'>{row.original.objectName}</Text>\n            <Badge color='gray' type='secondary' size='medium'>\n              {row.subRows.filter(r => !r.id.startsWith(BANNER_ROW_PREFIX)).length}\n            </Badge>\n            <HStack gap={4} className='ml-auto'>\n              <Button variant='ghost' color='neutral' size='small'>\n                <Plus />\n                Add header\n              </Button>\n              <Button variant='ghost' color='neutral' size='small' aria-label='More actions'>\n                <Ellipsis />\n              </Button>\n            </HStack>\n          </HStack>\n        );\n      }}\n      renderFullWidthRow={row =>\n        row.id.startsWith(BANNER_ROW_PREFIX) ? (\n          <HStack gap={8} align='center'>\n            <Shield size='sm' />\n            <Text size='sm' weight='medium'>\n              Wallarm baseline headers\n            </Text>\n            <Text size='sm' color='secondary'>\n              · applied first · built-in, always on\n            </Text>\n            <Button variant='ghost' color='neutral' size='small' className='ml-auto'>\n              Manage baseline →\n            </Button>\n          </HStack>\n        ) : undefined\n      }\n      getRowCanDrag={row => !row.id.startsWith(BANNER_ROW_PREFIX) && !LOCKED_ROW_IDS.has(row.id)}\n      data-testid='grouped-full-width-table'\n    />\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "description": "`groupRowSpan: 'full'` draws `renderGroupRow` across every data column — title on the left,\nactions on the right edge; the content owns the collapse toggle. `renderFullWidthRow` turns a\nregular row into a single spanning banner, and `getRowCanDrag` keeps the banner and the locked\nfirst header in place while the other rows of the group reorder around them."
        },
        {
          "name": "GroupedWithExpandColumn",
          "code": "import { useCallback, useState } from 'react';\nimport { arrayMove } from '@dnd-kit/sortable';\nimport { Badge } from '@wallarm-org/design-system/Badge';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Plus } from '@wallarm-org/design-system/icons';\nimport { HStack } from '@wallarm-org/design-system/Stack';\nimport { Table, type TableExpandedState, type TableRowReorderEvent } from '@wallarm-org/design-system/Table';\nimport { Text } from '@wallarm-org/design-system/Text';\nimport { groupedHeaderData, headerColumns, type SecurityHeaderEntry } from './mocks';\n\nexport const GroupedWithExpandColumn = () => {\n  const [data, setData] = useState<SecurityHeaderEntry[]>(() => [\n    ...groupedHeaderData,\n    { ...groupedHeaderData[0]!, id: 'group-empty', objectName: 'Nothing here yet', children: [] },\n  ]);\n  const [expanded, setExpanded] = useState<TableExpandedState>(true);\n\n  const handleRowReorder = useCallback((event: TableRowReorderEvent) => {\n    setData(prev =>\n      prev.map(group => {\n        const children = group.children ?? [];\n        const oldIndex = children.findIndex(row => row.id === event.activeRowId);\n        const newIndex = children.findIndex(row => row.id === event.overRowId);\n        if (oldIndex === -1 || newIndex === -1) return group;\n        return { ...group, children: arrayMove(children, oldIndex, newIndex) };\n      }),\n    );\n  }, []);\n\n  return (\n    <Table<SecurityHeaderEntry>\n      data={data}\n      columns={headerColumns}\n      getRowId={row => row.id}\n      getSubRows={row => row.children}\n      showEmptyGroups\n      expanded={expanded}\n      onExpandedChange={setExpanded}\n      onRowReorder={handleRowReorder}\n      groupRowSpan='full'\n      groupExpandColumn\n      renderGroupRow={row => (\n        <HStack gap={8} align='center'>\n          <Text weight='medium'>{row.original.objectName}</Text>\n          <Badge color='gray' type='secondary' size='medium'>\n            {row.subRows.length}\n          </Badge>\n          <Button variant='ghost' color='neutral' size='small' className='ml-auto'>\n            <Plus />\n            Add header\n          </Button>\n        </HStack>\n      )}\n      data-testid='grouped-expand-column-table'\n    />\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "description": "`groupExpandColumn` keeps the expand column in grouping mode: the toggle sits in its own column,\nfirst, and every row of a group — drag handle included — sits to the right of it, while\n`renderGroupRow` keeps the title and the actions."
        },
        {
          "name": "RowReorderingWithSelection",
          "code": "import { useCallback, useState } from 'react';\nimport { arrayMove } from '@dnd-kit/sortable';\nimport { Table, type TableRowReorderEvent, type TableRowSelectionState } from '@wallarm-org/design-system/Table';\nimport { securityColumns, securityEvents } from './mocks';\n\nexport const RowReorderingWithSelection = () => {\n  const [data, setData] = useState(() => securityEvents.slice(0, 6));\n  const [rowSelection, setRowSelection] = useState<TableRowSelectionState>({});\n\n  const handleRowReorder = useCallback((event: TableRowReorderEvent) => {\n    setData(prev => {\n      const oldIndex = prev.findIndex(row => row.id === event.activeRowId);\n      const newIndex = prev.findIndex(row => row.id === event.overRowId);\n      if (oldIndex === -1 || newIndex === -1) return prev;\n      return arrayMove(prev, oldIndex, newIndex);\n    });\n  }, []);\n\n  return (\n    <Table\n      data={data}\n      columns={securityColumns}\n      getRowId={row => row.id}\n      onRowReorder={handleRowReorder}\n      rowSelection={rowSelection}\n      onRowSelectionChange={setRowSelection}\n    />\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "description": "Row reordering coexists with row selection — each feature has its own column and they\ndon't interfere with each other."
        },
        {
          "name": "RowReorderingVirtualized",
          "code": "import { useCallback, useState } from 'react';\nimport { arrayMove } from '@dnd-kit/sortable';\nimport { Table, type TableRowReorderEvent } from '@wallarm-org/design-system/Table';\nimport { createLargeSecurityEvents, securityColumns } from './mocks';\n\nexport const RowReorderingVirtualized = () => {\n  const [data, setData] = useState(() => createLargeSecurityEvents(100));\n\n  const handleRowReorder = useCallback((event: TableRowReorderEvent) => {\n    setData(prev => {\n      const oldIndex = prev.findIndex(row => row.id === event.activeRowId);\n      const newIndex = prev.findIndex(row => row.id === event.overRowId);\n      if (oldIndex === -1 || newIndex === -1) return prev;\n      return arrayMove(prev, oldIndex, newIndex);\n    });\n  }, []);\n\n  return (\n    <Table\n      data={data}\n      columns={securityColumns}\n      getRowId={row => row.id}\n      onRowReorder={handleRowReorder}\n      virtualized='container'\n      estimateRowHeight={() => 40}\n    />\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "tags": [
            "!autodocs"
          ],
          "description": "Row drag-and-drop with container virtualization — the `DragOverlay` renders the dragged row\noutside the virtualizer so it stays visible even when scrolled out of the virtual window."
        },
        {
          "name": "InlineCellEditing",
          "code": "import { useCallback, useMemo, useState } from 'react';\nimport { InlineCodeSnippet } from '@wallarm-org/design-system/CodeSnippet';\nimport { VStack } from '@wallarm-org/design-system/Stack';\nimport { EDITABLE_CELL_COLUMN_META, EditableSelectCell, EditableTextCell, Table, type TableColumnDef } from '@wallarm-org/design-system/Table';\nimport { Text } from '@wallarm-org/design-system/Text';\nimport { type SecurityEvent, securityColumnHelper, securityEvents } from './mocks';\n\nexport const InlineCellEditing = () => {\n  const [data, setData] = useState<SecurityEvent[]>(() => securityEvents.slice(0, 6));\n  // Category starts unselected for every row, so the select shows its placeholder.\n  const [categories, setCategories] = useState<Record<string, string>>({});\n  const updateCell = useCallback(\n    <K extends keyof SecurityEvent>(rowId: string, key: K, value: SecurityEvent[K]) => {\n      setData(prev => prev.map(row => (row.id === rowId ? { ...row, [key]: value } : row)));\n    },\n    [],\n  );\n  const columns = useMemo<TableColumnDef<SecurityEvent>[]>(\n    () => [\n      // The first column is the Table's pinned \"master\" column — keep it\n      // read-only; editable cells live in the plain columns after it.\n      securityColumnHelper.accessor('sourceIp', {\n        header: 'Source',\n        size: 200,\n        meta: { resizeType: 'cut' as const },\n        cell: ({ getValue }) => <Text size='sm'>{getValue()}</Text>,\n      }),\n      securityColumnHelper.accessor('objectName', {\n        header: 'Object name',\n        size: 400,\n        meta: EDITABLE_CELL_COLUMN_META,\n        cell: ({ row, getValue }) => (\n          <EditableTextCell\n            data-testid='editable-text-cell'\n            value={getValue()}\n            aria-label='Edit object name'\n            onCommit={value => updateCell(row.id, 'objectName', value)}\n          />\n        ),\n      }),\n      securityColumnHelper.accessor('status', {\n        header: 'Status',\n        size: 200,\n        meta: EDITABLE_CELL_COLUMN_META,\n        cell: ({ row, getValue }) => (\n          <EditableSelectCell\n            data-testid='editable-select-cell'\n            value={getValue()}\n            items={statusItems}\n            onCommit={value => updateCell(row.id, 'status', value as SecurityEvent['status'])}\n          >\n            <StatusBadge value={getValue()} />\n          </EditableSelectCell>\n        ),\n      }),\n      // Empty-by-default select: consumer supplies the `placeholder` text.\n      securityColumnHelper.display({\n        id: 'category',\n        header: 'Category',\n        size: 200,\n        meta: EDITABLE_CELL_COLUMN_META,\n        cell: ({ row }) => {\n          const value = categories[row.id] ?? '';\n          return (\n            <EditableSelectCell\n              value={value}\n              items={categoryItems}\n              placeholder='Select'\n              aria-label='Edit category'\n              onCommit={next => setCategories(prev => ({ ...prev, [row.id]: next }))}\n            >\n              {categoryItems.find(item => item.value === value)?.label}\n            </EditableSelectCell>\n          );\n        },\n      }),\n      securityColumnHelper.accessor('parameter', {\n        header: 'Parameters',\n        size: 240,\n        meta: { resizeType: 'cut' as const },\n        cell: ({ getValue }) => <InlineCodeSnippet code={getValue()} size='sm' copyable={false} />,\n      }),\n    ],\n    [updateCell, categories],\n  );\n  return (\n    <VStack gap={12} align='stretch'>\n      <Table data={data} columns={columns} getRowId={row => row.id} />\n    </VStack>\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table"
        },
        {
          "name": "StickyGroupParentStory",
          "code": "import { useMemo, useState } from 'react';\nimport { Table, type TableExpandedState, type TableRowSelectionState, type TableSortingState } from '@wallarm-org/design-system/Table';\nimport { createLargeGroupedData, headerColumns, type SecurityHeaderEntry } from './mocks';\n\nexport const StickyGroupParentStory = () => {\n  const data = useMemo(() => createLargeGroupedData(4, 20), []);\n  const [expanded, setExpanded] = useState<TableExpandedState>({\n    'group-0': true,\n    'group-1': true,\n    'group-2': true,\n    'group-3': true,\n  });\n  const [sorting, setSorting] = useState<TableSortingState>([{ id: 'lastEdited', desc: true }]);\n  const [rowSelection, setRowSelection] = useState<TableRowSelectionState>({});\n\n  return (\n    <Table<SecurityHeaderEntry>\n      className='h-300'\n      data={data}\n      columns={headerColumns}\n      getRowId={row => row.id}\n      getSubRows={row => row.children}\n      expanded={expanded}\n      onExpandedChange={setExpanded}\n      sorting={sorting}\n      onSortingChange={setSorting}\n      rowSelection={rowSelection}\n      onRowSelectionChange={setRowSelection}\n      data-testid='sticky-group-parent-table'\n    />\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "description": "The group parent row sticks below the header while its children scroll — scroll through\na group to see the parent pin in place, then release when the group boundary passes."
        },
        {
          "name": "StickyGroupParentVirtualized",
          "code": "import { useMemo, useState } from 'react';\nimport { Table, type TableExpandedState, type TableRowSelectionState, type TableSortingState } from '@wallarm-org/design-system/Table';\nimport { createLargeGroupedData, headerColumns, type SecurityHeaderEntry } from './mocks';\n\nexport const StickyGroupParentVirtualized = () => {\n  const data = useMemo(() => createLargeGroupedData(12, 50), []);\n  const [expanded, setExpanded] = useState<TableExpandedState>({\n    'group-0': true,\n    'group-1': true,\n    'group-2': true,\n  });\n  const [sorting, setSorting] = useState<TableSortingState>([{ id: 'lastEdited', desc: true }]);\n  const [rowSelection, setRowSelection] = useState<TableRowSelectionState>({});\n\n  return (\n    <Table<SecurityHeaderEntry>\n      className='h-500'\n      data={data}\n      columns={headerColumns}\n      getRowId={row => row.id}\n      getSubRows={row => row.children}\n      expanded={expanded}\n      onExpandedChange={setExpanded}\n      sorting={sorting}\n      onSortingChange={setSorting}\n      rowSelection={rowSelection}\n      onRowSelectionChange={setRowSelection}\n      virtualized='container'\n      data-testid='sticky-group-parent-virt-table'\n    />\n  );\n};",
          "storyFile": "Table/Table.stories.tsx",
          "storyTitle": "Data Display/Table",
          "tags": [
            "!autodocs"
          ],
          "description": "The same sticky-parent behavior under container virtualization with large grouped data —\nthe overlay stays in the DOM even when the real parent row is unmounted by the virtualizer."
        }
      ]
    },
    {
      "name": "Tabs",
      "description": "Switches between a few peer sections of one page without going anywhere — `Tabs` owns the panels, which is what separates it from `SegmentedControl`. Underline tabs are the default for a page’s primary division; reach for `SegmentedTabs` for scoped views of one collection or a second level below these, `SegmentedControl` for a toggle that owns no panel, and `Accordion` when the sections should be open at once.",
      "importPath": "@wallarm-org/design-system/Tabs",
      "props": [
        {
          "name": "size",
          "type": "TabsSize | undefined",
          "required": false
        },
        {
          "name": "variant",
          "type": "TabsVariant | undefined",
          "required": false
        },
        {
          "name": "value",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "lazyMount",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "true"
        },
        {
          "name": "unmountOnExit",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "true"
        },
        {
          "name": "asChild",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "onChange",
          "type": "((value: string) => void) | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "size",
          "options": [
            "medium",
            "small"
          ],
          "defaultValue": "medium"
        }
      ],
      "subComponents": [],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Tabs, TabsContent, TabsList, TabsTrigger } from '@wallarm-org/design-system/Tabs';\n\nexport const Basic = () => (\n  <div className='w-600'>\n    <Tabs defaultValue='1' data-testid='tabs'>\n      <TabsList>\n        <TabsTrigger value='1'>Tab 1</TabsTrigger>\n        <TabsTrigger value='2'>Tab 2</TabsTrigger>\n        <TabsTrigger value='3'>Tab 3</TabsTrigger>\n      </TabsList>\n      <TabsContent value='1'>Content for Tab 1</TabsContent>\n      <TabsContent value='2'>Content for Tab 2</TabsContent>\n      <TabsContent value='3'>Content for Tab 3</TabsContent>\n    </Tabs>\n  </div>\n);",
          "storyFile": "Tabs/Tabs.stories.tsx",
          "storyTitle": "Navigation/Tabs",
          "description": "The smallest complete set: every `TabsTrigger` value pairs with a `TabsContent` of the same value, and the panel mounts the first time it opens."
        },
        {
          "name": "Variants",
          "code": "import { VStack } from '@wallarm-org/design-system/Stack';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@wallarm-org/design-system/Tabs';\n\nexport const Variants = () => (\n  <div className='w-600'>\n    <VStack gap={32}>\n      <Tabs defaultValue='1'>\n        <TabsList>\n          <TabsTrigger value='1'>Tab 1 (Default)</TabsTrigger>\n          <TabsTrigger value='2'>Tab 2 (Default)</TabsTrigger>\n          <TabsTrigger value='3'>Tab 3 (Default)</TabsTrigger>\n        </TabsList>\n        <TabsContent value='1'>Content for Tab 1</TabsContent>\n        <TabsContent value='2'>Content for Tab 2</TabsContent>\n        <TabsContent value='3'>Content for Tab 3</TabsContent>\n      </Tabs>\n\n      <Tabs defaultValue='1' variant='grayscale'>\n        <TabsList>\n          <TabsTrigger value='1'>Tab 1 (Grayscale)</TabsTrigger>\n          <TabsTrigger value='2'>Tab 2 (Grayscale)</TabsTrigger>\n          <TabsTrigger value='3'>Tab 3 (Grayscale)</TabsTrigger>\n        </TabsList>\n        <TabsContent value='1'>Content for Tab 1</TabsContent>\n        <TabsContent value='2'>Content for Tab 2</TabsContent>\n        <TabsContent value='3'>Content for Tab 3</TabsContent>\n      </Tabs>\n    </VStack>\n  </div>\n);",
          "storyFile": "Tabs/Tabs.stories.tsx",
          "storyTitle": "Navigation/Tabs",
          "description": "`grayscale` mutes the active underline and label for a bar that should sit quieter than the content it introduces."
        },
        {
          "name": "Icons",
          "code": "import { CircleDashed } from '@wallarm-org/design-system/icons';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@wallarm-org/design-system/Tabs';\n\nexport const Icons = () => (\n  <div className='w-600'>\n    <Tabs defaultValue='1'>\n      <TabsList>\n        <TabsTrigger value='1'>\n          <CircleDashed />\n          Tab 1\n        </TabsTrigger>\n        <TabsTrigger value='2'>\n          Tab 2\n          <CircleDashed />\n        </TabsTrigger>\n        <TabsTrigger value='3'>\n          <CircleDashed />\n          Tab 3\n          <CircleDashed />\n        </TabsTrigger>\n      </TabsList>\n      <TabsContent value='1'>Content for Tab 1</TabsContent>\n      <TabsContent value='2'>Content for Tab 2</TabsContent>\n      <TabsContent value='3'>Content for Tab 3</TabsContent>\n    </Tabs>\n  </div>\n);",
          "storyFile": "Tabs/Tabs.stories.tsx",
          "storyTitle": "Navigation/Tabs",
          "description": "An icon before the label, for a set where the words alone are slow to scan."
        },
        {
          "name": "IconsOnly",
          "code": "import { Earth, LayoutDashboard, Search } from '@wallarm-org/design-system/icons';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@wallarm-org/design-system/Tabs';\n\nexport const IconsOnly = () => (\n  <div className='w-600'>\n    <Tabs defaultValue='1'>\n      <TabsList>\n        <TabsTrigger value='1'>\n          <LayoutDashboard />\n        </TabsTrigger>\n        <TabsTrigger value='2'>\n          <Search />\n        </TabsTrigger>\n        <TabsTrigger value='3'>\n          <Earth />\n        </TabsTrigger>\n      </TabsList>\n      <TabsContent value='1'>Content for Tab 1</TabsContent>\n      <TabsContent value='2'>Content for Tab 2</TabsContent>\n      <TabsContent value='3'>Content for Tab 3</TabsContent>\n    </Tabs>\n  </div>\n);",
          "storyFile": "Tabs/Tabs.stories.tsx",
          "storyTitle": "Navigation/Tabs",
          "description": "Icons with no labels — only for a set the reader already knows, and each trigger still needs an accessible name."
        },
        {
          "name": "Badge",
          "code": "import { CircleDashed } from '@wallarm-org/design-system/icons';\nimport { NumericBadge } from '@wallarm-org/design-system/NumericBadge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@wallarm-org/design-system/Tabs';\n\nexport const Badge = () => (\n  <div className='w-600'>\n    <Tabs defaultValue='1'>\n      <TabsList>\n        <TabsTrigger value='1'>\n          <CircleDashed />\n          Tab 1<NumericBadge>2 </NumericBadge>\n        </TabsTrigger>\n        <TabsTrigger value='2'>\n          Tab 2<NumericBadge>2 </NumericBadge>\n        </TabsTrigger>\n        <TabsTrigger value='3'>\n          <CircleDashed />\n          Tab 3\n          <CircleDashed />\n          <NumericBadge>2 </NumericBadge>\n        </TabsTrigger>\n      </TabsList>\n      <TabsContent value='1'>Content for Tab 1</TabsContent>\n      <TabsContent value='2'>Content for Tab 2</TabsContent>\n      <TabsContent value='3'>Content for Tab 3</TabsContent>\n    </Tabs>\n  </div>\n);",
          "storyFile": "Tabs/Tabs.stories.tsx",
          "storyTitle": "Navigation/Tabs",
          "description": "A count in the trigger, which is what turns a tab into a status: how much is waiting behind it."
        },
        {
          "name": "Sizes",
          "code": "import { VStack } from '@wallarm-org/design-system/Stack';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@wallarm-org/design-system/Tabs';\n\nexport const Sizes = () => (\n  <div className='w-600'>\n    <VStack gap={32}>\n      <Tabs defaultValue='1' size='medium'>\n        <TabsList>\n          <TabsTrigger value='1'>Tab 1</TabsTrigger>\n          <TabsTrigger value='2'>Tab 2</TabsTrigger>\n          <TabsTrigger value='3'>Tab 3</TabsTrigger>\n        </TabsList>\n        <TabsContent value='1'>Content for Tab 1</TabsContent>\n        <TabsContent value='2'>Content for Tab 2</TabsContent>\n        <TabsContent value='3'>Content for Tab 3</TabsContent>\n      </Tabs>\n\n      <Tabs defaultValue='1' size='small'>\n        <TabsList>\n          <TabsTrigger value='1'>Tab 1</TabsTrigger>\n          <TabsTrigger value='2'>Tab 2</TabsTrigger>\n          <TabsTrigger value='3'>Tab 3</TabsTrigger>\n        </TabsList>\n        <TabsContent value='1'>Content for Tab 1</TabsContent>\n        <TabsContent value='2'>Content for Tab 2</TabsContent>\n        <TabsContent value='3'>Content for Tab 3</TabsContent>\n      </Tabs>\n    </VStack>\n  </div>\n);",
          "storyFile": "Tabs/Tabs.stories.tsx",
          "storyTitle": "Navigation/Tabs",
          "description": "`medium` and `small`. `Tabs` is the one in the switcher family with a size — the segmented pills are fixed height."
        },
        {
          "name": "Scrollable",
          "code": "import { Tabs, TabsContent, TabsList, TabsTrigger } from '@wallarm-org/design-system/Tabs';\n\nexport const Scrollable = () => (\n  <div className='w-400'>\n    <Tabs defaultValue='1'>\n      <TabsList>\n        {new Array(20).fill(null).map((_, index) => {\n          const key = index + 1;\n          return (\n            <TabsTrigger key={key} value={String(key)}>\n              Tab {key}\n            </TabsTrigger>\n          );\n        })}\n      </TabsList>\n\n      {new Array(20).fill(null).map((_, index) => {\n        const key = index + 1;\n        return (\n          <TabsContent key={key} value={String(key)}>\n            Content for Tab {key}\n          </TabsContent>\n        );\n      })}\n    </Tabs>\n  </div>\n);",
          "storyFile": "Tabs/Tabs.stories.tsx",
          "storyTitle": "Navigation/Tabs",
          "description": "Past the available width the list scrolls sideways with arrow buttons rather than wrapping, so the bar stays one line however many tabs there are."
        },
        {
          "name": "Controlled",
          "code": "import { useState } from 'react';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@wallarm-org/design-system/Tabs';\n\nexport const Controlled = () => {\n  const [value, setValue] = useState('1');\n\n  return (\n    <Tabs value={value} onChange={setValue}>\n      <TabsList>\n        <TabsTrigger value='1'>Tab 1</TabsTrigger>\n        <TabsTrigger value='2'>Tab 2</TabsTrigger>\n        <TabsTrigger value='3'>Tab 3</TabsTrigger>\n      </TabsList>\n      <TabsContent value='1'>Content for Tab 1</TabsContent>\n      <TabsContent value='2'>Content for Tab 2</TabsContent>\n      <TabsContent value='3'>Content for Tab 3</TabsContent>\n    </Tabs>\n  );\n};",
          "storyFile": "Tabs/Tabs.stories.tsx",
          "storyTitle": "Navigation/Tabs",
          "description": "`value` plus `onChange` when something outside the tabs decides which one is open — a route, or a step in a flow."
        },
        {
          "name": "Disabled",
          "code": "import { Tabs, TabsContent, TabsList, TabsTrigger } from '@wallarm-org/design-system/Tabs';\n\nexport const Disabled = () => (\n  <Tabs defaultValue='1'>\n    <TabsList>\n      <TabsTrigger value='1'>Tab 1</TabsTrigger>\n      <TabsTrigger value='2' disabled>\n        Tab 2 (Disabled)\n      </TabsTrigger>\n      <TabsTrigger value='3'>Tab 3</TabsTrigger>\n      <TabsTrigger value='4'>Tab 4</TabsTrigger>\n    </TabsList>\n    <TabsContent value='1'>Content for Tab 1</TabsContent>\n    <TabsContent value='2'>Content for Tab 2</TabsContent>\n    <TabsContent value='3'>Content for Tab 3</TabsContent>\n    <TabsContent value='4'>Content for Tab 4</TabsContent>\n  </Tabs>\n);",
          "storyFile": "Tabs/Tabs.stories.tsx",
          "storyTitle": "Navigation/Tabs",
          "description": "A disabled trigger keeps its place but drops out of the keyboard order. Prefer hiding a tab that has nothing behind it."
        },
        {
          "name": "WithSeparator",
          "code": "import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { Ellipsis } from '@wallarm-org/design-system/icons';\nimport { Tabs, TabsButton, TabsContent, TabsList, TabsSeparator, TabsTrigger } from '@wallarm-org/design-system/Tabs';\n\nexport const WithSeparator = () => (\n  <div className='w-600'>\n    <Tabs defaultValue='1'>\n      <TabsList>\n        <TabsTrigger value='1'>Tab 1</TabsTrigger>\n        <TabsTrigger value='2'>Tab 2</TabsTrigger>\n        <TabsTrigger value='3'>Tab 3</TabsTrigger>\n        <TabsSeparator />\n        <DropdownMenu>\n          <DropdownMenuTrigger asChild>\n            <TabsButton>\n              <Ellipsis />\n              More\n            </TabsButton>\n          </DropdownMenuTrigger>\n          <DropdownMenuContent>\n            <DropdownMenuItem>Action 1</DropdownMenuItem>\n            <DropdownMenuItem>Action 2</DropdownMenuItem>\n          </DropdownMenuContent>\n        </DropdownMenu>\n      </TabsList>\n      <TabsContent value='1'>Content for Tab 1</TabsContent>\n      <TabsContent value='2'>Content for Tab 2</TabsContent>\n      <TabsContent value='3'>Content for Tab 3</TabsContent>\n    </Tabs>\n  </div>\n);",
          "storyFile": "Tabs/Tabs.stories.tsx",
          "storyTitle": "Navigation/Tabs",
          "description": "`TabsSeparator` groups the triggers inside one bar, for when two of them belong together more than the rest."
        },
        {
          "name": "WithLineActions",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { CircleDashed, Ellipsis } from '@wallarm-org/design-system/icons';\nimport { Tabs, TabsButton, TabsContent, TabsLineActions, TabsList, TabsSeparator, TabsTrigger } from '@wallarm-org/design-system/Tabs';\n\nexport const WithLineActions = () => (\n  <div className='w-600'>\n    <Tabs defaultValue='1'>\n      <TabsList>\n        <TabsTrigger value='1'>Tab 1</TabsTrigger>\n        <TabsTrigger value='2'>Tab 2</TabsTrigger>\n        <TabsTrigger value='3'>Tab 3</TabsTrigger>\n        <TabsSeparator />\n        <DropdownMenu>\n          <DropdownMenuTrigger asChild>\n            <TabsButton>\n              <Ellipsis />\n              More\n            </TabsButton>\n          </DropdownMenuTrigger>\n          <DropdownMenuContent>\n            <DropdownMenuItem>Action 1</DropdownMenuItem>\n            <DropdownMenuItem>Action 2</DropdownMenuItem>\n          </DropdownMenuContent>\n        </DropdownMenu>\n\n        <TabsLineActions>\n          <Button variant='ghost' color='neutral' size='medium'>\n            <CircleDashed />\n          </Button>\n\n          <TabsSeparator mx={8} />\n\n          <DropdownMenu>\n            <DropdownMenuTrigger asChild>\n              <Button variant='secondary' color='brand' size='medium'>\n                <CircleDashed />\n                Button\n              </Button>\n            </DropdownMenuTrigger>\n            <DropdownMenuContent>\n              <DropdownMenuItem>Action 1</DropdownMenuItem>\n              <DropdownMenuItem>Action 2</DropdownMenuItem>\n            </DropdownMenuContent>\n          </DropdownMenu>\n        </TabsLineActions>\n      </TabsList>\n      <TabsContent value='1'>Content for Tab 1</TabsContent>\n      <TabsContent value='2'>Content for Tab 2</TabsContent>\n      <TabsContent value='3'>Content for Tab 3</TabsContent>\n    </Tabs>\n  </div>\n);",
          "storyFile": "Tabs/Tabs.stories.tsx",
          "storyTitle": "Navigation/Tabs",
          "description": "`TabsLineActions` puts controls on the right of the bar itself, which is where an action about the whole section belongs rather than inside a panel."
        }
      ]
    },
    {
      "name": "Tag",
      "description": "An interactive chip for a keyword or attribute the reader can select or remove — a chip that only states a value is a `Badge`. Give it one job: Carbon warns against tags carrying several functions at once, and a chip that both filters and deletes is one people trigger by accident.",
      "importPath": "@wallarm-org/design-system/Tag",
      "props": [
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "disabled",
          "type": "{ true: string; false: string; }",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "size",
          "type": "\"small\" | \"medium\" | \"large\" | null | undefined",
          "required": false,
          "defaultValue": "medium"
        },
        {
          "name": "asChild",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "disabled",
          "options": [
            "true",
            "false"
          ]
        }
      ],
      "subComponents": [
        {
          "name": "TagClose",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Tag } from '@wallarm-org/design-system/Tag';\n\nexport const Basic = () => <Tag>Tag</Tag>;",
          "storyFile": "Tag/Tag.stories.tsx",
          "storyTitle": "Status Indication/Tag",
          "description": "The default. It is focusable and clickable, which is what separates it from a badge even when\nit looks the same."
        },
        {
          "name": "Sizes",
          "code": "import { HStack } from '@wallarm-org/design-system/Stack';\nimport { Tag } from '@wallarm-org/design-system/Tag';\n\nexport const Sizes = () => (\n  <HStack align='center' gap={8}>\n    <Tag size='medium'>\n      Medium Tag\n    </Tag>\n    <Tag size='large'>\n      Large Tag\n    </Tag>\n  </HStack>\n);",
          "storyFile": "Tag/Tag.stories.tsx",
          "storyTitle": "Status Indication/Tag",
          "description": "The same two heights as `Badge`, so a row mixing them stays level."
        },
        {
          "name": "Disabled",
          "code": "import { HStack } from '@wallarm-org/design-system/Stack';\nimport { Tag } from '@wallarm-org/design-system/Tag';\n\nexport const Disabled = () => (\n  <HStack gap={8}>\n    <Tag size='medium' disabled>\n      Disabled Medium\n    </Tag>\n    <Tag size='large' disabled>\n      Disabled Large\n    </Tag>\n  </HStack>\n);",
          "storyFile": "Tag/Tag.stories.tsx",
          "storyTitle": "Status Indication/Tag",
          "description": "Out of the tab order and unclickable, but still readable — a filter that cannot currently\napply is still information."
        },
        {
          "name": "Closable",
          "code": "import { useState } from 'react';\nimport { Tag, TagClose } from '@wallarm-org/design-system/Tag';\n\nexport const Closable = () => {\n  const [isVisible, setIsVisible] = useState<boolean>(true);\n\n  return (\n    <>\n      {isVisible && (\n        <Tag data-testid='tag'>\n          Closable tag\n          <TagClose onClick={() => setIsVisible(false)} />\n        </Tag>\n      )}\n    </>\n  );\n};",
          "storyFile": "Tag/Tag.stories.tsx",
          "storyTitle": "Status Indication/Tag",
          "description": "A dismiss control for a value the reader added, such as an applied filter. Removal is the\nonly thing the control should do."
        },
        {
          "name": "Selectable",
          "code": "import { createListCollection } from '@ark-ui/react/collection';\nimport { Earth } from '@wallarm-org/design-system/icons';\nimport { Select, SelectButtonTag, SelectButtonTagValue, SelectContent, type SelectDataItem, SelectOption, SelectOptionIndicator, SelectOptionText, SelectPositioner } from '@wallarm-org/design-system/Select';\nimport { VStack } from '@wallarm-org/design-system/Stack';\n\nexport const Selectable = () => {\n  const collection = createListCollection<SelectDataItem>({\n    items: [\n      {\n        value: 'UTC',\n        label: 'UTC',\n      },\n      {\n        value: 'UTC+1',\n        label: 'UTC+1',\n      },\n      {\n        value: 'UTC+2',\n        label: 'UTC+2',\n      },\n      {\n        value: 'UTC+3',\n        label: 'UTC+3',\n      },\n      {\n        value: 'UTC+4',\n        label: 'UTC+4',\n      },\n      {\n        value: 'UTC+5',\n        label: 'UTC+5',\n      },\n      {\n        value: 'UTC+6',\n        label: 'UTC+6',\n      },\n      {\n        value: 'UTC+7',\n        label: 'UTC+7',\n      },\n    ],\n    isItemDisabled: item => item.value === 'UTC+2',\n  });\n\n  return (\n    <VStack gap={8}>\n      <Select collection={collection}>\n        <SelectButtonTag>\n          <Earth />\n          <SelectButtonTagValue placeholder='Timezone' />\n        </SelectButtonTag>\n\n        <SelectPositioner>\n          <SelectContent>\n            {collection.items.map(skill => (\n              <SelectOption key={skill.value} item={skill}>\n                <SelectOptionText>{skill.label}</SelectOptionText>\n                <SelectOptionIndicator />\n              </SelectOption>\n            ))}\n          </SelectContent>\n        </SelectPositioner>\n      </Select>\n\n      <Select collection={collection}>\n        <SelectButtonTag size='large'>\n          <Earth />\n          <SelectButtonTagValue placeholder='Timezone' />\n        </SelectButtonTag>\n\n        <SelectPositioner>\n          <SelectContent>\n            {collection.items.map(skill => (\n              <SelectOption key={skill.value} item={skill}>\n                <SelectOptionText>{skill.label}</SelectOptionText>\n                <SelectOptionIndicator />\n              </SelectOption>\n            ))}\n          </SelectContent>\n        </SelectPositioner>\n      </Select>\n    </VStack>\n  );\n};",
          "storyFile": "Tag/Tag.stories.tsx",
          "storyTitle": "Status Indication/Tag",
          "description": "A toggle, for filtering by tapping the values themselves. Selected state has to be visible\nwithout colour alone."
        },
        {
          "name": "WithIcons",
          "code": "import { Earth, Info } from '@wallarm-org/design-system/icons';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\nimport { Tag } from '@wallarm-org/design-system/Tag';\n\nexport const WithIcons = () => (\n  <VStack gap={12} align='stretch'>\n    <VStack gap={8}>\n      <HStack gap={8}>\n        <Tag size='medium'>\n          <Earth />\n          Tag with left icon\n        </Tag>\n        <Tag size='medium'>\n          Tag with right icon\n          <Info />\n        </Tag>\n        <Tag size='medium'>\n          <Earth />\n          Tag with left and right icons\n          <Info />\n        </Tag>\n      </HStack>\n    </VStack>\n    <VStack gap={8}>\n      <HStack gap={8}>\n        <Tag size='large'>\n          <Earth />\n          Tag with left icon\n        </Tag>\n        <Tag size='large'>\n          Tag with right icon\n          <Info />\n        </Tag>\n        <Tag size='large'>\n          <Earth />\n          Tag with left and right icons\n          <Info />\n        </Tag>\n      </HStack>\n    </VStack>\n  </VStack>\n);",
          "storyFile": "Tag/Tag.stories.tsx",
          "storyTitle": "Status Indication/Tag",
          "description": "An icon beside the label, carrying the kind of thing rather than its state."
        },
        {
          "name": "WithOnClick",
          "code": "import { Tag } from '@wallarm-org/design-system/Tag';\n\nexport const WithOnClick = () => (\n  <Tag onClick={onTagClick}>\n    Click me\n  </Tag>\n);",
          "storyFile": "Tag/Tag.stories.tsx",
          "storyTitle": "Status Indication/Tag",
          "description": "A plain click handler, for a chip that navigates or opens rather than toggling — but not as a\nlink, which Carbon rules out for tags."
        }
      ]
    },
    {
      "name": "TemporalCore",
      "importPath": "@wallarm-org/design-system/TemporalCore",
      "props": [],
      "variants": [],
      "subComponents": [],
      "examples": []
    },
    {
      "name": "Text",
      "description": "Geist for body copy, labels and anything read as prose — reach for `Heading` when the text is a title and `Link` when it navigates. Weight carries emphasis and colour carries de-emphasis, so build hierarchy from those rather than by changing size.",
      "importPath": "@wallarm-org/design-system/Text",
      "props": [
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "color",
          "type": "{ primary: string; 'primary-alt': string; secondary: string; 'secondary-alt': string; 'tertiary-alt': string; danger: string; inherit: string; }",
          "required": false,
          "defaultValue": "inherit"
        },
        {
          "name": "size",
          "type": "{ xs: string; sm: string; md: string; lg: string; xl: string; }",
          "required": false,
          "defaultValue": "lg"
        },
        {
          "name": "weight",
          "type": "{ light: string; regular: string; medium: string; bold: string; }",
          "required": false,
          "defaultValue": "regular"
        },
        {
          "name": "align",
          "type": "{ left: string; center: string; right: string; }",
          "required": false
        },
        {
          "name": "inline",
          "type": "{ true: string; }",
          "required": false
        },
        {
          "name": "grow",
          "type": "{ true: string; }",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "truncate",
          "type": "{ true: string; false: string; }",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "decoration",
          "type": "{ dashed: string; }",
          "required": false
        },
        {
          "name": "lineHeight",
          "type": "{ none: string; tight: string; snug: string; normal: string; relaxed: string; }",
          "required": false
        },
        {
          "name": "textTransform",
          "type": "{ uppercase: string; lowercase: string; capitalize: string; none: string; }",
          "required": false
        },
        {
          "name": "asChild",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "lineClamp",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "size",
          "options": [
            "xs",
            "sm",
            "md",
            "lg",
            "xl"
          ]
        },
        {
          "name": "weight",
          "options": [
            "light",
            "regular",
            "medium",
            "bold"
          ]
        },
        {
          "name": "color",
          "options": [
            "primary",
            "primary-alt",
            "secondary",
            "secondary-alt",
            "tertiary-alt",
            "danger",
            "inherit"
          ]
        },
        {
          "name": "align",
          "options": [
            "left",
            "center",
            "right"
          ]
        },
        {
          "name": "inline",
          "options": [
            "true"
          ]
        },
        {
          "name": "grow",
          "options": [
            "true"
          ]
        },
        {
          "name": "truncate",
          "options": [
            "true",
            "false"
          ]
        },
        {
          "name": "decoration",
          "options": [
            "dashed"
          ]
        },
        {
          "name": "lineHeight",
          "options": [
            "none",
            "tight",
            "snug",
            "normal",
            "relaxed"
          ]
        },
        {
          "name": "textTransform",
          "options": [
            "uppercase",
            "lowercase",
            "capitalize",
            "none"
          ]
        }
      ],
      "subComponents": [],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Text } from '@wallarm-org/design-system/Text';\n\nexport const Basic = () => (\n  <Text>Default body text</Text>\n);",
          "storyFile": "Text/Text.stories.tsx",
          "storyTitle": "Typography/Text",
          "description": "The default step. Text inherits its colour from the surroundings, which is why de-emphasis is\na deliberate choice rather than the absence of one."
        },
        {
          "name": "Sizes",
          "code": "import { VStack } from '@wallarm-org/design-system/Stack';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const Sizes = () => (\n  <VStack gap={24} align='start'>\n    {SIZES.map(({ size, metrics }) => (\n      <VStack key={size} gap={4} align='start'>\n        <Text size='xs' color='secondary'>\n          size=&apos;{size}&apos; · {metrics}\n        </Text>\n        <Text size={size}>\n          The quick brown fox jumps over the lazy dog\n        </Text>\n      </VStack>\n    ))}\n  </VStack>\n);",
          "storyFile": "Text/Text.stories.tsx",
          "storyTitle": "Typography/Text",
          "description": "The ramp, for density rather than hierarchy — step down in a dense table, not to signal that\nsomething matters less. Note that `md` sets no size of its own and inherits from its\ncontainer, so prefer an explicit step until that is fixed."
        },
        {
          "name": "Weights",
          "code": "import { VStack } from '@wallarm-org/design-system/Stack';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const Weights = () => (\n  <VStack align='start'>\n    <Text size='lg' weight='light'>\n      Light Weight Body Text\n    </Text>\n    <Text size='lg' weight='regular'>\n      Regular Weight Body Text\n    </Text>\n    <Text size='lg' weight='medium'>\n      Medium Weight Body Text\n    </Text>\n    <Text size='lg' weight='bold'>\n      Bold Weight Body Text\n    </Text>\n  </VStack>\n);",
          "storyFile": "Text/Text.stories.tsx",
          "storyTitle": "Typography/Text",
          "description": "All four weights at one size. Weight is emphasis within a level, never a way to create one."
        },
        {
          "name": "Colors",
          "code": "import { VStack } from '@wallarm-org/design-system/Stack';\nimport { Text } from '@wallarm-org/design-system/Text';\n\nexport const Colors = () => (\n  <VStack align='start'>\n    <Text color='primary'>\n      Primary color text\n    </Text>\n    <Text color='primary-alt'>\n      Primary alt color text\n    </Text>\n    <Text color='secondary'>\n      Secondary color text\n    </Text>\n    <Text color='secondary-alt'>\n      Secondary alt color text\n    </Text>\n    <Text color='tertiary-alt'>\n      Tertiary alt color text\n    </Text>\n  </VStack>\n);",
          "storyFile": "Text/Text.stories.tsx",
          "storyTitle": "Typography/Text",
          "description": "The de-emphasis ladder. Colour is how text recedes; a smaller size only makes it harder to\nread."
        },
        {
          "name": "AsChild",
          "code": "import { Text } from '@wallarm-org/design-system/Text';\n\nexport const AsChild = () => (\n  <Text size='lg' weight='medium' asChild>\n    <span>Custom Span Element with AsChild</span>\n  </Text>\n);",
          "storyFile": "Text/Text.stories.tsx",
          "storyTitle": "Typography/Text",
          "description": "`asChild` puts the typography on your own element, for when the tag matters to the document\nbut the styling should still come from here."
        }
      ]
    },
    {
      "name": "Textarea",
      "description": "Multi-line free text, for answers that run to sentences — reach for `Input` when one line will do, since a tall box tells the reader to write more than you want. Like `Input`, it reads `Field` context for its label, description and error state.",
      "importPath": "@wallarm-org/design-system/Textarea",
      "props": [
        {
          "name": "minRows",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "maxRows",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, HTMLTextAreaElement> | undefined",
          "required": false
        },
        {
          "name": "disabled",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "name",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "value",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoComplete",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "maxLength",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "minLength",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "placeholder",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "readOnly",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "required",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "size",
          "type": "{ small: string; medium: string; default: string; 'inline-edit': string; }",
          "required": false,
          "defaultValue": "default"
        },
        {
          "name": "error",
          "type": "{ true: string; false: string; }",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "size",
          "options": [
            "small",
            "medium",
            "default",
            "inline-edit"
          ]
        }
      ],
      "subComponents": [],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Textarea } from '@wallarm-org/design-system/Textarea';\n\n<Textarea />",
          "storyFile": "Textarea/Textarea.stories.tsx",
          "storyTitle": "Inputs/Textarea",
          "description": "The bare control at its default height. Size the box to the answer you expect — it is the\nclearest signal the reader gets about how much to write."
        },
        {
          "name": "Sizes",
          "code": "import { HStack } from '@wallarm-org/design-system/Stack';\nimport { Textarea } from '@wallarm-org/design-system/Textarea';\n\nexport const Sizes = () => (\n  <HStack gap={16} align='start'>\n    <Textarea size='default' />\n    <Textarea size='medium' />\n    <Textarea size='small' />\n  </HStack>\n);",
          "storyFile": "Textarea/Textarea.stories.tsx",
          "storyTitle": "Inputs/Textarea",
          "description": "The same 36 / 32 / 24px scale as `Input`, applied to the single-row height, so a textarea\nlines up with the fields around it before it grows."
        },
        {
          "name": "Focused",
          "code": "import { Textarea } from '@wallarm-org/design-system/Textarea';\n\n<Textarea />",
          "storyFile": "Textarea/Textarea.stories.tsx",
          "storyTitle": "Inputs/Textarea",
          "description": "Focus is a ring outside the border, as on every other field, so the box doesn't shift when\nthe reader tabs into it."
        },
        {
          "name": "Disabled",
          "code": "import { Textarea } from '@wallarm-org/design-system/Textarea';\n\n<Textarea disabled />",
          "storyFile": "Textarea/Textarea.stories.tsx",
          "storyTitle": "Inputs/Textarea",
          "description": "Dimmed and not focusable. Say elsewhere what would enable it."
        },
        {
          "name": "WithValue",
          "code": "import { Textarea } from '@wallarm-org/design-system/Textarea';\n\n<Textarea value=\"Some value...\" />",
          "storyFile": "Textarea/Textarea.stories.tsx",
          "storyTitle": "Inputs/Textarea",
          "description": "A filled box. Text starts at the top rather than centring, which is why the height you\nchoose reads as an invitation."
        },
        {
          "name": "WithError",
          "code": "import { Textarea } from '@wallarm-org/design-system/Textarea';\n\n<Textarea error />",
          "storyFile": "Textarea/Textarea.stories.tsx",
          "storyTitle": "Inputs/Textarea",
          "description": "`error` reddens the border and sets `aria-invalid`; the message is `FieldError`'s job."
        },
        {
          "name": "AutoResize",
          "code": "import { Textarea } from '@wallarm-org/design-system/Textarea';\n\nexport const AutoResize = () => (\n  <div style={{ width: 280 }}>\n    <Textarea minRows={1} maxRows={5} placeholder='Auto-resize: 1 to 5 rows' />\n  </div>\n);",
          "storyFile": "Textarea/Textarea.stories.tsx",
          "storyTitle": "Inputs/Textarea",
          "description": "Passing `maxRows` turns auto-resize on: the box starts at `minRows` and grows with the\ntext until it hits the cap, then scrolls. Without `maxRows` the height is fixed."
        },
        {
          "name": "WithFooter",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuItemContent, DropdownMenuItemText, DropdownMenuLabel, DropdownMenuShortcut, DropdownMenuTrigger } from '@wallarm-org/design-system/DropdownMenu';\nimport { ArrowUp, Settings2 } from '@wallarm-org/design-system/icons';\nimport { InputGroup, InputGroupAddon } from '@wallarm-org/design-system/InputGroup';\nimport { HStack } from '@wallarm-org/design-system/Stack';\nimport { Switch, SwitchControl } from '@wallarm-org/design-system/Switch';\nimport { Text } from '@wallarm-org/design-system/Text';\nimport { Textarea } from '@wallarm-org/design-system/Textarea';\n\nexport const WithFooter = () => {\n  const toolItems = Array.from({ length: 6 }, (_, i) => ({\n    id: String(i + 1),\n    tool: '{tool-name}',\n    desc: 'Description',\n    enabled: true,\n  }));\n\n  return (\n    <div style={{ width: 480 }}>\n      <InputGroup>\n        <Textarea minRows={1} maxRows={3} placeholder='Ask Wally...' />\n\n        <InputGroupAddon align='block-end'>\n          <HStack fullWidth align='center' justify='between'>\n            <DropdownMenu closeOnSelect={false}>\n              <DropdownMenuTrigger>\n                <Button variant='secondary' size='small' color='neutral'>\n                  <Settings2 />\n                </Button>\n              </DropdownMenuTrigger>\n\n              <DropdownMenuContent className='w-304 h-290 overscroll-none'>\n                <DropdownMenuLabel className='sticky top-0 z-50 bg-bg-surface-2'>\n                  Always allowed in this conversation\n                </DropdownMenuLabel>\n\n                {toolItems.map(item => (\n                  <DropdownMenuItem key={`${item.id}`} className='w-full'>\n                    <DropdownMenuItemContent>\n                      <DropdownMenuItemText>{item.tool}</DropdownMenuItemText>\n                      <Text size='xs' color='secondary'>\n                        {item.desc}\n                      </Text>\n                    </DropdownMenuItemContent>\n\n                    <DropdownMenuShortcut>\n                      <Switch checked={item.enabled}>\n                        <SwitchControl />\n                      </Switch>\n                    </DropdownMenuShortcut>\n                  </DropdownMenuItem>\n                ))}\n              </DropdownMenuContent>\n            </DropdownMenu>\n\n            <Button variant='primary' color='brand' size='small'>\n              <ArrowUp />\n            </Button>\n          </HStack>\n        </InputGroupAddon>\n      </InputGroup>\n    </div>\n  );\n};",
          "storyFile": "Textarea/Textarea.stories.tsx",
          "storyTitle": "Inputs/Textarea",
          "description": "Inside an `InputGroup` with a `block-end` addon, which is how the composer pattern is\nbuilt — auto-resize plus a toolbar that stays attached as the box grows."
        }
      ]
    },
    {
      "name": "ThemeProvider",
      "importPath": "@wallarm-org/design-system/ThemeProvider",
      "props": [
        {
          "name": "defaultTheme",
          "type": "Theme | undefined",
          "required": false,
          "defaultValue": "light"
        },
        {
          "name": "storageKey",
          "type": "string | undefined",
          "required": false,
          "defaultValue": "wasd-theme"
        },
        {
          "name": "defaultFrameStyle",
          "type": "FrameStyle | undefined",
          "required": false,
          "description": "Frame style used until the user picks one.",
          "defaultValue": "neutral"
        },
        {
          "name": "frameStyleStorageKey",
          "type": "string | undefined",
          "required": false,
          "defaultValue": "wasd-frame-style"
        }
      ],
      "variants": [],
      "subComponents": [],
      "examples": []
    },
    {
      "name": "TimeInput",
      "description": "A time typed segment by segment, the companion to `DateInput` — `showTimeDropdown` adds a list of times for when the reader would rather pick than type. It takes React Aria time objects, and hour cycle comes from `DateFormatProvider` app-wide rather than per input.",
      "importPath": "@wallarm-org/design-system/TimeInput",
      "props": [
        {
          "name": "showIcon",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether to show the leading icon. Default: true.",
          "defaultValue": "true"
        },
        {
          "name": "error",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the input has an error state. Sets `aria-invalid` and error styling.",
          "defaultValue": "false"
        },
        {
          "name": "disabled",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the input is disabled. Prevents user interaction.",
          "defaultValue": "false"
        },
        {
          "name": "readOnly",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the input is read-only. Segments are focusable but not editable.",
          "defaultValue": "false"
        },
        {
          "name": "placeholder",
          "type": "string | undefined",
          "required": false,
          "description": "Placeholder shown when no value is selected."
        },
        {
          "name": "size",
          "type": "TemporalInputSize | undefined",
          "required": false,
          "description": "Visual size. Default: 'default' (36px).",
          "defaultValue": "default"
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "value",
          "type": "TimeValue | null | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "TimeValue | null | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "complex",
          "required": false
        },
        {
          "name": "minValue",
          "type": "TimeValue | undefined",
          "required": false
        },
        {
          "name": "maxValue",
          "type": "TimeValue | undefined",
          "required": false
        },
        {
          "name": "placeholderValue",
          "type": "TimeValue | undefined",
          "required": false
        },
        {
          "name": "name",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "isRequired",
          "type": "boolean | undefined",
          "required": false,
          "description": "Marks the field as required in assistive tech and HTML form validation."
        },
        {
          "name": "showTimeDropdown",
          "type": "boolean | undefined",
          "required": false,
          "description": "Show dropdown for time selection with arrow navigation."
        },
        {
          "name": "timeStep",
          "type": "number | undefined",
          "required": false,
          "description": "Time interval in minutes for dropdown options. Default: 30.",
          "defaultValue": "30"
        },
        {
          "name": "granularity",
          "type": "TimeInputGranularity | undefined",
          "required": false,
          "description": "Smallest editable unit.\n- 'hour': hours only\n- 'minute': hours and minutes (default)\n- 'second': hours, minutes, and seconds",
          "defaultValue": "minute"
        }
      ],
      "variants": [],
      "subComponents": [],
      "examples": [
        {
          "name": "Basic",
          "code": "import { TimeInput } from '@wallarm-org/design-system/TimeInput';\n\nexport const Basic = () => {\n  return <TimeInput />;\n};",
          "storyFile": "TimeInput/TimeInput.stories.tsx",
          "storyTitle": "Inputs Date/TimeInput",
          "description": "The bare field, behaving exactly like `DateInput`: arrows step a segment, typing fills it and\nadvances."
        },
        {
          "name": "States",
          "code": "import { Time } from '@wallarm-org/design-system';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\nimport { TimeInput } from '@wallarm-org/design-system/TimeInput';\n\nexport const States = () => (\n  <HStack gap={24}>\n    <VStack gap={12}>\n      <TimeInput />\n      <TimeInput defaultValue={new Time(22, 0)} />\n    </VStack>\n    <VStack gap={12}>\n      <TimeInput disabled />\n      <TimeInput disabled defaultValue={new Time(14, 30)} />\n    </VStack>\n    <VStack gap={12}>\n      <TimeInput error />\n      <TimeInput error defaultValue={new Time(14, 30)} />\n    </VStack>\n  </HStack>\n);",
          "storyFile": "TimeInput/TimeInput.stories.tsx",
          "storyTitle": "Inputs Date/TimeInput",
          "description": "Default, disabled and error, matching `DateInput` so a form containing both stays consistent."
        },
        {
          "name": "Icon",
          "code": "import { Time } from '@wallarm-org/design-system';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\nimport { TimeInput } from '@wallarm-org/design-system/TimeInput';\n\nexport const Icon = () => (\n  <HStack gap={24}>\n    <VStack gap={12}>\n      <TimeInput showIcon />\n      <TimeInput showIcon defaultValue={new Time(22, 0)} />\n    </VStack>\n    <VStack gap={12}>\n      <TimeInput showIcon={false} />\n      <TimeInput showIcon={false} defaultValue={new Time(22, 0)} />\n    </VStack>\n  </HStack>\n);",
          "storyFile": "TimeInput/TimeInput.stories.tsx",
          "storyTitle": "Inputs Date/TimeInput",
          "description": "A clock icon as decoration. It opens nothing on its own — the dropdown is a separate opt-in."
        },
        {
          "name": "Sizes",
          "code": "import { Time } from '@wallarm-org/design-system';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\nimport { TimeInput } from '@wallarm-org/design-system/TimeInput';\n\nexport const Sizes = () => (\n  <HStack gap={24}>\n    <VStack gap={16}>\n      <VStack gap={4}>\n        <TimeInput size='default' />\n      </VStack>\n      <VStack gap={4}>\n        <TimeInput size='medium' />\n      </VStack>\n      <VStack gap={4}>\n        <TimeInput size='small' />\n      </VStack>\n    </VStack>\n    <VStack gap={16}>\n      <VStack gap={4}>\n        <TimeInput size='default' defaultValue={new Time(22, 0)} />\n      </VStack>\n      <VStack gap={4}>\n        <TimeInput size='medium' defaultValue={new Time(22, 0)} />\n      </VStack>\n      <VStack gap={4}>\n        <TimeInput size='small' defaultValue={new Time(22, 0)} />\n      </VStack>\n    </VStack>\n  </HStack>\n);",
          "storyFile": "TimeInput/TimeInput.stories.tsx",
          "storyTitle": "Inputs Date/TimeInput",
          "description": "The shared height scale, so a time field lines up beside a date field."
        },
        {
          "name": "Filled",
          "code": "import { Time } from '@wallarm-org/design-system';\nimport { DateFormatProvider } from '@wallarm-org/design-system/DateFormatProvider';\nimport { VStack } from '@wallarm-org/design-system/Stack';\nimport { TimeInput } from '@wallarm-org/design-system/TimeInput';\n\nexport const Filled = () => (\n  <VStack gap={16}>\n    <DateFormatProvider order='day-first' hourCycle={24}>\n      <VStack gap={4}>\n        <TimeInput defaultValue={new Time(22, 0)} />\n      </VStack>\n    </DateFormatProvider>\n    <DateFormatProvider order='day-first' hourCycle={12}>\n      <VStack gap={4}>\n        <TimeInput defaultValue={new Time(22, 0)} />\n      </VStack>\n    </DateFormatProvider>\n  </VStack>\n);",
          "storyFile": "TimeInput/TimeInput.stories.tsx",
          "storyTitle": "Inputs Date/TimeInput",
          "description": "A held value beside a placeholder, with the clear affordance appearing only once there is a\nvalue."
        },
        {
          "name": "Granularity",
          "code": "import { DateFormatProvider } from '@wallarm-org/design-system/DateFormatProvider';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\nimport { TimeInput } from '@wallarm-org/design-system/TimeInput';\n\nexport const Granularity = () => (\n  <HStack gap={24}>\n    <DateFormatProvider order='day-first' hourCycle={12}>\n      <VStack gap={12}>\n        <TimeInput placeholder='hour' granularity='hour' />\n        <TimeInput placeholder='hour:min' granularity='minute' />\n        <TimeInput placeholder='hour:min:sec' granularity='second' />\n      </VStack>\n    </DateFormatProvider>\n    <DateFormatProvider order='day-first' hourCycle={24}>\n      <VStack gap={12}>\n        <TimeInput placeholder='hour' granularity='hour' />\n        <TimeInput placeholder='hour:min' granularity='minute' />\n        <TimeInput placeholder='hour:min:sec' granularity='second' />\n      </VStack>\n    </DateFormatProvider>\n  </HStack>\n);",
          "storyFile": "TimeInput/TimeInput.stories.tsx",
          "storyTitle": "Inputs Date/TimeInput",
          "description": "Hour, minute or second. Drop to `hour` where minutes would imply a precision the system does\nnot honour."
        },
        {
          "name": "TimeDropdownSteps",
          "code": "import { DateFormatProvider } from '@wallarm-org/design-system/DateFormatProvider';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\nimport { TimeInput } from '@wallarm-org/design-system/TimeInput';\n\nexport const TimeDropdownSteps = () => (\n  <HStack gap={24}>\n    <DateFormatProvider order='day-first' hourCycle={12}>\n      <VStack gap={12}>\n        <TimeInput placeholder='Every 15 min' showTimeDropdown timeStep={15} />\n        <TimeInput placeholder='Every 30 min' showTimeDropdown timeStep={30} />\n        <TimeInput placeholder='Every 60 min' showTimeDropdown timeStep={60} />\n      </VStack>\n    </DateFormatProvider>\n    <DateFormatProvider order='day-first' hourCycle={24}>\n      <VStack gap={12}>\n        <TimeInput placeholder='Every 15 min' showTimeDropdown timeStep={15} />\n        <TimeInput placeholder='Every 30 min' showTimeDropdown timeStep={30} />\n        <TimeInput placeholder='Every 60 min' showTimeDropdown timeStep={60} />\n      </VStack>\n    </DateFormatProvider>\n  </HStack>\n);",
          "storyFile": "TimeInput/TimeInput.stories.tsx",
          "storyTitle": "Inputs Date/TimeInput",
          "description": "`timeStep` sets the spacing of the offered times — fifteen, thirty or sixty minutes. Coarser\nsteps make the list scannable; the reader can still type an exact time."
        },
        {
          "name": "ReadOnly",
          "code": "import { Time } from '@wallarm-org/design-system';\nimport { DateFormatProvider } from '@wallarm-org/design-system/DateFormatProvider';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\nimport { TimeInput } from '@wallarm-org/design-system/TimeInput';\n\nexport const ReadOnly = () => (\n  <HStack gap={24}>\n    <VStack gap={12}>\n      <TimeInput readOnly defaultValue={new Time(22, 0)} data-testid='time-input-read-only' />\n    </VStack>\n    <DateFormatProvider order='day-first' hourCycle={12}>\n      <VStack gap={12}>\n        <TimeInput readOnly defaultValue={new Time(22, 0)} data-testid='time-input-read-only-12h' />\n      </VStack>\n    </DateFormatProvider>\n    <DateFormatProvider order='day-first' hourCycle={24}>\n      <VStack gap={12}>\n        <TimeInput readOnly defaultValue={new Time(22, 0)} data-testid='time-input-read-only-24h' />\n      </VStack>\n    </DateFormatProvider>\n  </HStack>\n);",
          "storyFile": "TimeInput/TimeInput.stories.tsx",
          "storyTitle": "Inputs Date/TimeInput",
          "description": "Value legible, every edit affordance gone, as on `DateInput`."
        }
      ]
    },
    {
      "name": "Timeline",
      "description": "A vertical run of events in the order they happened — a timeline records what occurred, so reach for `Progress` when the question is how far along something is rather than what has already taken place. `TimelineConnector` and `TimelineContent` are each optional, and the last item looks after itself: its line and its bottom padding go without any special casing.",
      "importPath": "@wallarm-org/design-system/Timeline",
      "props": [
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [
        {
          "name": "TimelineConnector",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "TimelineContent",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "TimelineDescription",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "align",
              "type": "{ left: string; center: string; right: string; }",
              "required": false
            },
            {
              "name": "inline",
              "type": "{ true: string; }",
              "required": false
            },
            {
              "name": "grow",
              "type": "{ true: string; }",
              "required": false
            },
            {
              "name": "truncate",
              "type": "{ true: string; false: string; }",
              "required": false
            },
            {
              "name": "decoration",
              "type": "{ dashed: string; }",
              "required": false
            },
            {
              "name": "lineHeight",
              "type": "{ none: string; tight: string; snug: string; normal: string; relaxed: string; }",
              "required": false
            },
            {
              "name": "textTransform",
              "type": "{ uppercase: string; lowercase: string; capitalize: string; none: string; }",
              "required": false
            },
            {
              "name": "lineClamp",
              "type": "number | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "TimelineIndicator",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "color",
              "type": "{ neutral: string; 'neutral-alt': string; brand: string; danger: string; success: string; info: string; }",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "description": "Applies the badge to its child element, such as a span or a native button."
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "TimelineItem",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "TimelineSeparator",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "spacing",
              "type": "complex",
              "required": false
            },
            {
              "name": "decorative",
              "type": "boolean | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "TimelineTitle",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "align",
              "type": "{ left: string; center: string; right: string; }",
              "required": false
            },
            {
              "name": "inline",
              "type": "{ true: string; }",
              "required": false
            },
            {
              "name": "grow",
              "type": "{ true: string; }",
              "required": false
            },
            {
              "name": "truncate",
              "type": "{ true: string; false: string; }",
              "required": false
            },
            {
              "name": "decoration",
              "type": "{ dashed: string; }",
              "required": false
            },
            {
              "name": "lineHeight",
              "type": "{ none: string; tight: string; snug: string; normal: string; relaxed: string; }",
              "required": false
            },
            {
              "name": "textTransform",
              "type": "{ uppercase: string; lowercase: string; capitalize: string; none: string; }",
              "required": false
            },
            {
              "name": "lineClamp",
              "type": "number | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Timeline, TimelineConnector, TimelineIndicator, TimelineItem, TimelineSeparator } from '@wallarm-org/design-system/Timeline';\n\nexport const Basic = () => (\n  <Timeline data-testid='timeline'>\n    <TimelineItem>\n      <TimelineConnector>\n        <TimelineIndicator>1</TimelineIndicator>\n        <TimelineSeparator />\n      </TimelineConnector>\n    </TimelineItem>\n    <TimelineItem>\n      <TimelineConnector>\n        <TimelineIndicator>2</TimelineIndicator>\n        <TimelineSeparator />\n      </TimelineConnector>\n    </TimelineItem>\n    <TimelineItem>\n      <TimelineConnector>\n        <TimelineIndicator>3</TimelineIndicator>\n        <TimelineSeparator />\n      </TimelineConnector>\n    </TimelineItem>\n    <TimelineItem>\n      <TimelineConnector>\n        <TimelineIndicator>4</TimelineIndicator>\n        <TimelineSeparator />\n      </TimelineConnector>\n    </TimelineItem>\n    <TimelineItem>\n      <TimelineConnector>\n        <TimelineIndicator>5</TimelineIndicator>\n        <TimelineSeparator />\n      </TimelineConnector>\n    </TimelineItem>\n  </Timeline>\n);",
          "storyFile": "Timeline/Timeline.stories.tsx",
          "storyTitle": "Data Display/Timeline",
          "description": "The rail on its own — numbered indicators with the line between them, and no line trailing\noff the bottom of the last one."
        },
        {
          "name": "WithContent",
          "code": "import { Timeline, TimelineConnector, TimelineContent, TimelineDescription, TimelineIndicator, TimelineItem, TimelineSeparator, TimelineTitle } from '@wallarm-org/design-system/Timeline';\n\nexport const WithContent = () => (\n  <div className='max-w-[360px]'>\n    <Timeline>\n      <TimelineItem>\n        <TimelineConnector>\n          <TimelineIndicator>1</TimelineIndicator>\n          <TimelineSeparator />\n        </TimelineConnector>\n        <TimelineContent>\n          <TimelineTitle>Order placed</TimelineTitle>\n          <TimelineDescription>The order was placed by the customer.</TimelineDescription>\n        </TimelineContent>\n      </TimelineItem>\n      <TimelineItem>\n        <TimelineConnector>\n          <TimelineIndicator>2</TimelineIndicator>\n          <TimelineSeparator />\n        </TimelineConnector>\n        <TimelineContent>\n          <TimelineTitle>Order confirmed</TimelineTitle>\n          <TimelineDescription>Payment received, order confirmed.</TimelineDescription>\n        </TimelineContent>\n      </TimelineItem>\n      <TimelineItem>\n        <TimelineConnector>\n          <TimelineIndicator>3</TimelineIndicator>\n          <TimelineSeparator />\n        </TimelineConnector>\n        <TimelineContent>\n          <TimelineTitle>Order shipped</TimelineTitle>\n          <TimelineDescription>\n            The package left the warehouse and is on its way. This step has the longest description\n            of the three, to show the connecting line stretching to match a taller row.\n          </TimelineDescription>\n        </TimelineContent>\n      </TimelineItem>\n    </Timeline>\n  </div>\n);",
          "storyFile": "Timeline/Timeline.stories.tsx",
          "storyTitle": "Data Display/Timeline",
          "description": "Content beside the rail. The line stretches to whatever height the row turns out to need,\nwhich is why the third step's long description does not break the rhythm."
        },
        {
          "name": "WithoutConnector",
          "code": "import { Timeline, TimelineContent, TimelineDescription, TimelineItem, TimelineTitle } from '@wallarm-org/design-system/Timeline';\n\nexport const WithoutConnector = () => (\n  <Timeline>\n    <TimelineItem>\n      <TimelineContent>\n        <TimelineTitle>Order placed</TimelineTitle>\n        <TimelineDescription>The order was placed by the customer.</TimelineDescription>\n      </TimelineContent>\n    </TimelineItem>\n    <TimelineItem>\n      <TimelineContent>\n        <TimelineTitle>Order confirmed</TimelineTitle>\n        <TimelineDescription>Payment received, order confirmed.</TimelineDescription>\n      </TimelineContent>\n    </TimelineItem>\n    <TimelineItem>\n      <TimelineContent>\n        <TimelineTitle>Order shipped</TimelineTitle>\n        <TimelineDescription>\n          The package left the warehouse and is on its way. This step has the longest description of\n          the three, to show the connecting line stretching to match a taller row.\n        </TimelineDescription>\n      </TimelineContent>\n    </TimelineItem>\n  </Timeline>\n);",
          "storyFile": "Timeline/Timeline.stories.tsx",
          "storyTitle": "Data Display/Timeline",
          "description": "Content with no rail at all — effectively a `List` of titles and descriptions, for when the\norder carries the sequence and a drawn line would only add furniture."
        }
      ]
    },
    {
      "name": "Toast",
      "description": "A transient notification fired from `useToast()` — you never place one in the tree, and a single `Toaster` at the app root owns placement, stacking and the timer. Because it disappears, nothing may live only here: reach for a `Dialog` when the reader has to decide, `Banner` for standing account state, and `Alert` for a message that belongs to a region. Actions on a toast stay optional for the same reason.",
      "importPath": "@wallarm-org/design-system/Toast",
      "props": [
        {
          "name": "toast",
          "type": "ToastData",
          "required": true
        }
      ],
      "variants": [
        {
          "name": "variant",
          "options": [
            "extended",
            "simple"
          ],
          "defaultValue": "simple"
        }
      ],
      "subComponents": [],
      "examples": [
        {
          "name": "Basic",
          "code": "export const Basic = () => {\n  return <ToastDemo />;\n};",
          "storyFile": "Toast/Toast.stories.tsx",
          "storyTitle": "Messaging/Toast",
          "description": "Every `type` from one place: the icon and colour come from it, and `default` has none. The second row fires the same toasts with the timer stopped, which is what the screenshot tests use."
        },
        {
          "name": "WithNestedOverlays",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Dialog, DialogBody, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@wallarm-org/design-system/Dialog';\nimport { Drawer, DrawerBody, DrawerContent, DrawerHeader, DrawerTitle, DrawerTrigger } from '@wallarm-org/design-system/Drawer';\nimport { VStack } from '@wallarm-org/design-system/Stack';\nimport { useToast } from '@wallarm-org/design-system/Toast';\n\nexport const WithNestedOverlays = () => {\n  const toast = useToast();\n\n  const fireToast = () =>\n    toast.create({\n      title: 'Saved',\n      description: 'This toast must render above every open overlay.',\n      type: 'success',\n      duration: STATIC_DURATION,\n    });\n\n  return (\n    <Drawer data-testid='overlay-drawer'>\n      <DrawerTrigger asChild>\n        <Button variant='outline' color='neutral'>\n          Open drawer\n        </Button>\n      </DrawerTrigger>\n\n      <DrawerContent>\n        <DrawerHeader>\n          <DrawerTitle>[Level 1] Drawer</DrawerTitle>\n        </DrawerHeader>\n\n        <DrawerBody>\n          <VStack gap={12} align='start'>\n            <Button variant='outline' color='neutral' onClick={fireToast}>\n              Show toast from drawer\n            </Button>\n\n            <Dialog>\n              <DialogTrigger asChild>\n                <Button variant='ghost' color='neutral'>\n                  Open nested dialog\n                </Button>\n              </DialogTrigger>\n\n              <DialogContent>\n                <DialogHeader>\n                  <DialogTitle>[Level 2] Dialog</DialogTitle>\n                </DialogHeader>\n\n                <DialogBody>\n                  <Button variant='outline' color='neutral' onClick={fireToast}>\n                    Show toast from nested dialog\n                  </Button>\n                </DialogBody>\n              </DialogContent>\n            </Dialog>\n          </VStack>\n        </DrawerBody>\n      </DrawerContent>\n    </Drawer>\n  );\n};",
          "storyFile": "Toast/Toast.stories.tsx",
          "storyTitle": "Messaging/Toast",
          "description": "A toast fired from inside a `Drawer`, and again from a `Dialog` on top of it, to prove it renders above every open overlay rather than behind them."
        },
        {
          "name": "UpdateLoadingToSuccess",
          "code": "import { useRef } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\nimport { useToast } from '@wallarm-org/design-system/Toast';\n\nexport const UpdateLoadingToSuccess = () => {\n  const toast = useToast();\n  const id = useRef<string | undefined>(undefined);\n  const createToast = (duration?: number) => {\n    id.current = toast.create({\n      title: 'Loading',\n      description: 'Loading ...',\n      type: 'loading',\n      variant: 'extended',\n      duration,\n    });\n  };\n  const updateToast = (duration?: number) => {\n    if (!id.current) {\n      return;\n    }\n    toast.update({\n      id: id.current,\n      title: 'Success',\n      description: 'Success!',\n      type: 'success',\n      variant: 'extended',\n      duration,\n    });\n  };\n  return (\n    <VStack gap={16} align='start'>\n      <VStack gap={4} align='start'>\n        <HStack gap={8} wrap='wrap'>\n          <Button variant='outline' color='neutral' onClick={() => createToast()}>\n            Create loading toast\n          </Button>\n          <Button variant='outline' color='neutral' onClick={() => updateToast()}>\n            Update to success\n          </Button>\n        </HStack>\n      </VStack>\n      <VStack gap={4} align='start'>\n        <HStack gap={8} wrap='wrap'>\n          <Button variant='secondary' color='neutral' onClick={() => createToast(STATIC_DURATION)}>\n            Create loading toast\n          </Button>\n          <Button variant='secondary' color='neutral' onClick={() => updateToast(STATIC_DURATION)}>\n            Update to success\n          </Button>\n        </HStack>\n      </VStack>\n    </VStack>\n  );\n};",
          "storyFile": "Toast/Toast.stories.tsx",
          "storyTitle": "Messaging/Toast",
          "description": "A loading toast has no timer and no progress bar, so it will not clear itself: `update()` the same id to resolve it to success or error."
        },
        {
          "name": "DescriptionKeepsExtended",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\nimport { useToast } from '@wallarm-org/design-system/Toast';\n\nexport const DescriptionKeepsExtended = () => {\n  const toast = useToast();\n  const withDescription = (duration?: number) =>\n    toast.create({\n      title: 'Failed to mark as True Positive',\n      description: 'resolved vector count must not exceed 500000',\n      type: 'error',\n      variant: 'simple',\n      duration,\n    });\n  const withoutDescription = (duration?: number) =>\n    toast.create({ title: 'Marked 2 attacks', type: 'success', variant: 'simple', duration });\n  return (\n    <VStack gap={16} align='start'>\n      <VStack gap={4} align='start'>\n        <HStack gap={8} wrap='wrap'>\n          <Button variant='outline' color='neutral' onClick={() => withDescription()}>\n            Simple with description\n          </Button>\n          <Button variant='outline' color='neutral' onClick={() => withoutDescription()}>\n            Simple without description\n          </Button>\n        </HStack>\n      </VStack>\n      <VStack gap={4} align='start'>\n        <HStack gap={8} wrap='wrap'>\n          <Button\n            variant='secondary'\n            color='neutral'\n            onClick={() => withDescription(STATIC_DURATION)}\n          >\n            Simple with description\n          </Button>\n          <Button\n            variant='secondary'\n            color='neutral'\n            onClick={() => withoutDescription(STATIC_DURATION)}\n          >\n            Simple without description\n          </Button>\n        </HStack>\n      </VStack>\n    </VStack>\n  );\n};",
          "storyFile": "Toast/Toast.stories.tsx",
          "storyTitle": "Messaging/Toast",
          "description": "A `description` is never dropped: ask for `simple` alongside one and the toast still reflows to `extended`, timer included. Passing no description keeps the one-line layout."
        },
        {
          "name": "SimpleWithActions",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\nimport { ToastActions, useToast } from '@wallarm-org/design-system/Toast';\n\nexport const SimpleWithActions = () => {\n  const toast = useToast();\n  const single = (duration?: number) =>\n    toast.create({\n      title: 'Message sent',\n      type: 'success',\n      variant: 'simple',\n      duration,\n      actions: (\n        <ToastActions>\n          <Button variant='secondary' size='small' color='neutral-alt' onClick={onToastAction}>\n            Undo\n          </Button>\n        </ToastActions>\n      ),\n    });\n  const double = (duration?: number) =>\n    toast.create({\n      title: 'Connection restored',\n      type: 'info',\n      variant: 'simple',\n      duration,\n      actions: (\n        <ToastActions>\n          <Button variant='secondary' size='small' color='neutral-alt' onClick={onToastAction}>\n            View\n          </Button>\n          <Button variant='secondary' size='small' color='neutral-alt' onClick={onToastAction}>\n            Dismiss\n          </Button>\n        </ToastActions>\n      ),\n    });\n  return (\n    <VStack gap={16} align='start'>\n      <VStack gap={4} align='start'>\n        <HStack gap={8} wrap='wrap'>\n          <Button variant='outline' color='neutral' onClick={() => single()}>\n            Simple Toast with Action\n          </Button>\n          <Button variant='outline' color='neutral' onClick={() => double()}>\n            Simple Toast with Two Actions\n          </Button>\n        </HStack>\n      </VStack>\n      <VStack gap={4} align='start'>\n        <HStack gap={8} wrap='wrap'>\n          <Button variant='secondary' color='neutral' onClick={() => single(STATIC_DURATION)}>\n            Simple Toast with Action\n          </Button>\n          <Button variant='secondary' color='neutral' onClick={() => double(STATIC_DURATION)}>\n            Simple Toast with Two Actions\n          </Button>\n        </HStack>\n      </VStack>\n    </VStack>\n  );\n};",
          "storyFile": "Toast/Toast.stories.tsx",
          "storyTitle": "Messaging/Toast",
          "description": "`simple` is a one-line title for about five seconds — as long as no `description` is passed with it. One action is the norm and two is the ceiling — they have to be optional, since the toast leaves on its own."
        },
        {
          "name": "ExtendedWithActions",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\nimport { ToastActions, useToast } from '@wallarm-org/design-system/Toast';\n\nexport const ExtendedWithActions = () => {\n  const toast = useToast();\n  const single = (duration?: number) =>\n    toast.create({\n      title: 'Extended Toast',\n      description: 'This is an extended toast with default layout.',\n      type: 'success',\n      variant: 'extended',\n      duration,\n      actions: (\n        <ToastActions>\n          <Button variant='secondary' size='small' color='neutral-alt' onClick={onToastAction}>\n            Action\n          </Button>\n        </ToastActions>\n      ),\n    });\n  const double = (duration?: number) =>\n    toast.create({\n      title: 'File processed',\n      description: 'Your file has been processed successfully.',\n      type: 'info',\n      variant: 'extended',\n      duration,\n      actions: (\n        <ToastActions>\n          <Button variant='secondary' size='small' color='neutral-alt' onClick={onToastAction}>\n            View\n          </Button>\n          <Button variant='secondary' size='small' color='neutral-alt' onClick={onToastAction}>\n            Download\n          </Button>\n        </ToastActions>\n      ),\n    });\n  return (\n    <VStack gap={16} align='start'>\n      <VStack gap={4} align='start'>\n        <HStack gap={8} wrap='wrap'>\n          <Button variant='outline' color='neutral' onClick={() => single()}>\n            Extended Toast with Action\n          </Button>\n          <Button variant='outline' color='neutral' onClick={() => double()}>\n            Extended Toast with Two Actions\n          </Button>\n        </HStack>\n      </VStack>\n      <VStack gap={4} align='start'>\n        <HStack gap={8} wrap='wrap'>\n          <Button variant='secondary' color='neutral' onClick={() => single(STATIC_DURATION)}>\n            Extended Toast with Action\n          </Button>\n          <Button variant='secondary' color='neutral' onClick={() => double(STATIC_DURATION)}>\n            Extended Toast with Two Actions\n          </Button>\n        </HStack>\n      </VStack>\n    </VStack>\n  );\n};",
          "storyFile": "Toast/Toast.stories.tsx",
          "storyTitle": "Messaging/Toast",
          "description": "`extended` adds a description and about ten seconds, for the cases where one sentence of context genuinely helps."
        },
        {
          "name": "LongText",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\nimport { useToast } from '@wallarm-org/design-system/Toast';\n\nexport const LongText = () => {\n  const toast = useToast();\n  const longTitle =\n    'This is a very very very long title that will be truncated after a certain number of lines';\n  const veryLongTitle = longTitle.repeat(4);\n  const longDescription =\n    'This is a very long description that will be truncated after a certain number of lines. ' +\n    'Hover over the description to see the full text in a tooltip. ' +\n    'This allows for better space management while still providing access to all the information.'.repeat(\n      2,\n    );\n  const simpleLong = (duration?: number) =>\n    toast.create({ title: longTitle, variant: 'simple', type: 'info', duration });\n  const extendedLong = (duration?: number) =>\n    toast.create({\n      title: veryLongTitle,\n      variant: 'extended',\n      description: longDescription,\n      type: 'info',\n      duration,\n    });\n  return (\n    <VStack gap={16} align='start'>\n      <VStack gap={4} align='start'>\n        <HStack gap={8} wrap='wrap'>\n          <Button variant='outline' color='neutral' onClick={() => simpleLong()}>\n            Simple with long title\n          </Button>\n          <Button variant='outline' color='neutral' onClick={() => extendedLong()}>\n            Extended with long text\n          </Button>\n        </HStack>\n      </VStack>\n      <VStack gap={4} align='start'>\n        <HStack gap={8} wrap='wrap'>\n          <Button variant='secondary' color='neutral' onClick={() => simpleLong(STATIC_DURATION)}>\n            Simple with long title\n          </Button>\n          <Button variant='secondary' color='neutral' onClick={() => extendedLong(STATIC_DURATION)}>\n            Extended with long text\n          </Button>\n        </HStack>\n      </VStack>\n    </VStack>\n  );\n};",
          "storyFile": "Toast/Toast.stories.tsx",
          "storyTitle": "Messaging/Toast",
          "description": "The title clamps to one line simple, two extended, and the description to four, with the full text in a tooltip. Pre-truncating your own copy fights it."
        },
        {
          "name": "WithoutCloseButton",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\nimport { useToast } from '@wallarm-org/design-system/Toast';\n\nexport const WithoutCloseButton = () => {\n  const toast = useToast();\n  const create = (duration?: number) =>\n    toast.create({\n      title: 'Non-closable toast',\n      variant: 'extended',\n      description: 'This toast cannot be closed manually.',\n      type: 'info',\n      closable: false,\n      duration,\n    });\n  return (\n    <VStack gap={16} align='start'>\n      <VStack gap={4} align='start'>\n        <HStack gap={8} wrap='wrap'>\n          <Button variant='outline' color='neutral' onClick={() => create()}>\n            Non-closable Toast\n          </Button>\n        </HStack>\n      </VStack>\n      <VStack gap={4} align='start'>\n        <HStack gap={8} wrap='wrap'>\n          <Button variant='secondary' color='neutral' onClick={() => create(STATIC_DURATION)}>\n            Non-closable Toast\n          </Button>\n        </HStack>\n      </VStack>\n    </VStack>\n  );\n};",
          "storyFile": "Toast/Toast.stories.tsx",
          "storyTitle": "Messaging/Toast",
          "description": "`closable: false` takes the X away, which is only right for an in-flight loading toast the reader must not lose."
        },
        {
          "name": "CustomIcon",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Activity } from '@wallarm-org/design-system/icons';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\nimport { useToast } from '@wallarm-org/design-system/Toast';\n\nexport const CustomIcon = () => {\n  const toast = useToast();\n  const withColor = (duration?: number) =>\n    toast.create({\n      title: 'Custom icon toast',\n      variant: 'extended',\n      description: 'This toast uses a custom icon that overrides the type-based icon.',\n      type: 'success',\n      icon: <Activity size='lg' className='text-purple-500' />,\n      duration,\n    });\n  const withoutColor = (duration?: number) =>\n    toast.create({\n      title: 'Custom icon with action',\n      variant: 'extended',\n      description: 'You can use any icon component as a custom icon.',\n      type: 'info',\n      icon: <Activity />,\n      duration,\n    });\n  return (\n    <VStack gap={16} align='start'>\n      <VStack gap={4} align='start'>\n        <HStack gap={8} wrap='wrap'>\n          <Button variant='outline' color='neutral' onClick={() => withColor()}>\n            Custom Icon with own color\n          </Button>\n          <Button variant='outline' color='neutral' onClick={() => withoutColor()}>\n            Custom Icon without color\n          </Button>\n        </HStack>\n      </VStack>\n      <VStack gap={4} align='start'>\n        <HStack gap={8} wrap='wrap'>\n          <Button variant='secondary' color='neutral' onClick={() => withColor(STATIC_DURATION)}>\n            Custom Icon with own color\n          </Button>\n          <Button variant='secondary' color='neutral' onClick={() => withoutColor(STATIC_DURATION)}>\n            Custom Icon without color\n          </Button>\n        </HStack>\n      </VStack>\n    </VStack>\n  );\n};",
          "storyFile": "Toast/Toast.stories.tsx",
          "storyTitle": "Messaging/Toast",
          "description": "A custom `icon` replaces the type’s own. It inherits the type colour unless it sets one, so the first here is deliberately purple and the second is not."
        },
        {
          "name": "CustomIconColors",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Activity, Info } from '@wallarm-org/design-system/icons';\nimport { HStack } from '@wallarm-org/design-system/Stack';\nimport { useToast } from '@wallarm-org/design-system/Toast';\n\nexport const CustomIconColors = () => {\n  const toast = useToast();\n  const examples = [\n    { name: 'default', label: 'Default', type: 'default' as const },\n    { name: 'loading', label: 'Loading', type: 'loading' as const },\n    { name: 'info', label: 'Info', type: 'info' as const },\n    { name: 'own-color', label: 'Own color', type: 'success' as const },\n  ];\n\n  return (\n    <HStack gap={8} wrap='wrap'>\n      {examples.map(({ name, label, type }) => (\n        <Button\n          key={name}\n          variant='outline'\n          color='neutral'\n          data-testid={`custom-icon-trigger-${name}`}\n          onClick={() =>\n            toast.create({\n              id: `custom-icon-${name}`,\n              title: `${label} custom icon`,\n              type,\n              duration: STATIC_DURATION,\n              icon: (\n                <Activity\n                  data-testid={`custom-icon-${name}-svg`}\n                  className={name === 'own-color' ? 'text-purple-500' : undefined}\n                />\n              ),\n            })\n          }\n        >\n          {label}\n        </Button>\n      ))}\n    </HStack>\n  );\n};",
          "storyFile": "Toast/Toast.stories.tsx",
          "storyTitle": "Messaging/Toast",
          "description": "Neutral custom icons follow the toast's foreground. A status supplies its colour, while an explicit icon colour takes precedence."
        }
      ]
    },
    {
      "name": "ToggleButton",
      "description": "A button that stays pressed — for something the reader flips in place and can see the result of, like pinning a panel or holding a filter on. Reach for `Switch` when it belongs in a settings form, and `SegmentedControl` when one of several options has to win.",
      "importPath": "@wallarm-org/design-system/ToggleButton",
      "props": [
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "color",
          "type": "string | undefined",
          "required": false,
          "defaultValue": "brand"
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "type",
          "type": "\"button\" | \"submit\" | \"reset\" | undefined",
          "required": false
        },
        {
          "name": "disabled",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "name",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "value",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "asChild",
          "type": "boolean | undefined",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "size",
          "type": "{ small: string; medium: string; large: string; 'inline-edit': string; }",
          "required": false,
          "defaultValue": "large"
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "loading",
          "type": "{ true: string; }",
          "required": false,
          "defaultValue": "false"
        },
        {
          "name": "as",
          "type": "C | undefined",
          "required": false
        },
        {
          "name": "fullWidth",
          "type": "{ true: string; false: string; }",
          "required": false
        },
        {
          "name": "variant",
          "type": "{ outline: string; ghost: string; }",
          "required": false,
          "defaultValue": "outline"
        },
        {
          "name": "active",
          "type": "{ true: string; false: string; }",
          "required": false
        },
        {
          "name": "onToggle",
          "type": "((active: boolean, event: MouseEvent<HTMLButtonElement, MouseEvent>) => void) | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "variant",
          "options": [
            "outline",
            "ghost"
          ]
        },
        {
          "name": "color",
          "options": [
            "brand",
            "neutral"
          ]
        },
        {
          "name": "active",
          "options": [
            "true",
            "false"
          ]
        }
      ],
      "subComponents": [],
      "examples": [
        {
          "name": "Basic",
          "code": "import { ToggleButton } from '@wallarm-org/design-system/ToggleButton';\n\nexport const Basic = () => (\n  <ToggleButton data-testid='toggle-button'>\n    Toggle Me\n  </ToggleButton>\n);",
          "storyFile": "ToggleButton/ToggleButton.stories.tsx",
          "storyTitle": "Actions/ToggleButton",
          "description": "Uncontrolled: the button tracks its own pressed state from `defaultValue`, and `onToggle`\nhands you the next value."
        },
        {
          "name": "VariantsAndColors",
          "code": "import { HStack, VStack } from '@wallarm-org/design-system/Stack';\nimport { ToggleButton } from '@wallarm-org/design-system/ToggleButton';\n\nexport const VariantsAndColors = () => (\n  <VStack>\n    <HStack>\n      <ToggleButton variant='outline' color='brand'>\n        Outline\n      </ToggleButton>\n      <ToggleButton variant='ghost' color='brand'>\n        Ghost\n      </ToggleButton>\n    </HStack>\n    <HStack>\n      <ToggleButton variant='outline' color='neutral'>\n        Outline\n      </ToggleButton>\n      <ToggleButton variant='ghost' color='neutral'>\n        Ghost\n      </ToggleButton>\n    </HStack>\n  </VStack>\n);",
          "storyFile": "ToggleButton/ToggleButton.stories.tsx",
          "storyTitle": "Actions/ToggleButton",
          "description": "`outline` reads as a control that is always there; `ghost` disappears until needed, for\ntoolbars. `brand` tints the pressed state, `neutral` keeps it grey for when several toggles sit\ntogether and colour would shout."
        },
        {
          "name": "Sizes",
          "code": "import { HStack } from '@wallarm-org/design-system/Stack';\nimport { ToggleButton } from '@wallarm-org/design-system/ToggleButton';\n\nexport const Sizes = () => (\n  <HStack align='center'>\n    <ToggleButton size='small'>\n      Small\n    </ToggleButton>\n    <ToggleButton size='medium'>\n      Medium\n    </ToggleButton>\n    <ToggleButton size='large'>\n      Large\n    </ToggleButton>\n  </HStack>\n);",
          "storyFile": "ToggleButton/ToggleButton.stories.tsx",
          "storyTitle": "Actions/ToggleButton",
          "description": "Three heights matching `Button`, so a toggle can sit in a row of them without breaking\nthe line."
        },
        {
          "name": "Disabled",
          "code": "import { HStack } from '@wallarm-org/design-system/Stack';\nimport { ToggleButton } from '@wallarm-org/design-system/ToggleButton';\n\nexport const Disabled = () => (\n  <HStack>\n    <ToggleButton disabled>\n      Disabled\n    </ToggleButton>\n    <ToggleButton disabled active>\n      Disabled Active\n    </ToggleButton>\n    <ToggleButton disabled variant='ghost'>\n      Ghost Disabled\n    </ToggleButton>\n  </HStack>\n);",
          "storyFile": "ToggleButton/ToggleButton.stories.tsx",
          "storyTitle": "Actions/ToggleButton",
          "description": "Both states while disabled. A disabled toggle still shows whether it is on, which is the\npoint — say elsewhere why it cannot be changed."
        },
        {
          "name": "Loading",
          "code": "import { HStack } from '@wallarm-org/design-system/Stack';\nimport { ToggleButton } from '@wallarm-org/design-system/ToggleButton';\n\nexport const Loading = () => (\n  <HStack>\n    <ToggleButton loading>\n      Loading\n    </ToggleButton>\n    <ToggleButton loading active>\n      Loading Active\n    </ToggleButton>\n    <ToggleButton loading variant='ghost'>\n      Ghost Loading\n    </ToggleButton>\n  </HStack>\n);",
          "storyFile": "ToggleButton/ToggleButton.stories.tsx",
          "storyTitle": "Actions/ToggleButton",
          "description": "For a toggle whose effect is a request. It keeps the label's footprint and disables itself,\nso the pressed state does not flicker while the answer is in flight."
        },
        {
          "name": "Icons",
          "code": "import { ChevronLeft, ChevronRight } from '@wallarm-org/design-system/icons';\nimport { HStack } from '@wallarm-org/design-system/Stack';\nimport { ToggleButton } from '@wallarm-org/design-system/ToggleButton';\n\nexport const Icons = () => (\n  <HStack>\n    <ToggleButton>\n      <ChevronLeft />\n      Left icon\n    </ToggleButton>\n    <ToggleButton>\n      Right icon\n      <ChevronRight />\n    </ToggleButton>\n    <ToggleButton>\n      <ChevronLeft />\n      Both icons\n      <ChevronRight />\n    </ToggleButton>\n  </HStack>\n);",
          "storyFile": "ToggleButton/ToggleButton.stories.tsx",
          "storyTitle": "Actions/ToggleButton",
          "description": "An icon before or after the label. Pressed state is carried by the whole button, not the\nicon, so don't swap the icon to signal it."
        },
        {
          "name": "IconOnly",
          "code": "import { ChevronRight } from '@wallarm-org/design-system/icons';\nimport { HStack } from '@wallarm-org/design-system/Stack';\nimport { ToggleButton } from '@wallarm-org/design-system/ToggleButton';\n\nexport const IconOnly = () => (\n  <HStack>\n    <ToggleButton aria-label='Toggle option 1'>\n      <ChevronRight />\n    </ToggleButton>\n    <ToggleButton loading aria-label='Toggle option 2'>\n      <ChevronRight />\n    </ToggleButton>\n    <ToggleButton disabled aria-label='Toggle option 3'>\n      <ChevronRight />\n    </ToggleButton>\n  </HStack>\n);",
          "storyFile": "ToggleButton/ToggleButton.stories.tsx",
          "storyTitle": "Actions/ToggleButton",
          "description": "The toolbar case: an icon alone squares the button off. `aria-label` is doing all the\nnaming here, so it is not optional."
        },
        {
          "name": "Controlled",
          "code": "import { useState } from 'react';\nimport { ToggleButton } from '@wallarm-org/design-system/ToggleButton';\n\nexport const Controlled = () => {\n  const [active, setActive] = useState<boolean>(false);\n\n  return (\n    <ToggleButton aria-label='Toggle option 1' active={active} onToggle={setActive}>\n      Controlled\n    </ToggleButton>\n  );\n};",
          "storyFile": "ToggleButton/ToggleButton.stories.tsx",
          "storyTitle": "Actions/ToggleButton",
          "description": "Pass `active` and own the state when something else has to move with it — a panel opening,\na filter applying. Once `active` is set the button stops tracking itself."
        }
      ]
    },
    {
      "name": "Tooltip",
      "description": "A short label on hover or focus, for naming something the interface cannot afford to spell out — an icon button, a truncated value. It holds no interactive content and cannot be reached by keyboard beyond its trigger, so anything the reader needs to click belongs in a `Popover`.",
      "importPath": "@wallarm-org/design-system/Tooltip",
      "props": [
        {
          "name": "open",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultOpen",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "onOpenChange",
          "type": "((open: boolean) => void) | undefined",
          "required": false
        },
        {
          "name": "openDelay",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "closeDelay",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "closeOnPointerDown",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "closeOnEscape",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "closeOnScroll",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "interactive",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "disabled",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "positioning",
          "type": "PositioningOptions | undefined",
          "required": false
        },
        {
          "name": "ids",
          "type": "ElementIds | undefined",
          "required": false,
          "description": "Override the trigger element's id. Pass the same id to another\ncompound component's `ids.trigger` (e.g. `Popover`, `DropdownMenu`) to\ncompose their triggers on one element via nested `asChild` without an\nextra wrapper node — otherwise the outer trigger's id wins and this\ntooltip can't find its anchor, mispositioning at the viewport origin."
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [
        {
          "name": "TooltipContent",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "description": "Use the provided child element as the default rendered element, combining their props and behavior."
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "TooltipTrigger",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | undefined",
              "required": false,
              "description": "The value that identifies this specific trigger"
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "description": "Use the provided child element as the default rendered element, combining their props and behavior."
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { ChevronRight } from '@wallarm-org/design-system/icons';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@wallarm-org/design-system/Tooltip';\n\nexport const Basic = () => (\n  <Tooltip data-testid='tooltip'>\n    <TooltipTrigger asChild>\n      <Button variant='outline' color='neutral'>\n        <ChevronRight />\n      </Button>\n    </TooltipTrigger>\n    <TooltipContent>Right</TooltipContent>\n  </Tooltip>\n);",
          "storyFile": "Tooltip/Tooltip.stories.tsx",
          "storyTitle": "Overlay/Tooltip",
          "description": "Trigger and content. Keep it to a few words: a tooltip that needs reading is a tooltip nobody\nreads."
        },
        {
          "name": "WithDescription",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { ChevronRight } from '@wallarm-org/design-system/icons';\nimport { Text } from '@wallarm-org/design-system/Text';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@wallarm-org/design-system/Tooltip';\n\nexport const WithDescription = () => (\n  <Tooltip>\n    <TooltipTrigger asChild>\n      <Button variant='outline' color='neutral'>\n        <ChevronRight />\n      </Button>\n    </TooltipTrigger>\n    <TooltipContent>\n      <Text size='xs' weight='medium'>\n        Title\n      </Text>\n      <Text size='xs'>Description</Text>\n    </TooltipContent>\n  </Tooltip>\n);",
          "storyFile": "Tooltip/Tooltip.stories.tsx",
          "storyTitle": "Overlay/Tooltip",
          "description": "A second line for a consequence rather than a name. This is the ceiling — past it, the\ncontent wants a `Popover`."
        },
        {
          "name": "WithNestedDialog",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Dialog, DialogBody, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@wallarm-org/design-system/Dialog';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@wallarm-org/design-system/Tooltip';\n\nexport const WithNestedDialog = () => (\n  <Dialog>\n    <DialogTrigger asChild>\n      <Button variant='outline' color='neutral'>\n        Open dialog with nested tooltip\n      </Button>\n    </DialogTrigger>\n\n    <DialogContent>\n      <DialogHeader>\n        <DialogTitle>[Level 1] Main Dialog</DialogTitle>\n      </DialogHeader>\n\n      <DialogBody>\n        <Dialog>\n          <DialogTrigger asChild>\n            <Button variant='ghost' color='neutral' size='small'>\n              Open nested dialog\n            </Button>\n          </DialogTrigger>\n\n          <DialogContent>\n            <DialogHeader>\n              <DialogTitle>[Level 2] With Tooltip</DialogTitle>\n            </DialogHeader>\n\n            <DialogBody>\n              <Tooltip data-testid='nested-tooltip' interactive>\n                <TooltipTrigger asChild>\n                  <Button variant='outline' color='neutral'>\n                    Hover me\n                  </Button>\n                </TooltipTrigger>\n                <TooltipContent>Tooltip above the dialog</TooltipContent>\n              </Tooltip>\n            </DialogBody>\n          </DialogContent>\n        </Dialog>\n      </DialogBody>\n    </DialogContent>\n  </Dialog>\n);",
          "storyFile": "Tooltip/Tooltip.stories.tsx",
          "storyTitle": "Overlay/Tooltip",
          "description": "A tooltip on a trigger that also opens a dialog, checking the tooltip dismisses rather than\nhanging over the panel."
        },
        {
          "name": "WithKbd",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { ChevronRight } from '@wallarm-org/design-system/icons';\nimport { Kbd } from '@wallarm-org/design-system/Kbd';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@wallarm-org/design-system/Tooltip';\n\nexport const WithKbd = () => (\n  <Tooltip>\n    <TooltipTrigger asChild>\n      <Button variant='outline' color='neutral'>\n        <ChevronRight />\n      </Button>\n    </TooltipTrigger>\n    <TooltipContent>\n      Add instance <Kbd>⌘</Kbd>\n    </TooltipContent>\n  </Tooltip>\n);",
          "storyFile": "Tooltip/Tooltip.stories.tsx",
          "storyTitle": "Overlay/Tooltip",
          "description": "A `Kbd` inside the tooltip, which is the convention for naming a control and its shortcut in\none breath."
        }
      ]
    },
    {
      "name": "TopHeader",
      "importPath": "@wallarm-org/design-system/TopHeader",
      "props": [
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [
        {
          "name": "TopHeaderActions",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "TopHeaderLogo",
          "props": [
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "defaultValue": "false"
            },
            {
              "name": "download",
              "type": "any",
              "required": false
            },
            {
              "name": "href",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "hrefLang",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "target",
              "type": "HTMLAttributeAnchorTarget | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": []
    },
    {
      "name": "Tour",
      "description": "A guided walk through the interface, for a feature the reader would not find on their own — configured with `useTour({ steps })` and one rendered `Tour`. It owns how a step looks, not when the tour runs: deciding who sees it and how often is the application's job.",
      "importPath": "@wallarm-org/design-system/Tour",
      "props": [
        {
          "name": "present",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether the node is present (controlled by the user)"
        },
        {
          "name": "onExitComplete",
          "type": "VoidFunction | undefined",
          "required": false,
          "description": "Function called when the animation ends in the closed state"
        },
        {
          "name": "onEnterComplete",
          "type": "VoidFunction | undefined",
          "required": false,
          "description": "Function called when the animation ends in the open state"
        },
        {
          "name": "immediate",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether to synchronize the present change immediately or defer it to the next frame"
        },
        {
          "name": "lazyMount",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether to enable lazy mounting",
          "defaultValue": "true"
        },
        {
          "name": "unmountOnExit",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether to unmount on exit.",
          "defaultValue": "true"
        },
        {
          "name": "skipAnimationOnMount",
          "type": "boolean | undefined",
          "required": false,
          "description": "Whether to allow the initial presence animation."
        },
        {
          "name": "hideMode",
          "type": "\"display-none\" | \"activity\"",
          "required": false,
          "description": "How to hide content when mounted but not present.\n- `'display-none'`: HTML `hidden` attribute. Effects stay alive.\n- `'activity'`: React 19 `<Activity mode=\"hidden\">`. Effects pause. Requires React 19+."
        },
        {
          "name": "tour",
          "type": "complex",
          "required": true
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [
        {
          "name": "TourClose",
          "props": [
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"button\" | \"submit\" | \"reset\" | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "asChild",
              "type": "boolean | undefined",
              "required": false,
              "description": "Use the provided child element as the default rendered element, combining their props and behavior."
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Basic",
          "code": "import { useRef } from 'react';\nimport { Badge } from '@wallarm-org/design-system/Badge';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Info } from '@wallarm-org/design-system/icons';\nimport { Kbd, KbdGroup } from '@wallarm-org/design-system/Kbd';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\nimport { Tour, type TourStepDetails, useTour } from '@wallarm-org/design-system/Tour';\n\nexport const Basic = () => {\n  const firstRef = useRef<HTMLButtonElement>(null);\n  const secondRef = useRef<HTMLButtonElement>(null);\n  const thirdRef = useRef<HTMLButtonElement>(null);\n  const fourthRef = useRef<SVGSVGElement>(null);\n  const steps: TourStepDetails[] = [\n    {\n      id: 'intro',\n      type: 'dialog',\n      title: 'Welcome on a board!',\n      description: 'Here is the start dialog window',\n    },\n    {\n      id: 'firstStep',\n      type: 'tooltip',\n      target: () => firstRef.current,\n      title: 'Common use case',\n      description: 'Tour step with title, descriptions and progress info.',\n    },\n    {\n      id: 'secondStep',\n      type: 'tooltip',\n      target: () => secondRef.current,\n      title: 'Add an image, GIF, or video',\n      description:\n        'Tour step with an optional media slot displayed above the text content. Media is defined per step via the meta.mediaSrc field and automatically shows or hides based on the current step.',\n      placement: 'top',\n      meta: {\n        mediaSrc: './tour-cat.jpg',\n        mediaAlt: 'Image alt',\n      },\n    },\n    {\n      id: 'thirdStep',\n      type: 'tooltip',\n      target: () => thirdRef.current,\n      title: 'A variant where the target element is highlighted without overlay',\n      description:\n        \"The rest of the interface remains fully visible and interactive. Best suited for subtle, non-blocking hints that guide without interrupting the user's workflow.\",\n      backdrop: false,\n    },\n    {\n      id: 'fourthStep',\n      type: 'tooltip',\n      target: () => fourthRef.current as HTMLElement | null,\n      title: 'An alternative spotlight shape',\n      description:\n        'Ideal for highlighting compact or icon-sized elements where a rectangular highlight would feel oversized.',\n      backdrop: false,\n      meta: { shape: 'circle' },\n    },\n    {\n      id: 'finish',\n      type: 'dialog',\n      title: 'Done!',\n      description:\n        \"You've completed the tour and can enjoy that doggo on the final dialog box of the tour!\",\n      actions: [\n        { label: 'Back', action: 'prev' },\n        { label: 'Finish', action: 'dismiss' },\n      ],\n      meta: {\n        mediaSrc: './tour-dog.gif',\n        mediaAlt: 'Completion',\n      },\n    },\n  ];\n  const tour = useTour({ closeOnInteractOutside: false, steps });\n  return (\n    <div className='w-600 p-32'>\n      <VStack gap={24} align='stretch'>\n        <VStack gap={4} align='stretch'>\n          <HStack gap={8}>\n            <KbdGroup>\n              <Kbd>&larr;</Kbd>\n              <Kbd>&rarr;</Kbd>\n            </KbdGroup>\n          </HStack>\n          <HStack gap={8}>\n            <Kbd>Esc</Kbd>\n          </HStack>\n          <HStack gap={8}>\n            <Kbd>Tab</Kbd>\n          </HStack>\n        </VStack>\n        <HStack gap={8}>\n          <Button ref={firstRef} variant='outline' color='neutral' size='large'>\n            First step\n          </Button>\n          <Button ref={secondRef} variant='outline' color='neutral' size='large'>\n            Second step\n          </Button>\n          <Button ref={thirdRef} variant='outline' color='neutral' size='large'>\n            Third step\n          </Button>\n          <Badge variant='dotted' color='green' size='medium'>\n            Last step\n          </Badge>\n          <Info ref={fourthRef} />\n        </HStack>\n        <Button\n          data-testid='tour-start'\n          variant='secondary'\n          color='neutral'\n          size='large'\n          onClick={() => tour.start()}\n        >\n          Start tour\n        </Button>\n      </VStack>\n      <Tour tour={tour} />\n    </div>\n  );\n};",
          "storyFile": "Tour/Tour.stories.tsx",
          "storyTitle": "Overlay/Tour",
          "description": "A full tour end to end. Keep it short — every step is one the reader did not choose to take."
        },
        {
          "name": "Placement",
          "code": "import { useRef } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { VStack } from '@wallarm-org/design-system/Stack';\nimport { Tour, type TourStepDetails, useTour } from '@wallarm-org/design-system/Tour';\n\nexport const Placement = () => {\n  const topStartRef = useRef<HTMLButtonElement>(null);\n  const topRef = useRef<HTMLButtonElement>(null);\n  const topEndRef = useRef<HTMLButtonElement>(null);\n  const leftStartRef = useRef<HTMLButtonElement>(null);\n  const leftRef = useRef<HTMLButtonElement>(null);\n  const leftEndRef = useRef<HTMLButtonElement>(null);\n  const rightStartRef = useRef<HTMLButtonElement>(null);\n  const rightRef = useRef<HTMLButtonElement>(null);\n  const rightEndRef = useRef<HTMLButtonElement>(null);\n  const bottomStartRef = useRef<HTMLButtonElement>(null);\n  const bottomRef = useRef<HTMLButtonElement>(null);\n  const bottomEndRef = useRef<HTMLButtonElement>(null);\n\n  const refs: Record<(typeof PLACEMENTS)[number], typeof topRef> = {\n    'top-start': topStartRef,\n    top: topRef,\n    'top-end': topEndRef,\n    'left-start': leftStartRef,\n    left: leftRef,\n    'left-end': leftEndRef,\n    'right-start': rightStartRef,\n    right: rightRef,\n    'right-end': rightEndRef,\n    'bottom-start': bottomStartRef,\n    bottom: bottomRef,\n    'bottom-end': bottomEndRef,\n  };\n\n  const steps: TourStepDetails[] = PLACEMENTS.map(p => ({\n    id: p,\n    type: 'tooltip' as const,\n    target: () => refs[p].current,\n    title: p,\n    description: `Tooltip placed at \"${p}\". Auto-flips when it would overflow the viewport.`,\n    placement: p,\n  }));\n\n  const tour = useTour({ closeOnInteractOutside: false, steps });\n\n  return (\n    <div className='w-600 p-32'>\n      <VStack gap={24} align='stretch'>\n        <div className='grid grid-cols-3 gap-8 max-w-[50vw] mx-auto'>\n          {PLACEMENTS.map(p => (\n            <Button key={p} ref={refs[p]} variant='outline' color='neutral' size='medium'>\n              {p}\n            </Button>\n          ))}\n        </div>\n\n        <Button\n          data-testid='tour-start'\n          variant='secondary'\n          color='neutral'\n          size='large'\n          onClick={() => tour.start()}\n        >\n          Explore placement options\n        </Button>\n      </VStack>\n\n      <Tour tour={tour} />\n    </div>\n  );\n};",
          "storyFile": "Tour/Tour.stories.tsx",
          "storyTitle": "Overlay/Tour",
          "description": "Where a step sits relative to its target. Choose the side that leaves the target visible,\nsince the target is the point."
        },
        {
          "name": "BeaconTriggered",
          "code": "import { useRef } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\nimport { beaconStepEffect, Tour, type TourStepDetails, useTour } from '@wallarm-org/design-system/Tour';\n\nexport const BeaconTriggered = () => {\n  const targetRef = useRef<HTMLButtonElement>(null);\n\n  const steps: TourStepDetails[] = [\n    {\n      id: 'beacon',\n      type: 'tooltip',\n      target: () => targetRef.current,\n      title: 'Quick tip',\n      description:\n        'When there is only one step, the footer shows a single \"Got it\" dismiss button instead of navigation controls. No progress indicator is displayed.',\n      backdrop: false,\n      effect: beaconStepEffect(),\n    },\n  ];\n\n  const tour = useTour({ closeOnInteractOutside: false, steps, autoStart: true });\n\n  return (\n    <div className='w-600 p-32'>\n      <VStack gap={24} align='stretch'>\n        <HStack gap={8}>\n          <Button ref={targetRef} variant='outline' color='neutral' size='large'>\n            Quick tip\n          </Button>\n        </HStack>\n      </VStack>\n\n      <Tour tour={tour} />\n    </div>\n  );\n};",
          "storyFile": "Tour/Tour.stories.tsx",
          "storyTitle": "Overlay/Tour",
          "description": "A beacon the reader opens themselves, which turns the tour from an interruption into an\noffer."
        },
        {
          "name": "WaitForInteraction",
          "code": "import { useRef } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { HStack, VStack } from '@wallarm-org/design-system/Stack';\nimport { waitForStepEvent, Tour, type TourStepDetails, useTour } from '@wallarm-org/design-system/Tour';\n\nexport const WaitForInteraction = () => {\n  const firstRef = useRef<HTMLButtonElement>(null);\n  const secondRef = useRef<HTMLButtonElement>(null);\n\n  const steps: TourStepDetails[] = [\n    {\n      id: 'intro',\n      type: 'dialog',\n      title: 'New feature available!',\n      description:\n        'This tour will guide you through actions. You must complete each step to proceed.',\n      actions: [{ label: 'Start', action: 'next' }],\n    },\n    {\n      id: 'firstButton',\n      type: 'tooltip',\n      title: 'Click the Add button',\n      description: 'Click the \"Add Item\" button to continue.',\n      target: () => firstRef.current,\n      effect: args => waitForStepEvent('click', args),\n    },\n    {\n      id: 'secondButton',\n      type: 'tooltip',\n      title: 'Click the Change button',\n      description: 'Click the \"Change Item\" button to continue.',\n      target: () => secondRef.current,\n      effect: args => waitForStepEvent('click', args),\n    },\n    {\n      id: 'done',\n      type: 'dialog',\n      title: 'Great!',\n      description: 'Let`s move on',\n    },\n  ];\n\n  const tour = useTour({ closeOnInteractOutside: false, steps });\n\n  return (\n    <div className='w-600 p-32'>\n      <VStack gap={24} align='stretch'>\n        <HStack gap={8}>\n          <Button ref={firstRef} variant='outline' color='neutral' size='large'>\n            Add Item\n          </Button>\n          <Button ref={secondRef} variant='outline' color='neutral' size='large'>\n            Change Item\n          </Button>\n        </HStack>\n\n        <Button\n          data-testid='tour-start'\n          variant='secondary'\n          color='neutral'\n          size='large'\n          onClick={() => tour.start()}\n        >\n          Interactive tour with buttons\n        </Button>\n      </VStack>\n\n      <Tour tour={tour} />\n    </div>\n  );\n};",
          "storyFile": "Tour/Tour.stories.tsx",
          "storyTitle": "Overlay/Tour",
          "description": "A step that waits for the reader to act before advancing, for teaching by doing rather than\nby reading."
        },
        {
          "name": "WaitForInput",
          "code": "import { useRef } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Checkbox, CheckboxIndicator, CheckboxLabel } from '@wallarm-org/design-system/Checkbox';\nimport { Field, FieldLabel, FieldSet } from '@wallarm-org/design-system/Field';\nimport { Input } from '@wallarm-org/design-system/Input';\nimport { VStack } from '@wallarm-org/design-system/Stack';\nimport { waitForStepEvent, Tour, type TourStepDetails, useTour } from '@wallarm-org/design-system/Tour';\n\nexport const WaitForInput = () => {\n  const nameRef = useRef<HTMLInputElement>(null);\n  const emailRef = useRef<HTMLInputElement>(null);\n  const termsRef = useRef<HTMLLabelElement>(null);\n\n  const steps: TourStepDetails[] = [\n    {\n      id: 'enter-name',\n      type: 'tooltip',\n      title: 'Enter Your Name',\n      description: 'Type your name in the input field to continue (at least 2 characters).',\n      target: () => nameRef.current,\n      placement: 'bottom-start',\n      effect: args =>\n        waitForStepEvent('input', args, {\n          predicate: el => (el as HTMLInputElement).value.trim().length >= 2,\n          delay: 1500,\n        }),\n    },\n    {\n      id: 'enter-email',\n      type: 'tooltip',\n      title: 'Enter Your Email',\n      description: 'Now enter a valid email address.',\n      target: () => emailRef.current,\n      placement: 'bottom-start',\n      effect: args =>\n        waitForStepEvent('input', args, {\n          predicate: el => {\n            const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n            return emailRegex.test((el as HTMLInputElement).value);\n          },\n          delay: 1500,\n        }),\n    },\n    {\n      id: 'check-terms',\n      type: 'tooltip',\n      title: 'Accept Terms',\n      description: 'Check the checkbox to accept the terms.',\n      target: () => termsRef.current,\n      placement: 'bottom-start',\n      effect: args =>\n        waitForStepEvent(\n          'change',\n          {\n            ...args,\n            target: () => termsRef.current?.querySelector<HTMLInputElement>('input') ?? null,\n          },\n          {\n            predicate: el => el.checked,\n          },\n        ),\n    },\n    {\n      id: 'complete',\n      type: 'dialog',\n      title: 'Form Complete!',\n      description: 'You have successfully filled out the form',\n      meta: {\n        mediaSrc: './tour-cat.jpg',\n        mediaAlt: 'Completion',\n      },\n    },\n  ];\n\n  const tour = useTour({ closeOnInteractOutside: false, steps });\n\n  return (\n    <div className='w-600 p-32'>\n      <VStack gap={24} align='stretch'>\n        <FieldSet>\n          <Field>\n            <FieldLabel>Name</FieldLabel>\n            <Input ref={nameRef} placeholder='Enter your name' />\n          </Field>\n          <Field>\n            <FieldLabel>Email</FieldLabel>\n            <Input ref={emailRef} type='email' placeholder='Enter your email' />\n          </Field>\n\n          <Checkbox ref={termsRef}>\n            <CheckboxIndicator />\n            <CheckboxLabel>I accept the terms and conditions</CheckboxLabel>\n          </Checkbox>\n        </FieldSet>\n\n        <Button\n          data-testid='tour-start'\n          variant='secondary'\n          color='neutral'\n          size='large'\n          onClick={() => tour.start()}\n        >\n          Interactive tour with inputs\n        </Button>\n      </VStack>\n\n      <Tour tour={tour} />\n    </div>\n  );\n};",
          "storyFile": "Tour/Tour.stories.tsx",
          "storyTitle": "Overlay/Tour",
          "description": "The same, gated on input rather than a click — for a step where the reader has to type\nsomething real to continue."
        }
      ]
    },
    {
      "name": "Tree",
      "description": "Draws structure: a vertical rail and depth indentation around nested content, with optional per-item collapse. It shows a hierarchy rather than letting you work in one — reach for `TreeView` when rows need selecting, keyboard navigation or disabled states, and for `Accordion` when the levels are sections rather than a tree.",
      "importPath": "@wallarm-org/design-system/Tree",
      "props": [
        {
          "name": "indent",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "gap",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [
        {
          "name": "TreeItem",
          "props": [
            {
              "name": "collapsible",
              "type": "boolean | undefined",
              "required": false,
              "defaultValue": "false"
            },
            {
              "name": "open",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultOpen",
              "type": "boolean | undefined",
              "required": false,
              "defaultValue": "true"
            },
            {
              "name": "onOpenChange",
              "type": "((open: boolean) => void) | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "TreeItemContent",
          "props": [
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "TreeItemHeader",
          "props": [
            {
              "name": "icon",
              "type": "ReactNode",
              "required": false
            },
            {
              "name": "action",
              "type": "ReactNode",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Tree, TreeItem, TreeItemHeader } from '@wallarm-org/design-system/Tree';\n\nexport const Basic = () => (\n  <div className='w-240'>\n    <Tree>\n      <TreeItem>\n        <TreeItemHeader>Item 1</TreeItemHeader>\n      </TreeItem>\n      <TreeItem>\n        <TreeItemHeader>Item 2</TreeItemHeader>\n      </TreeItem>\n      <TreeItem>\n        <TreeItemHeader>Item 3</TreeItemHeader>\n      </TreeItem>\n    </Tree>\n  </div>\n);",
          "storyFile": "Tree/Tree.stories.tsx",
          "storyTitle": "Navigation/Tree",
          "description": "One level: the rail and the indentation, with the items composed from `TreeItemHeader` and `TreeItemContent`."
        },
        {
          "name": "Nested",
          "code": "import { Tree, TreeItem, TreeItemHeader } from '@wallarm-org/design-system/Tree';\n\nexport const Nested = () => (\n  <div className='w-320'>\n    <Tree>\n      <TreeItem>\n        <TreeItemHeader>Level 1 - Item 1</TreeItemHeader>\n      </TreeItem>\n      <TreeItem>\n        <TreeItemHeader>Level 1 - Item 2</TreeItemHeader>\n        <Tree>\n          <TreeItem>\n            <TreeItemHeader>Level 2 - Item 1</TreeItemHeader>\n          </TreeItem>\n          <TreeItem>\n            <TreeItemHeader>Level 2 - Item 2</TreeItemHeader>\n            <Tree>\n              <TreeItem>\n                <TreeItemHeader>Level 3 - Item 1</TreeItemHeader>\n              </TreeItem>\n              <TreeItem>\n                <TreeItemHeader>Level 3 - Item 2</TreeItemHeader>\n              </TreeItem>\n            </Tree>\n          </TreeItem>\n        </Tree>\n      </TreeItem>\n      <TreeItem>\n        <TreeItemHeader>Level 1 - Item 3</TreeItemHeader>\n      </TreeItem>\n    </Tree>\n  </div>\n);",
          "storyFile": "Tree/Tree.stories.tsx",
          "storyTitle": "Navigation/Tree",
          "description": "Nesting a `Tree` inside an item adds a depth, and each depth draws its own rail so the ancestry stays readable."
        },
        {
          "name": "WithIcons",
          "code": "import { CircleCheck, LoaderCircle, Search, Settings } from '@wallarm-org/design-system/icons';\nimport { Text } from '@wallarm-org/design-system/Text';\nimport { Tree, TreeItem, TreeItemHeader } from '@wallarm-org/design-system/Tree';\n\nexport const WithIcons = () => (\n  <div className='w-320'>\n    <Tree gap={12}>\n      <TreeItem>\n        <TreeItemHeader icon={<CircleCheck size='md' className='text-text-secondary' />}>\n          <Text size='xs' color='secondary'>\n            Thought for 5s\n          </Text>\n        </TreeItemHeader>\n      </TreeItem>\n      <TreeItem>\n        <TreeItemHeader icon={<Search size='md' className='text-text-secondary' />}>\n          <Text size='xs' color='secondary'>\n            Searched for ABC\n          </Text>\n        </TreeItemHeader>\n      </TreeItem>\n      <TreeItem>\n        <TreeItemHeader icon={<Settings size='md' className='text-text-secondary' />}>\n          <Text size='xs' color='secondary'>\n            Created ABC\n          </Text>\n        </TreeItemHeader>\n      </TreeItem>\n      <TreeItem>\n        <TreeItemHeader icon={<LoaderCircle size='md' className='text-text-secondary' />}>\n          <Text size='xs' color='secondary'>\n            Working...\n          </Text>\n        </TreeItemHeader>\n      </TreeItem>\n    </Tree>\n  </div>\n);",
          "storyFile": "Tree/Tree.stories.tsx",
          "storyTitle": "Navigation/Tree",
          "description": "`TreeItemHeader`’s `icon` prop sits before the label at every depth, which is how a status or a type reads down a branch."
        },
        {
          "name": "WithIconsNested",
          "code": "import { Code } from '@wallarm-org/design-system/Code';\nimport { Circle, CircleCheck } from '@wallarm-org/design-system/icons';\nimport { Text } from '@wallarm-org/design-system/Text';\nimport { Tree, TreeItem, TreeItemHeader } from '@wallarm-org/design-system/Tree';\n\nexport const WithIconsNested = () => (\n  <div className='w-320'>\n    <Tree gap={12}>\n      <TreeItem>\n        <TreeItemHeader icon={<Circle size='md' className='text-text-secondary' />}>\n          <Text size='xs' color='secondary'>\n            Chain item\n          </Text>\n        </TreeItemHeader>\n        <Tree>\n          <TreeItem>\n            <TreeItemHeader icon={<Circle size='md' className='text-text-secondary' />}>\n              <Text size='xs' color='secondary'>\n                Chain item\n              </Text>\n            </TreeItemHeader>\n          </TreeItem>\n          <TreeItem>\n            <TreeItemHeader\n              icon={<Circle size='md' className='text-text-secondary' />}\n              action={\n                <Code size='xs' color='secondary'>\n                  Metric\n                </Code>\n              }\n            >\n              <Text size='xs' color='secondary'>\n                Chain item\n              </Text>\n            </TreeItemHeader>\n            <Tree>\n              <TreeItem>\n                <TreeItemHeader icon={<Circle size='md' className='text-text-secondary' />}>\n                  <Text size='xs' color='secondary'>\n                    Chain item\n                  </Text>\n                </TreeItemHeader>\n              </TreeItem>\n              <TreeItem>\n                <TreeItemHeader\n                  icon={<CircleCheck size='md' className='text-text-secondary' />}\n                  action={\n                    <Code size='xs' color='secondary'>\n                      Metric\n                    </Code>\n                  }\n                >\n                  <Text size='xs' color='secondary'>\n                    Chain item\n                  </Text>\n                </TreeItemHeader>\n              </TreeItem>\n              <TreeItem>\n                <TreeItemHeader icon={<Circle size='md' className='text-text-secondary' />}>\n                  <Text size='xs' color='secondary'>\n                    Chain item\n                  </Text>\n                </TreeItemHeader>\n              </TreeItem>\n              <TreeItem>\n                <TreeItemHeader\n                  icon={<Circle size='md' className='text-text-secondary' />}\n                  action={\n                    <Code size='xs' color='secondary'>\n                      Metric\n                    </Code>\n                  }\n                >\n                  <Text size='xs' color='secondary'>\n                    Chain item\n                  </Text>\n                </TreeItemHeader>\n              </TreeItem>\n            </Tree>\n          </TreeItem>\n        </Tree>\n      </TreeItem>\n      <TreeItem>\n        <TreeItemHeader icon={<CircleCheck size='md' className='text-text-secondary' />}>\n          <Text size='xs' color='secondary'>\n            Worked for 3m 45s\n          </Text>\n        </TreeItemHeader>\n      </TreeItem>\n    </Tree>\n  </div>\n);",
          "storyFile": "Tree/Tree.stories.tsx",
          "storyTitle": "Navigation/Tree",
          "description": "The same icons four levels deep — the case that shows whether the indentation is still legible at depth."
        },
        {
          "name": "Collapsible",
          "code": "import { CircleCheck, Search, Settings } from '@wallarm-org/design-system/icons';\nimport { Text } from '@wallarm-org/design-system/Text';\nimport { Tree, TreeItem, TreeItemContent, TreeItemHeader } from '@wallarm-org/design-system/Tree';\n\nexport const Collapsible = () => (\n  <div className='w-320'>\n    <Tree gap={8}>\n      <TreeItem collapsible defaultOpen>\n        <TreeItemHeader>\n          <Text size='xs' color='secondary'>\n            Thought for 5s\n          </Text>\n        </TreeItemHeader>\n        <TreeItemContent>\n          <div className='flex flex-col gap-8'>\n            <Text size='xs' color='secondary'>\n              I'll fetch your custom rules so I can pick one and explain it to you.\n            </Text>\n            <Text size='xs' color='secondary'>\n              Great! I found several custom rules. Let me pick one and explain it in detail. I'll go\n              with rule ID 59133856 — it's a good example of a scoped rule with clear intent.\n            </Text>\n          </div>\n        </TreeItemContent>\n      </TreeItem>\n      <TreeItem collapsible defaultOpen={false}>\n        <TreeItemHeader icon={<Search size='md' className='text-text-secondary' />}>\n          <Text size='xs' color='secondary'>\n            Searched for ABC\n          </Text>\n        </TreeItemHeader>\n        <TreeItemContent>\n          <Text size='xs' color='secondary'>\n            Search results...\n          </Text>\n        </TreeItemContent>\n      </TreeItem>\n      <TreeItem collapsible defaultOpen={false}>\n        <TreeItemHeader icon={<Settings size='md' className='text-text-secondary' />}>\n          <Text size='xs' color='secondary'>\n            Created ABC\n          </Text>\n        </TreeItemHeader>\n        <TreeItemContent>\n          <Text size='xs' color='secondary'>\n            Details about the created resource...\n          </Text>\n        </TreeItemContent>\n      </TreeItem>\n      <TreeItem>\n        <TreeItemHeader icon={<CircleCheck size='md' className='text-text-secondary' />}>\n          <Text size='xs' color='secondary'>\n            Worked for 3m 45s\n          </Text>\n        </TreeItemHeader>\n      </TreeItem>\n    </Tree>\n  </div>\n);",
          "storyFile": "Tree/Tree.stories.tsx",
          "storyTitle": "Navigation/Tree",
          "description": "`collapsible` on an item turns its header into a toggle, open by default. It is per item, not a tree-wide setting."
        },
        {
          "name": "CollapsibleWithActions",
          "code": "import { Code } from '@wallarm-org/design-system/Code';\nimport { Circle, CircleCheck, Search, Settings } from '@wallarm-org/design-system/icons';\nimport { Text } from '@wallarm-org/design-system/Text';\nimport { Tree, TreeItem, TreeItemContent, TreeItemHeader } from '@wallarm-org/design-system/Tree';\n\nexport const CollapsibleWithActions = () => (\n  <div className='w-320'>\n    <Tree gap={8}>\n      <TreeItem collapsible>\n        <TreeItemHeader\n          icon={<CircleCheck size='md' className='text-text-secondary' />}\n          action={\n            <Code size='xs' color='secondary'>\n              3.2s\n            </Code>\n          }\n        >\n          <Text size='xs' color='secondary'>\n            Thought for 5s\n          </Text>\n        </TreeItemHeader>\n        <TreeItemContent>\n          <Tree>\n            <TreeItem collapsible defaultOpen={false}>\n              <TreeItemHeader\n                icon={<Search size='md' className='text-text-secondary' />}\n                action={\n                  <Code size='xs' color='secondary'>\n                    0.8s\n                  </Code>\n                }\n              >\n                <Text size='xs' color='secondary'>\n                  Searched for API docs\n                </Text>\n              </TreeItemHeader>\n              <TreeItemContent>\n                <Text size='xs' color='secondary'>\n                  Found 3 relevant endpoints in the documentation.\n                </Text>\n              </TreeItemContent>\n            </TreeItem>\n            <TreeItem collapsible>\n              <TreeItemHeader icon={<Settings size='md' className='text-text-secondary' />}>\n                <Text size='xs' color='secondary'>\n                  Tool execution\n                </Text>\n              </TreeItemHeader>\n              <TreeItemContent>\n                <Tree>\n                  <TreeItem>\n                    <TreeItemHeader icon={<Circle size='md' className='text-text-secondary' />}>\n                      <Text size='xs' color='secondary'>\n                        Processing batch\n                      </Text>\n                    </TreeItemHeader>\n                    <Tree>\n                      <TreeItem>\n                        <TreeItemHeader\n                          icon={<CircleCheck size='md' className='text-text-secondary' />}\n                        >\n                          <Text size='xs' color='secondary'>\n                            Validated input\n                          </Text>\n                        </TreeItemHeader>\n                      </TreeItem>\n                      <TreeItem>\n                        <TreeItemHeader\n                          icon={<CircleCheck size='md' className='text-text-secondary' />}\n                          action={\n                            <Code size='xs' color='secondary'>\n                              0.3s\n                            </Code>\n                          }\n                        >\n                          <Text size='xs' color='secondary'>\n                            Transformed data\n                          </Text>\n                        </TreeItemHeader>\n                      </TreeItem>\n                    </Tree>\n                  </TreeItem>\n                  <TreeItem collapsible>\n                    <TreeItemHeader\n                      icon={<Circle size='md' className='text-text-secondary' />}\n                      action={\n                        <Code size='xs' color='secondary'>\n                          1.5s\n                        </Code>\n                      }\n                    >\n                      <Text size='xs' color='secondary'>\n                        Applied changes\n                      </Text>\n                    </TreeItemHeader>\n                    <TreeItemContent>\n                      <Text size='xs' color='secondary'>\n                        Updated 12 records in the database with the new configuration.\n                      </Text>\n                    </TreeItemContent>\n                  </TreeItem>\n                </Tree>\n              </TreeItemContent>\n            </TreeItem>\n          </Tree>\n        </TreeItemContent>\n      </TreeItem>\n      <TreeItem>\n        <TreeItemHeader icon={<CircleCheck size='md' className='text-text-secondary' />}>\n          <Text size='xs' color='secondary'>\n            Completed analysis\n          </Text>\n        </TreeItemHeader>\n      </TreeItem>\n    </Tree>\n  </div>\n);",
          "storyFile": "Tree/Tree.stories.tsx",
          "storyTitle": "Navigation/Tree",
          "description": "`TreeItemHeader`’s `action` slot holds a control on the right of the row, which is where a per-branch action belongs."
        }
      ]
    },
    {
      "name": "TreeView",
      "description": "The interactive hierarchy: rows that expand, select and disable, with the connector rails drawn for you. Reach for `Tree` when you only need to *show* nesting — this one is for working in it. Rows are composed freely, so an icon, a badge or a checkbox is just a child, and nested `TreeViewItem`s become the subtree.",
      "importPath": "@wallarm-org/design-system/TreeView",
      "props": [
        {
          "name": "selectable",
          "type": "boolean | undefined",
          "required": false,
          "description": "Allow rows to be selected by clicking.",
          "defaultValue": "false"
        },
        {
          "name": "multiSelect",
          "type": "boolean | undefined",
          "required": false,
          "description": "Allow more than one row to be selected at a time.",
          "defaultValue": "false"
        },
        {
          "name": "selectedIds",
          "type": "string[] | undefined",
          "required": false,
          "description": "Controlled selected item ids."
        },
        {
          "name": "defaultSelectedIds",
          "type": "string[] | undefined",
          "required": false,
          "description": "Uncontrolled initial selected item ids."
        },
        {
          "name": "onSelectionChange",
          "type": "((ids: string[]) => void) | undefined",
          "required": false,
          "description": "Called whenever the selection changes."
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "interactive",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        },
        {
          "name": "selected",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        },
        {
          "name": "disabled",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        }
      ],
      "subComponents": [
        {
          "name": "TreeViewItem",
          "props": [
            {
              "name": "id",
              "type": "string | undefined",
              "required": false,
              "description": "Stable id used for selection. Required for a row to be selectable."
            },
            {
              "name": "expandable",
              "type": "boolean | undefined",
              "required": false,
              "description": "Force branch behaviour (show a toggle) even without nested items."
            },
            {
              "name": "open",
              "type": "boolean | undefined",
              "required": false,
              "description": "Controlled open state."
            },
            {
              "name": "defaultOpen",
              "type": "boolean | undefined",
              "required": false,
              "description": "Uncontrolled initial open state.",
              "defaultValue": "false"
            },
            {
              "name": "onOpenChange",
              "type": "((open: boolean) => void) | undefined",
              "required": false
            },
            {
              "name": "selected",
              "type": "boolean | undefined",
              "required": false,
              "description": "Visually mark the row as selected (defaults to the tree's selection state)."
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false,
              "description": "Dim the row and disable all interaction (toggle, selection, checkbox).",
              "defaultValue": "false"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Basic",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { FileText, Folder } from '@wallarm-org/design-system/icons';\nimport { Input } from '@wallarm-org/design-system/Input';\nimport { TreeView, TreeViewItem } from '@wallarm-org/design-system/TreeView';\n\nexport const Basic = () => (\n  <div className='w-320'>\n    <TreeView>\n      <TreeViewItem defaultOpen>\n        <Folder />\n        Components\n        <TreeViewItem>\n          <FileText />\n          Button.tsx\n        </TreeViewItem>\n        <TreeViewItem>\n          <FileText />\n          Input.tsx\n        </TreeViewItem>\n      </TreeViewItem>\n      <TreeViewItem>\n        <Folder />\n        Utils\n        <TreeViewItem>\n          <FileText />\n          cn.ts\n        </TreeViewItem>\n      </TreeViewItem>\n      <TreeViewItem>\n        <FileText />\n        index.ts\n      </TreeViewItem>\n    </TreeView>\n  </div>\n);",
          "storyFile": "TreeView/TreeView.stories.tsx",
          "storyTitle": "Navigation/TreeView",
          "description": "One level of rows. Each `TreeViewItem` is composed like any row — the component supplies the rail, the indentation and the toggle."
        },
        {
          "name": "Nested",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { FileText, Folder } from '@wallarm-org/design-system/icons';\nimport { TreeView, TreeViewItem } from '@wallarm-org/design-system/TreeView';\n\nexport const Nested = () => (\n  <div className='w-320'>\n    <TreeView>\n      <TreeViewItem defaultOpen>\n        <Folder />\n        src\n        <TreeViewItem defaultOpen>\n          <Folder />\n          components\n          <TreeViewItem defaultOpen>\n            <Folder />\n            TreeView\n            <TreeViewItem>\n              <FileText />\n              TreeView.tsx\n            </TreeViewItem>\n          </TreeViewItem>\n          <TreeViewItem>\n            <FileText />\n            Button.tsx\n          </TreeViewItem>\n        </TreeViewItem>\n        <TreeViewItem>\n          <FileText />\n          index.ts\n        </TreeViewItem>\n      </TreeViewItem>\n      <TreeViewItem>\n        <Folder />\n        public\n        <TreeViewItem>\n          <FileText />\n          favicon.ico\n        </TreeViewItem>\n      </TreeViewItem>\n    </TreeView>\n  </div>\n);",
          "storyFile": "TreeView/TreeView.stories.tsx",
          "storyTitle": "Navigation/TreeView",
          "description": "Nested items become the collapsible subtree, which is also what marks the parent as a branch. Branches start closed."
        },
        {
          "name": "WithCheckboxes",
          "code": "import { useState } from 'react';\nimport { Checkbox, CheckboxIndicator } from '@wallarm-org/design-system/Checkbox';\nimport { FileText, Folder } from '@wallarm-org/design-system/icons';\nimport { TreeView, TreeViewItem } from '@wallarm-org/design-system/TreeView';\n\nexport const WithCheckboxes = () => {\n  const [checked, setChecked] = useState<Set<string>>(() => new Set(['users']));\n  const cb = (id: string) => (\n    <Checkbox\n      checked={checked.has(id)}\n      onClick={e => e.stopPropagation()}\n      onCheckedChange={details =>\n        setChecked(prev => {\n          const next = new Set(prev);\n          if (details.checked === true) {\n            next.add(id);\n          } else {\n            next.delete(id);\n          }\n          return next;\n        })\n      }\n      className='shrink-0'\n    >\n      <CheckboxIndicator />\n    </Checkbox>\n  );\n\n  return (\n    <div className='w-320'>\n      <TreeView>\n        <TreeViewItem defaultOpen>\n          {cb('endpoints')}\n          <Folder />\n          Endpoints\n          <TreeViewItem>\n            {cb('users')}\n            <FileText />\n            /users\n          </TreeViewItem>\n          <TreeViewItem>\n            {cb('orders')}\n            <FileText />\n            /orders\n          </TreeViewItem>\n        </TreeViewItem>\n        <TreeViewItem>\n          {cb('health')}\n          <FileText />\n          /health\n        </TreeViewItem>\n      </TreeView>\n    </div>\n  );\n};",
          "storyFile": "TreeView/TreeView.stories.tsx",
          "storyTitle": "Navigation/TreeView",
          "description": "The tree has no checkbox logic: the checkbox is a child, the checked set is yours, and the click has to be stopped from reaching row selection."
        },
        {
          "name": "Selectable",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { FileText, Folder } from '@wallarm-org/design-system/icons';\nimport { Input } from '@wallarm-org/design-system/Input';\nimport { TreeView, TreeViewItem } from '@wallarm-org/design-system/TreeView';\n\nexport const Selectable = () => {\n  const [selected, setSelected] = useState<string[]>(['button']);\n  return (\n    <div className='w-320'>\n      <TreeView selectable selectedIds={selected} onSelectionChange={setSelected}>\n        <TreeViewItem id='components' defaultOpen>\n          <Folder />\n          Components\n          <TreeViewItem id='button'>\n            <FileText />\n            Button.tsx\n          </TreeViewItem>\n          <TreeViewItem id='input'>\n            <FileText />\n            Input.tsx\n          </TreeViewItem>\n        </TreeViewItem>\n        <TreeViewItem id='index'>\n          <FileText />\n          index.ts\n        </TreeViewItem>\n      </TreeView>\n    </div>\n  );\n};",
          "storyFile": "TreeView/TreeView.stories.tsx",
          "storyTitle": "Navigation/TreeView",
          "description": "`selectable` (with `multiSelect` for more than one) turns rows into a selection, controlled through `selectedIds` or left to the component."
        },
        {
          "name": "WithInlineBadge",
          "code": "import { Badge } from '@wallarm-org/design-system/Badge';\nimport { FileText, Folder } from '@wallarm-org/design-system/icons';\nimport { TreeView, TreeViewItem } from '@wallarm-org/design-system/TreeView';\n\nexport const WithInlineBadge = () => (\n  <div className='w-320'>\n    <TreeView>\n      <TreeViewItem defaultOpen>\n        <Folder />\n        Endpoints\n        <TreeViewItem>\n          <FileText />\n          <Badge color='slate' size='small'>\n            new\n          </Badge>\n          /users\n        </TreeViewItem>\n        <TreeViewItem>\n          <FileText />\n          <Badge color='green' type='secondary' size='small' textVariant='code'>\n            GET\n          </Badge>\n          /orders\n        </TreeViewItem>\n      </TreeViewItem>\n      <TreeViewItem>\n        <FileText />\n        <Badge color='amber' size='small'>\n          wip\n        </Badge>\n        /health\n      </TreeViewItem>\n    </TreeView>\n  </div>\n);",
          "storyFile": "TreeView/TreeView.stories.tsx",
          "storyTitle": "Navigation/TreeView",
          "description": "A badge beside the label, for a count that belongs to the row rather than to its children."
        },
        {
          "name": "WithTrailingContent",
          "code": "import { Badge } from '@wallarm-org/design-system/Badge';\nimport { FileText, Folder } from '@wallarm-org/design-system/icons';\nimport { TreeView, TreeViewItem } from '@wallarm-org/design-system/TreeView';\n\nexport const WithTrailingContent = () => (\n  <div className='w-320'>\n    <TreeView>\n      <TreeViewItem defaultOpen>\n        <Folder />\n        src\n        <CountBadge value={3} />\n        <TreeViewItem>\n          <FileText />\n          index.ts\n          <CountBadge value={12} />\n        </TreeViewItem>\n        <TreeViewItem>\n          <FileText />\n          config.ts\n          <Badge color='blue' size='small'>\n            label\n          </Badge>\n        </TreeViewItem>\n        <TreeViewItem>\n          <FileText />\n          types.ts\n        </TreeViewItem>\n      </TreeViewItem>\n      <TreeViewItem>\n        <Folder />\n        public\n        <CountBadge value={1} />\n        <TreeViewItem>\n          <FileText />\n          favicon.ico\n        </TreeViewItem>\n      </TreeViewItem>\n    </TreeView>\n  </div>\n);",
          "storyFile": "TreeView/TreeView.stories.tsx",
          "storyTitle": "Navigation/TreeView",
          "description": "The label is `flex-1`, so anything after it lands against the right edge — which is how a count or a tag ends up trailing without any prop for it."
        },
        {
          "name": "Disabled",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { FileText, Folder } from '@wallarm-org/design-system/icons';\nimport { Input } from '@wallarm-org/design-system/Input';\nimport { TreeView, TreeViewItem } from '@wallarm-org/design-system/TreeView';\n\nexport const Disabled = () => (\n  <div className='w-320'>\n    <TreeView selectable>\n      <TreeViewItem id='components' defaultOpen>\n        <Folder />\n        Components\n        <TreeViewItem id='button'>\n          <FileText />\n          Button.tsx\n        </TreeViewItem>\n        <TreeViewItem id='input' disabled>\n          <FileText />\n          Input.tsx (disabled)\n        </TreeViewItem>\n      </TreeViewItem>\n      <TreeViewItem disabled>\n        <Folder />\n        Utils (disabled)\n        <TreeViewItem>\n          <FileText />\n          cn.ts\n        </TreeViewItem>\n      </TreeViewItem>\n      <TreeViewItem id='index'>\n        <FileText />\n        index.ts\n      </TreeViewItem>\n    </TreeView>\n  </div>\n);",
          "storyFile": "TreeView/TreeView.stories.tsx",
          "storyTitle": "Navigation/TreeView",
          "description": "A disabled row dims and stops responding to everything: toggle, selection and checkbox alike."
        },
        {
          "name": "WithHeaderAndSearch",
          "code": "import { type ReactNode, useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { ChevronsDownUp, ChevronsUpDown, FileText, Folder, PanelRightClose, Search } from '@wallarm-org/design-system/icons';\nimport { Input } from '@wallarm-org/design-system/Input';\nimport { Text } from '@wallarm-org/design-system/Text';\nimport { TreeView, TreeViewItem } from '@wallarm-org/design-system/TreeView';\n\nexport const WithHeaderAndSearch = () => {\n  const [query, setQuery] = useState('');\n  const q = query.trim().toLowerCase();\n  const [openIds, setOpenIds] = useState<Set<string>>(() => new Set(['src', 'components']));\n\n  const isOpen = (id: string) => (q ? true : openIds.has(id));\n  const toggle = (id: string, v: boolean) =>\n    setOpenIds(prev => {\n      const next = new Set(prev);\n      if (v) {\n        next.add(id);\n      } else {\n        next.delete(id);\n      }\n      return next;\n    });\n  const setAll = (open: boolean) => setOpenIds(open ? new Set(BRANCH_IDS) : new Set());\n\n  const renderNode = (node: SearchNode): ReactNode => {\n    const selfMatch = !q || node.label.toLowerCase().includes(q);\n    const icon = node.type === 'folder' ? <Folder /> : <FileText />;\n\n    if (node.children) {\n      const kids = node.children.map(renderNode).filter(Boolean);\n      if (q && !selfMatch && kids.length === 0) {\n        return null;\n      }\n      return (\n        <TreeViewItem key={node.id} open={isOpen(node.id)} onOpenChange={v => toggle(node.id, v)}>\n          {icon}\n          {node.label}\n          {kids}\n        </TreeViewItem>\n      );\n    }\n\n    if (!selfMatch) {\n      return null;\n    }\n    return (\n      <TreeViewItem key={node.id}>\n        {icon}\n        {node.label}\n      </TreeViewItem>\n    );\n  };\n\n  const nodes = TREE_DATA.map(renderNode).filter(Boolean);\n\n  return (\n    <div className='w-320'>\n      <TreeView data-testid='tree-view'>\n        {/* Header — expand/collapse buttons grouped tightly, close set apart */}\n        <div className='flex items-center gap-8 px-8 pt-8 pb-4'>\n          <Text size='xs' weight='medium' color='secondary' grow truncate>\n            Header\n          </Text>\n          <div className='flex shrink-0 items-center gap-8'>\n            <div className='flex items-center gap-2'>\n              <Button\n                variant='ghost'\n                color='neutral'\n                size='small'\n                aria-label='Collapse all'\n                onClick={() => setAll(false)}\n              >\n                <ChevronsDownUp size='sm' />\n              </Button>\n              <Button\n                variant='ghost'\n                color='neutral'\n                size='small'\n                aria-label='Expand all'\n                onClick={() => setAll(true)}\n              >\n                <ChevronsUpDown size='sm' />\n              </Button>\n            </div>\n            <Button variant='ghost' color='neutral' size='small' aria-label='Close panel'>\n              <PanelRightClose size='sm' />\n            </Button>\n          </div>\n        </div>\n\n        {/* Search — full width, aligned with the items' selection highlight */}\n        <div className='pb-4'>\n          <div className='relative'>\n            <Search\n              size='md'\n              className='pointer-events-none absolute top-1/2 left-12 -translate-y-1/2 text-text-secondary'\n            />\n            <Input\n              placeholder='Search'\n              value={query}\n              onChange={e => setQuery(e.target.value)}\n              className='pl-40'\n            />\n          </div>\n        </div>\n\n        {nodes}\n      </TreeView>\n    </div>\n  );\n};",
          "storyFile": "TreeView/TreeView.stories.tsx",
          "storyTitle": "Navigation/TreeView",
          "description": "The toolbar is assembled from `Text`, `Button` and `Input` — there is no TreeView toolbar. Expand-all drives the items’ controlled `open` state, and the search keeps ancestors of matches and opens them."
        }
      ]
    },
    {
      "name": "UserMessage",
      "description": "A message the user sent to Wally: an `<article>` named \"You\" that right-aligns a light-brand bubble. The bubble keeps the text’s whitespace and clamps it to 11 lines; when it overflows, a fade appears with a Show more / Show less toggle that reports `aria-expanded` and points `aria-controls` at the text. The toggle is `UserMessageShowMore`, rendered by default — pass your own instance through `showMore` for custom labels or `data-*` attributes, or `null` for none. Put a `MessageActions` row (timestamp, then Copy) after the bubble; it is revealed when the message is hovered or focused.",
      "importPath": "@wallarm-org/design-system/UserMessage",
      "props": [
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [
        {
          "name": "withToggle",
          "options": [
            "true",
            "false"
          ],
          "defaultValue": "false"
        },
        {
          "name": "clamped",
          "options": [
            "true"
          ]
        },
        {
          "name": "expanded",
          "options": [
            "false"
          ],
          "defaultValue": "false"
        }
      ],
      "subComponents": [
        {
          "name": "UserMessageBubble",
          "props": [
            {
              "name": "showMore",
              "type": "ReactNode",
              "required": false,
              "description": "The Show more / Show less toggle, rendered when the text overflows 11 lines.\nDefaults to `<UserMessageShowMore />`; pass your own instance to add `data-*`\n(the analytics seam) or custom labels; `null` or `false` renders no toggle."
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "UserMessageShowMore",
          "props": [
            {
              "name": "showMoreLabel",
              "type": "ReactNode",
              "required": false,
              "description": "Label while the text is clamped.",
              "defaultValue": "Show more"
            },
            {
              "name": "showLessLabel",
              "type": "ReactNode",
              "required": false,
              "description": "Label while the text is expanded.",
              "defaultValue": "Show less"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "name",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "value",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Short",
          "code": "import { UserMessage, UserMessageBubble } from '@wallarm-org/design-system/UserMessage';\n\nexport const Short = () => (\n  <UserMessage data-testid='short'>\n    <UserMessageBubble>Show me blocked attacks for the last 24 hours</UserMessageBubble>\n  </UserMessage>\n);",
          "storyFile": "UserMessage/UserMessage.stories.tsx",
          "storyTitle": "AI/UserMessage",
          "description": "A one-line question: the bubble hugs its text and is 44px tall."
        },
        {
          "name": "Multiline",
          "code": "import { UserMessage, UserMessageBubble } from '@wallarm-org/design-system/UserMessage';\n\nexport const Multiline = () => (\n  <UserMessage data-testid='multiline'>\n    <UserMessageBubble>\n      {\n        'Compare these two endpoints:\\n  - POST /api/v1/login\\n  - POST /api/v2/login\\n\\nWhich one gets more attacks?'\n      }\n    </UserMessageBubble>\n  </UserMessage>\n);",
          "storyFile": "UserMessage/UserMessage.stories.tsx",
          "storyTitle": "AI/UserMessage",
          "description": "Line breaks and indentation in the text are kept as typed."
        },
        {
          "name": "LongCollapsed",
          "code": "import { UserMessage, UserMessageBubble } from '@wallarm-org/design-system/UserMessage';\n\nexport const LongCollapsed = () => (\n  <UserMessage data-testid='long'>\n    <UserMessageBubble>{LONG}</UserMessageBubble>\n  </UserMessage>\n);",
          "storyFile": "UserMessage/UserMessage.stories.tsx",
          "storyTitle": "AI/UserMessage",
          "description": "Text longer than 11 lines is clamped under a fade with Show more. Click it to expand;\nthe same button then reads Show less and collapses the text again."
        },
        {
          "name": "WithActions",
          "code": "import { Copyable, CopyableIcon } from '@wallarm-org/design-system/Copyable';\nimport { MessageAction, MessageActions, MessageTimestamp } from '@wallarm-org/design-system/MessageActions';\nimport { UserMessage, UserMessageBubble } from '@wallarm-org/design-system/UserMessage';\n\nexport const WithActions = () => {\n  const text = 'Show me blocked attacks for the last 24 hours';\n\n  return (\n    <UserMessage data-testid='with-actions'>\n      <UserMessageBubble>{text}</UserMessageBubble>\n      <MessageActions>\n        <MessageTimestamp dateTime='2026-10-21T09:41:00Z'>2m ago</MessageTimestamp>\n        <Copyable text={text}>\n          <MessageAction aria-label='Copy'>\n            <CopyableIcon />\n          </MessageAction>\n        </Copyable>\n      </MessageActions>\n    </UserMessage>\n  );\n};",
          "storyFile": "UserMessage/UserMessage.stories.tsx",
          "storyTitle": "AI/UserMessage",
          "description": "With the user actions row — timestamp, then Copy — revealed on hover or focus."
        },
        {
          "name": "CustomShowMore",
          "code": "import { UserMessage, UserMessageBubble, UserMessageShowMore } from '@wallarm-org/design-system/UserMessage';\n\nexport const CustomShowMore = () => (\n  <UserMessage data-testid='custom'>\n    <UserMessageBubble\n      showMore={\n        <UserMessageShowMore\n          showMoreLabel='Expand'\n          showLessLabel='Collapse'\n          data-analytics-id='WALLY_USER_MESSAGE_TOGGLE'\n        />\n      }\n    >\n      {LONG}\n    </UserMessageBubble>\n  </UserMessage>\n);",
          "storyFile": "UserMessage/UserMessage.stories.tsx",
          "storyTitle": "AI/UserMessage",
          "description": "Pass your own `UserMessageShowMore` to `showMore` for custom labels or analytics:\n`data-analytics-id` lands on the real `<button>`."
        }
      ]
    },
    {
      "name": "UtilityPage",
      "description": "The whole-screen state template — 404, 403, 500, offline — for when the app itself cannot render; reach for `EmptyState` when only a region came back empty, and `Banner` or `Alert` when the app still works and this is only a message. It replaces the view and brings its own background and `Logo`, so what you supply is copy and one primary way out, not a layout.",
      "importPath": "@wallarm-org/design-system/UtilityPage",
      "props": [
        {
          "name": "title",
          "type": "string",
          "required": true
        },
        {
          "name": "subtitle",
          "type": "string",
          "required": true
        },
        {
          "name": "description",
          "type": "string",
          "required": true
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [],
      "examples": [
        {
          "name": "Error404",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { UtilityPage } from '@wallarm-org/design-system/UtilityPage';\n\nexport const Error404 = () => (\n  <UtilityPage>\n    <Button variant='primary' color='brand' size='large'>\n      Take me home\n    </Button>\n  </UtilityPage>\n);",
          "storyFile": "UtilityPage/UtilityPage.stories.tsx",
          "storyTitle": "Pages/UtilityPage",
          "description": "The lightest case — the address is wrong, not the product — so the description points at the link and the single button is the way back."
        },
        {
          "name": "Error403",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { UtilityPage } from '@wallarm-org/design-system/UtilityPage';\n\nexport const Error403 = () => (\n  <UtilityPage>\n    <Button variant='primary' color='brand' size='large'>\n      Take me home\n    </Button>\n  </UtilityPage>\n);",
          "storyFile": "UtilityPage/UtilityPage.stories.tsx",
          "storyTitle": "Pages/UtilityPage",
          "description": "A permission wall rather than a failure: the copy names whose role is short and who can change it, so the reader knows the next move is a person and not a retry."
        },
        {
          "name": "Error500",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { ArrowRight } from '@wallarm-org/design-system/icons';\nimport { UtilityPage } from '@wallarm-org/design-system/UtilityPage';\n\nexport const Error500 = () => (\n  <UtilityPage>\n    <Button variant='primary' color='brand' size='large'>\n      Take me home\n    </Button>\n    <Button variant='secondary' color='neutral' size='large'>\n      Still broken? Check status <ArrowRight />\n    </Button>\n  </UtilityPage>\n);",
          "storyFile": "UtilityPage/UtilityPage.stories.tsx",
          "storyTitle": "Pages/UtilityPage",
          "description": "Ours to fix, said plainly, with the house reassurance that protection keeps running while the console does not. It is also the only story with a second button — one primary way out, at most one secondary."
        },
        {
          "name": "Offline",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { UtilityPage } from '@wallarm-org/design-system/UtilityPage';\n\nexport const Offline = () => (\n  <UtilityPage>\n    <Button variant='primary' color='brand' size='large'>\n      Try again\n    </Button>\n  </UtilityPage>\n);",
          "storyFile": "UtilityPage/UtilityPage.stories.tsx",
          "storyTitle": "Pages/UtilityPage",
          "description": "The connection dropped, not the service: 'Try again' is the way out, and the copy promises automatic reconnection so nobody sits watching the button."
        }
      ]
    },
    {
      "name": "WallyAssistant",
      "description": "The closed Wally panel: pass a `ChatSnapshot` (messages, status, suggestions, permissions, context) and callbacks, and it renders the whole Figma chat — header, stick-to-bottom log, greeting, chain of thought, docked approval and input. It holds no agent state: the app folds its stream into a new snapshot on every delta. Send is blocked while the last message has a pending approval (typing still works), and a resolved card stays docked until the next message. Every rule lives in exported pieces — `ChatViewProvider`, `deriveChatState`, `ChatMessageView`, `ChatPartView` — so a custom layout reuses them (Custom Layout). Seams like `renderPart`, `renderStepContent` and `renderMessageActions` hand back the default rendering. Stories are driven by `useMockWally()` from `WallyAssistant/mocks` and keep feedback and permissions in app state. Messages render with the default `AssistantMessageMarkdown`, and fenced code highlights with the lazy Prism adapter WallyAssistant mounts unless the app provides a `CodeSnippetAdapterProvider`.",
      "importPath": "@wallarm-org/design-system/WallyAssistant",
      "props": [
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "background",
          "type": "ChatBackground | undefined",
          "required": false,
          "description": "Decorative mesh behind the panel (Figma chat-bg 67:1254). `'strong'` is Main (12%, for an\nempty chat), `'subtle'` is Chat (5%, for a running conversation), `'none'` renders nothing."
        },
        {
          "name": "messages",
          "type": "readonly ChatMessage[]",
          "required": true
        },
        {
          "name": "status",
          "type": "ChatStatus | undefined",
          "required": false,
          "description": "Default 'ready'.",
          "defaultValue": "ready"
        },
        {
          "name": "suggestions",
          "type": "readonly ChatSuggestionItem[] | undefined",
          "required": false
        },
        {
          "name": "permissions",
          "type": "readonly ChatToolPermission[] | undefined",
          "required": false
        },
        {
          "name": "context",
          "type": "readonly ChatContextItem[] | undefined",
          "required": false
        },
        {
          "name": "value",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onValueChange",
          "type": "((value: string) => void) | undefined",
          "required": false
        },
        {
          "name": "disabled",
          "type": "boolean | undefined",
          "required": false,
          "description": "Disables the textarea, Send and the suggestion pills (e.g. `!agent.isReady`)."
        },
        {
          "name": "textareaRef",
          "type": "Ref<HTMLTextAreaElement> | undefined",
          "required": false,
          "description": "Focus management, e.g. focus the input after a thread switch."
        },
        {
          "name": "onSubmit",
          "type": "(text: string) => void",
          "required": true,
          "description": "Trimmed text. Not called when empty, while running, while an approval is pending, or when disabled."
        },
        {
          "name": "onStop",
          "type": "(() => void) | undefined",
          "required": false,
          "description": "Stop button, and Esc in the textarea while running (also inside a Drawer/Dialog: ChatInput\n claims that Esc from the layer, so no host recipe is needed)."
        },
        {
          "name": "onSuggestionSelect",
          "type": "((suggestion: ChatSuggestionItem) => void) | undefined",
          "required": false,
          "description": "Default: onSubmit(suggestion.prompt ?? suggestion.label)."
        },
        {
          "name": "onPermissionChange",
          "type": "((permission: ChatToolPermission, allowed: boolean) => void) | undefined",
          "required": false,
          "description": "Absent, or no permissions → no permissions button in the input."
        },
        {
          "name": "onContextRemove",
          "type": "((item: ChatContextItem) => void) | undefined",
          "required": false,
          "description": "Absent → context chips aren't removable."
        },
        {
          "name": "header",
          "type": "ReactNode",
          "required": false
        },
        {
          "name": "headerTitle",
          "type": "ReactNode",
          "required": false,
          "description": "ChatHeaderTitle children, e.g. a thread Select (Figma Variant2)."
        },
        {
          "name": "headerActions",
          "type": "ReactNode",
          "required": false,
          "description": "New chat, history, close: your Buttons, so analytics land on them."
        },
        {
          "name": "emptyState",
          "type": "ReactNode",
          "required": false,
          "description": "Replaces the greeting and its pills (e.g. a history-loading state)."
        },
        {
          "name": "footerStart",
          "type": "ReactNode",
          "required": false,
          "description": "Top of ChatFooter, above the suggestions (banners)."
        },
        {
          "name": "inputTools",
          "type": "ReactNode",
          "required": false,
          "description": "Extra toolbar items in the input, between permissions and Send."
        },
        {
          "name": "input",
          "type": "ReactNode",
          "required": false,
          "description": "Replaces the whole ChatInput composition (you wire value and submit yourself)."
        },
        {
          "name": "onCopy",
          "type": "((message: ChatMessage, text: string) => void) | undefined",
          "required": false,
          "description": "Fired after Copy copied; Copy itself shows whenever the message has text."
        },
        {
          "name": "labels",
          "type": "Partial<ChatLabels> | undefined",
          "required": false
        },
        {
          "name": "icons",
          "type": "Readonly<Record<string, ReactNode>> | undefined",
          "required": false,
          "description": "Icon key → element from src/icons; wins over the built-in Figma 483:1899 table."
        },
        {
          "name": "markdown",
          "type": "ComponentType<ChatMarkdownProps> | undefined",
          "required": false,
          "description": "The markdown renderer, at module scope (never inline). Default: the DS `AssistantMessageMarkdown` (GFM,\n streaming-safe, no raw HTML, http/https/mailto/relative links only, no images). A replacement owns its own\n sanitizing. To change one element, wrap it at module scope:\n `const WallyMarkdown: FC<ChatMarkdownProps> = p => <AssistantMessageMarkdown {...p} components={MAP} />`."
        },
        {
          "name": "formatTimestamp",
          "type": "((createdAt: string) => string) | undefined",
          "required": false,
          "description": "ISO → label. Default: DS formatRelativeTime (honours DateFormatProvider). Give it a new identity on your\n clock tick to refresh \"2 min ago\" — the DS runs no clock."
        },
        {
          "name": "approvalPlacement",
          "type": "\"inline\" | \"docked\" | undefined",
          "required": false,
          "description": "'docked': the last message's approvals render in the footer. Default 'inline' here;\n WallyAssistant defaults to 'docked' (Figma). A custom layout passes the same value to\n `deriveChatState`, or the approval renders twice (provider 'inline') or never (provider 'docked').",
          "defaultValue": "docked"
        },
        {
          "name": "renderPart",
          "type": "complex",
          "required": false,
          "description": "Called for every part, custom and unknown types included. undefined = the default; null = nothing.\n A render function: no hooks inside — put them in the components you return.\n While it is set, every part counts as rendered for the loader and the actions row (its output\n is unknown up front), so a running reply made only of parts it maps to nothing shows no loader."
        },
        {
          "name": "renderStepContent",
          "type": "complex",
          "required": false,
          "description": "A step's collapsible body: rich tool output, or a card for one tool via `step.name`.\n undefined = the default; null = no body (the row isn't collapsible). No hooks inside."
        },
        {
          "name": "renderMessageActions",
          "type": "complex",
          "required": false,
          "description": "The actions row's children (Figma Wally order: Copy, ThumbsUp, ThumbsDown, Ellipsis, Timestamp).\n undefined = the default order; null = no row. No hooks inside."
        },
        {
          "name": "onApprovalRespond",
          "type": "complex",
          "required": false,
          "description": "Absent → approval buttons are disabled."
        },
        {
          "name": "onFeedback",
          "type": "complex",
          "required": false,
          "description": "Absent → no thumbs. Clicking the pressed thumb sends null."
        },
        {
          "name": "onRetry",
          "type": "complex",
          "required": false,
          "description": "Absent → no Retry on error parts."
        }
      ],
      "variants": [],
      "subComponents": [
        {
          "name": "ApprovalCardView",
          "props": [
            {
              "name": "approval",
              "type": "ChatApprovalPart",
              "required": true
            },
            {
              "name": "message",
              "type": "ChatMessage | undefined",
              "required": false
            },
            {
              "name": "onRespond",
              "type": "((response: ChatApprovalResponse) => void) | undefined",
              "required": false,
              "description": "Default: the provider's onApprovalRespond. Absent → buttons disabled."
            },
            {
              "name": "disabled",
              "type": "boolean | undefined",
              "required": false,
              "description": "ORed with `approval.disabled`; ChatPartView sets it for approvals in older messages.",
              "defaultValue": "false"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "ChainOfThoughtView",
          "props": [
            {
              "name": "part",
              "type": "ChatChainOfThoughtPart",
              "required": true
            },
            {
              "name": "message",
              "type": "ChatMessage",
              "required": true
            },
            {
              "name": "active",
              "type": "boolean | undefined",
              "required": false,
              "description": "The run is still producing this message: the block stays flat and never folds.",
              "defaultValue": "false"
            },
            {
              "name": "working",
              "type": "boolean | undefined",
              "required": false,
              "description": "Append the synthetic \"Working...\" row: the run is busy but no step is live.",
              "defaultValue": "false"
            },
            {
              "name": "title",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "defaultChecked",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "defaultValue",
              "type": "string | number | readonly string[] | undefined",
              "required": false
            },
            {
              "name": "autoFocus",
              "type": "boolean | undefined",
              "required": false
            },
            {
              "name": "id",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "tabIndex",
              "type": "number | undefined",
              "required": false
            },
            {
              "name": "rel",
              "type": "string | undefined",
              "required": false
            },
            {
              "name": "onChange",
              "type": "ChangeEventHandler<T, Element> | undefined",
              "required": false
            },
            {
              "name": "type",
              "type": "\"a\" | \"i\" | \"1\" | \"A\" | \"I\" | undefined",
              "required": false
            },
            {
              "name": "data-testid",
              "type": "string | undefined",
              "required": false
            }
          ]
        },
        {
          "name": "ChatMessageView",
          "props": [
            {
              "name": "message",
              "type": "ChatMessage",
              "required": true
            },
            {
              "name": "index",
              "type": "number",
              "required": true,
              "description": "Position in the rendered rows: drives the test id (`user-message-{index}` / `assistant-message-{index}`)."
            },
            {
              "name": "isLast",
              "type": "boolean",
              "required": true,
              "description": "The last row: loader, streaming, docked approvals, always-visible actions."
            }
          ]
        },
        {
          "name": "ChatPartView",
          "props": [
            {
              "name": "part",
              "type": "ChatPart",
              "required": true
            },
            {
              "name": "message",
              "type": "ChatMessage",
              "required": true
            },
            {
              "name": "isLast",
              "type": "boolean",
              "required": true
            },
            {
              "name": "placement",
              "type": "\"inline\" | \"docked\" | undefined",
              "required": false,
              "description": "'docked' when you render a docked approval in your own footer. Default 'inline'.",
              "defaultValue": "inline"
            }
          ]
        },
        {
          "name": "ChatViewProvider",
          "props": [
            {
              "name": "status",
              "type": "ChatStatus | undefined",
              "required": false,
              "description": "Default 'ready'.",
              "defaultValue": "ready"
            },
            {
              "name": "labels",
              "type": "Partial<ChatLabels> | undefined",
              "required": false
            },
            {
              "name": "icons",
              "type": "Readonly<Record<string, ReactNode>> | undefined",
              "required": false,
              "description": "Icon key → element from src/icons; wins over the built-in Figma 483:1899 table."
            },
            {
              "name": "markdown",
              "type": "ComponentType<ChatMarkdownProps> | undefined",
              "required": false,
              "description": "The markdown renderer, at module scope (never inline). Default: the DS `AssistantMessageMarkdown` (GFM,\n streaming-safe, no raw HTML, http/https/mailto/relative links only, no images). A replacement owns its own\n sanitizing. To change one element, wrap it at module scope:\n `const WallyMarkdown: FC<ChatMarkdownProps> = p => <AssistantMessageMarkdown {...p} components={MAP} />`.",
              "defaultValue": "AssistantMessageMarkdown"
            },
            {
              "name": "formatTimestamp",
              "type": "((createdAt: string) => string) | undefined",
              "required": false,
              "description": "ISO → label. Default: DS formatRelativeTime (honours DateFormatProvider). Give it a new identity on your\n clock tick to refresh \"2 min ago\" — the DS runs no clock."
            },
            {
              "name": "approvalPlacement",
              "type": "\"inline\" | \"docked\" | undefined",
              "required": false,
              "description": "'docked': the last message's approvals render in the footer. Default 'inline' here;\n WallyAssistant defaults to 'docked' (Figma). A custom layout passes the same value to\n `deriveChatState`, or the approval renders twice (provider 'inline') or never (provider 'docked').",
              "defaultValue": "inline"
            },
            {
              "name": "renderPart",
              "type": "complex",
              "required": false,
              "description": "Called for every part, custom and unknown types included. undefined = the default; null = nothing.\n A render function: no hooks inside — put them in the components you return.\n While it is set, every part counts as rendered for the loader and the actions row (its output\n is unknown up front), so a running reply made only of parts it maps to nothing shows no loader."
            },
            {
              "name": "renderStepContent",
              "type": "complex",
              "required": false,
              "description": "A step's collapsible body: rich tool output, or a card for one tool via `step.name`.\n undefined = the default; null = no body (the row isn't collapsible). No hooks inside."
            },
            {
              "name": "renderMessageActions",
              "type": "complex",
              "required": false,
              "description": "The actions row's children (Figma Wally order: Copy, ThumbsUp, ThumbsDown, Ellipsis, Timestamp).\n undefined = the default order; null = no row. No hooks inside."
            },
            {
              "name": "onApprovalRespond",
              "type": "complex",
              "required": false,
              "description": "Absent → approval buttons are disabled."
            },
            {
              "name": "onFeedback",
              "type": "complex",
              "required": false,
              "description": "Absent → no thumbs. Clicking the pressed thumb sends null."
            },
            {
              "name": "onCopy",
              "type": "((message: ChatMessage, text: string) => void) | undefined",
              "required": false,
              "description": "Fired after Copy copied; Copy itself shows whenever the message has text."
            },
            {
              "name": "onRetry",
              "type": "complex",
              "required": false,
              "description": "Absent → no Retry on error parts."
            }
          ]
        }
      ],
      "examples": [
        {
          "name": "Empty",
          "code": "import { useState } from 'react';\nimport { type ChatAssistantMessage, type ChatFeedback, type ChatToolPermission, WallyAssistant } from '@wallarm-org/design-system/WallyAssistant';\nimport { EMPTY, useMockWally } from './mocks';\n\nexport const Empty = () => {\n  const wally = useMockWally({ initial: EMPTY });\n  const [feedback, setFeedback] = useState<Record<string, ChatFeedback | null>>({});\n  const [permissions, setPermissions] = useState(EMPTY.permissions);\n  const messages = wally.snapshot.messages.map(m =>\n    m.role === 'assistant' && m.id in feedback ? withFeedback(m, feedback[m.id] ?? null) : m,\n  );\n\n  const handleFeedback = (message: ChatAssistantMessage, value: ChatFeedback | null) => {\n    setFeedback(f => ({ ...f, [message.id]: value }));\n  };\n\n  const handlePermissionChange = (permission: ChatToolPermission, allowed: boolean) => {\n    setPermissions(list => list?.map(x => (x.id === permission.id ? { ...x, allowed } : x)));\n  };\n\n  return (\n    <div className='h-640 w-480'>\n      <WallyAssistant\n        data-testid='wally'\n        {...wally.snapshot}\n        messages={messages}\n        permissions={permissions}\n        formatTimestamp={fixedTime}\n        onSubmit={wally.send}\n        onStop={wally.stop}\n        onApprovalRespond={wally.respond}\n        onFeedback={handleFeedback}\n        onPermissionChange={handlePermissionChange}\n      />\n    </div>\n  );\n};",
          "storyFile": "WallyAssistant/WallyAssistant.stories.tsx",
          "storyTitle": "AI/WallyAssistant",
          "description": "No messages: the greeting with Large suggestion pills on the strong background. A pill starts a run."
        },
        {
          "name": "Conversation",
          "code": "import { useState } from 'react';\nimport { type ChatAssistantMessage, type ChatFeedback, type ChatToolPermission, WallyAssistant } from '@wallarm-org/design-system/WallyAssistant';\nimport { CONVERSATION, useMockWally } from './mocks';\n\nexport const Conversation = () => {\n  const wally = useMockWally({ initial: CONVERSATION });\n  const [feedback, setFeedback] = useState<Record<string, ChatFeedback | null>>({});\n  const [permissions, setPermissions] = useState(CONVERSATION.permissions);\n  const messages = wally.snapshot.messages.map(m =>\n    m.role === 'assistant' && m.id in feedback ? withFeedback(m, feedback[m.id] ?? null) : m,\n  );\n\n  const handleFeedback = (message: ChatAssistantMessage, value: ChatFeedback | null) => {\n    setFeedback(f => ({ ...f, [message.id]: value }));\n  };\n\n  const handlePermissionChange = (permission: ChatToolPermission, allowed: boolean) => {\n    setPermissions(list => list?.map(x => (x.id === permission.id ? { ...x, allowed } : x)));\n  };\n\n  return (\n    <div className='h-640 w-480'>\n      <WallyAssistant\n        data-testid='wally'\n        {...wally.snapshot}\n        messages={messages}\n        permissions={permissions}\n        formatTimestamp={fixedTime}\n        onSubmit={wally.send}\n        onStop={wally.stop}\n        onApprovalRespond={wally.respond}\n        onFeedback={handleFeedback}\n        onPermissionChange={handlePermissionChange}\n      />\n    </div>\n  );\n};",
          "storyFile": "WallyAssistant/WallyAssistant.stories.tsx",
          "storyTitle": "AI/WallyAssistant",
          "description": "Two finished turns: folded chain of thought, answers with Copy, thumbs and timestamps, follow-up pills and the permissions button."
        },
        {
          "name": "StreamingSimulation",
          "code": "import { useState } from 'react';\nimport { type ChatAssistantMessage, type ChatFeedback, type ChatToolPermission, WallyAssistant } from '@wallarm-org/design-system/WallyAssistant';\nimport { CONVERSATION, useMockWally } from './mocks';\n\nexport const StreamingSimulation = ({ speed }) => {\n  const wally = useMockWally({ initial: CONVERSATION, speed });\n  const [feedback, setFeedback] = useState<Record<string, ChatFeedback | null>>({});\n  const [permissions, setPermissions] = useState(CONVERSATION.permissions);\n  const messages = wally.snapshot.messages.map(m =>\n    m.role === 'assistant' && m.id in feedback ? withFeedback(m, feedback[m.id] ?? null) : m,\n  );\n\n  const handleFeedback = (message: ChatAssistantMessage, value: ChatFeedback | null) => {\n    setFeedback(f => ({ ...f, [message.id]: value }));\n  };\n\n  const handlePermissionChange = (permission: ChatToolPermission, allowed: boolean) => {\n    setPermissions(list => list?.map(x => (x.id === permission.id ? { ...x, allowed } : x)));\n  };\n\n  return (\n    <div className='h-640 w-480'>\n      <WallyAssistant\n        data-testid='wally'\n        {...wally.snapshot}\n        messages={messages}\n        permissions={permissions}\n        formatTimestamp={fixedTime}\n        onSubmit={wally.send}\n        onStop={wally.stop}\n        onApprovalRespond={wally.respond}\n        onFeedback={handleFeedback}\n        onPermissionChange={handlePermissionChange}\n      />\n    </div>\n  );\n};",
          "storyFile": "WallyAssistant/WallyAssistant.stories.tsx",
          "storyTitle": "AI/WallyAssistant",
          "description": "The whole Wally script from `useMockWally()`: send a message or click a pill to watch the loader,\na live reasoning step, three tool steps with the Working row between them, the streamed answer,\nthen the fold under \"Worked for 12s\". Stop cancels the run. `speed` scales every delay (0 = instant)."
        },
        {
          "name": "Approval",
          "code": "import { useState } from 'react';\nimport { type ChatAssistantMessage, type ChatFeedback, type ChatToolPermission, WallyAssistant } from '@wallarm-org/design-system/WallyAssistant';\nimport { APPROVAL_PENDING, useMockWally } from './mocks';\n\nexport const Approval = () => {\n  const wally = useMockWally({ initial: APPROVAL_PENDING });\n  const [feedback, setFeedback] = useState<Record<string, ChatFeedback | null>>({});\n  const [permissions, setPermissions] = useState(APPROVAL_PENDING.permissions);\n  const messages = wally.snapshot.messages.map(m =>\n    m.role === 'assistant' && m.id in feedback ? withFeedback(m, feedback[m.id] ?? null) : m,\n  );\n\n  const handleFeedback = (message: ChatAssistantMessage, value: ChatFeedback | null) => {\n    setFeedback(f => ({ ...f, [message.id]: value }));\n  };\n\n  const handlePermissionChange = (permission: ChatToolPermission, allowed: boolean) => {\n    setPermissions(list => list?.map(x => (x.id === permission.id ? { ...x, allowed } : x)));\n  };\n\n  return (\n    <div className='h-640 w-480'>\n      <WallyAssistant\n        data-testid='wally'\n        {...wally.snapshot}\n        messages={messages}\n        permissions={permissions}\n        formatTimestamp={fixedTime}\n        onSubmit={wally.send}\n        onStop={wally.stop}\n        onApprovalRespond={wally.respond}\n        onFeedback={handleFeedback}\n        onPermissionChange={handlePermissionChange}\n      />\n    </div>\n  );\n};",
          "storyFile": "WallyAssistant/WallyAssistant.stories.tsx",
          "storyTitle": "AI/WallyAssistant",
          "description": "A pending approval docked above the input: Send is blocked (typing still works). Allow or Reject goes through `onApprovalRespond`, and the next snapshot resolves the card in place."
        },
        {
          "name": "ErrorState",
          "code": "import { useState } from 'react';\nimport { type ChatAssistantMessage, type ChatFeedback, type ChatToolPermission, WallyAssistant } from '@wallarm-org/design-system/WallyAssistant';\nimport { ERROR_TURN, useMockWally } from './mocks';\n\nexport const ErrorState = () => {\n  const wally = useMockWally({ initial: ERROR_TURN });\n  const [feedback, setFeedback] = useState<Record<string, ChatFeedback | null>>({});\n  const [permissions, setPermissions] = useState(ERROR_TURN.permissions);\n  const [retries, setRetries] = useState(0);\n  const messages = wally.snapshot.messages.map(m =>\n    m.role === 'assistant' && m.id in feedback ? withFeedback(m, feedback[m.id] ?? null) : m,\n  );\n\n  const handleFeedback = (message: ChatAssistantMessage, value: ChatFeedback | null) => {\n    setFeedback(f => ({ ...f, [message.id]: value }));\n  };\n\n  const handlePermissionChange = (permission: ChatToolPermission, allowed: boolean) => {\n    setPermissions(list => list?.map(x => (x.id === permission.id ? { ...x, allowed } : x)));\n  };\n\n  const handleRetry = () => {\n    setRetries(n => n + 1);\n  };\n\n  return (\n    <div className='h-640 w-480'>\n      <WallyAssistant\n        data-testid='wally'\n        {...wally.snapshot}\n        messages={messages}\n        permissions={permissions}\n        formatTimestamp={fixedTime}\n        onSubmit={wally.send}\n        onStop={wally.stop}\n        onApprovalRespond={wally.respond}\n        onFeedback={handleFeedback}\n        onPermissionChange={handlePermissionChange}\n        onRetry={handleRetry}\n        footerStart={\n          retries ? <p className='text-xs text-text-secondary'>Retried {retries}×</p> : null\n        }\n      />\n    </div>\n  );\n};",
          "storyFile": "WallyAssistant/WallyAssistant.stories.tsx",
          "storyTitle": "AI/WallyAssistant",
          "description": "A run that failed before any output: `AssistantMessageError` with Retry, wired to `onRetry`."
        },
        {
          "name": "Overrides",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Paperclip } from '@wallarm-org/design-system/icons';\nimport { Select, SelectButton, SelectContent, SelectOption, SelectOptionIndicator, SelectOptionText, SelectPositioner } from '@wallarm-org/design-system/Select';\nimport { type ChatAssistantMessage, type ChatFeedback, type ChatToolPermission, WallyAssistant } from '@wallarm-org/design-system/WallyAssistant';\nimport { useMockWally } from './mocks';\n\nexport const Overrides = () => {\n  const wally = useMockWally({ initial: OVERRIDES });\n  const [feedback, setFeedback] = useState<Record<string, ChatFeedback | null>>({});\n  const [permissions, setPermissions] = useState(OVERRIDES.permissions);\n  const messages = wally.snapshot.messages.map(m =>\n    m.role === 'assistant' && m.id in feedback ? withFeedback(m, feedback[m.id] ?? null) : m,\n  );\n\n  const handleFeedback = (message: ChatAssistantMessage, value: ChatFeedback | null) => {\n    setFeedback(f => ({ ...f, [message.id]: value }));\n  };\n\n  const handlePermissionChange = (permission: ChatToolPermission, allowed: boolean) => {\n    setPermissions(list => list?.map(x => (x.id === permission.id ? { ...x, allowed } : x)));\n  };\n\n  return (\n    <div className='h-640 w-480'>\n      <WallyAssistant\n        data-testid='wally'\n        {...wally.snapshot}\n        messages={messages}\n        permissions={permissions}\n        formatTimestamp={fixedTime}\n        onSubmit={wally.send}\n        onStop={wally.stop}\n        onApprovalRespond={wally.respond}\n        onFeedback={handleFeedback}\n        onPermissionChange={handlePermissionChange}\n        renderPart={renderPart}\n        renderStepContent={renderStepContent}\n        renderMessageActions={renderMessageActions}\n        headerTitle={\n          <Select collection={threads} defaultValue={['attacks']}>\n            <SelectButton variant='ghost' size='small' placeholder='New chat' />\n            <SelectPositioner>\n              <SelectContent>\n                {threads.items.map(item => (\n                  <SelectOption key={item.value} item={item}>\n                    <SelectOptionText>{item.label}</SelectOptionText>\n                    <SelectOptionIndicator />\n                  </SelectOption>\n                ))}\n              </SelectContent>\n            </SelectPositioner>\n          </Select>\n        }\n        inputTools={\n          <Button variant='ghost' color='neutral' size='small' aria-label='Datei anhängen'>\n            <Paperclip />\n          </Button>\n        }\n        labels={{\n          placeholder: 'Frag Wally...',\n          input: 'Nachricht an Wally',\n          send: 'Senden',\n          stop: 'Antwort stoppen',\n          disclaimer: 'Wally kann sich irren; bitte prüfen.',\n          suggestions: 'Vorschläge',\n          feedbackPositive: 'Gute Antwort',\n          feedbackNegative: 'Schlechte Antwort',\n        }}\n      />\n    </div>\n  );\n};",
          "storyFile": "WallyAssistant/WallyAssistant.stories.tsx",
          "storyTitle": "AI/WallyAssistant",
          "description": "Every seam at once: `renderPart` draws a `custom` attack summary, `renderStepContent` puts a table\nunder `search_attacks`, `renderMessageActions` adds a tagged Copy and an Ellipsis menu, a thread\n`Select` in `headerTitle`, an attach button in `inputTools`, and German `labels`."
        },
        {
          "name": "CustomLayout",
          "code": "import { useState } from 'react';\nimport { Chat, ChatFooter, ChatHeader, ChatHeaderTitle } from '@wallarm-org/design-system/Chat';\nimport { ChatInput, ChatInputSubmit, ChatInputTextarea } from '@wallarm-org/design-system/ChatInput';\nimport { ConversationContent, Conversation as ConversationRoot, ConversationScrollButton } from '@wallarm-org/design-system/Conversation';\nimport { ChatMessageView, ChatPartView, ChatViewProvider, deriveChatState } from '@wallarm-org/design-system/WallyAssistant';\nimport { CONVERSATION, useMockWally } from './mocks';\n\nexport const CustomLayout = () => {\n  const wally = useMockWally({ initial: CONVERSATION });\n  const [draft, setDraft] = useState('');\n  const { messages, status } = wally.snapshot;\n  const state = deriveChatState(messages, status, 'docked');\n  const last = state.rows[state.rows.length - 1];\n\n  const handleSubmit = (text: string) => {\n    if (state.awaitingApproval) return;\n    wally.send(text);\n    setDraft('');\n  };\n\n  return (\n    <ChatViewProvider\n      status={status}\n      approvalPlacement='docked'\n      formatTimestamp={fixedTime}\n      onApprovalRespond={wally.respond}\n    >\n      <div className='h-screen'>\n        <Chat data-testid='wally' background={state.empty ? 'strong' : 'subtle'}>\n          <ChatHeader>\n            <ChatHeaderTitle label='Wally workspace' />\n          </ChatHeader>\n          <ConversationRoot autoScrollKey={state.lastUserMessageId}>\n            <ConversationContent aria-busy={state.busy} contentClassName='mx-auto w-full max-w-768'>\n              {state.rows.map((m, i) => (\n                <ChatMessageView\n                  key={m.id}\n                  message={m}\n                  index={i}\n                  isLast={i === state.rows.length - 1}\n                />\n              ))}\n            </ConversationContent>\n            <ConversationScrollButton />\n          </ConversationRoot>\n          <ChatFooter className='mx-auto w-full max-w-768'>\n            {last &&\n              state.dockedApprovals.map(a => (\n                <ChatPartView key={a.id} part={a} message={last} isLast placement='docked' />\n              ))}\n            <ChatInput\n              value={draft}\n              onValueChange={setDraft}\n              onSubmit={handleSubmit}\n              onStop={wally.stop}\n              isRunning={state.running}\n            >\n              <ChatInputTextarea />\n              <ChatInputSubmit disabled={state.awaitingApproval && !state.running} />\n            </ChatInput>\n          </ChatFooter>\n        </Chat>\n      </div>\n    </ChatViewProvider>\n  );\n};",
          "storyFile": "WallyAssistant/WallyAssistant.stories.tsx",
          "storyTitle": "AI/WallyAssistant",
          "description": "A full-page chat with a centered 768px column, built from `ChatViewProvider`, `deriveChatState`, `Chat`, `Conversation*`, `ChatMessageView`, docked `ChatPartView` and its own `ChatInput` — proof the open parts reuse every rule."
        },
        {
          "name": "InDrawer",
          "code": "import { Button } from '@wallarm-org/design-system/Button';\nimport { Chat, ChatTrigger } from '@wallarm-org/design-system/Chat';\nimport { Drawer, DrawerClose, DrawerContent, DrawerTitle, DrawerTrigger } from '@wallarm-org/design-system/Drawer';\nimport { History, Plus, X } from '@wallarm-org/design-system/icons';\nimport { Separator } from '@wallarm-org/design-system/Separator';\nimport { WallyAssistant } from '@wallarm-org/design-system/WallyAssistant';\nimport { CONVERSATION, useMockWally } from './mocks';\n\nexport const InDrawer = () => {\n  const wally = useMockWally({ initial: CONVERSATION });\n\n  return (\n    <Drawer width={480}>\n      <DrawerTrigger asChild>\n        <ChatTrigger data-testid='chat-trigger' />\n      </DrawerTrigger>\n      <DrawerContent>\n        {/* Names the dialog \"Wally\" (Ark points aria-labelledby at the title); hidden because\n            the panel header already shows it. */}\n        <div className='sr-only'>\n          <DrawerTitle>Wally</DrawerTitle>\n        </div>\n        <WallyAssistant\n          data-testid='wally'\n          {...wally.snapshot}\n          formatTimestamp={fixedTime}\n          onSubmit={wally.send}\n          onStop={wally.stop}\n          onApprovalRespond={wally.respond}\n          headerActions={\n            <>\n              <Button variant='ghost' color='neutral' size='small' aria-label='New chat'>\n                <Plus />\n              </Button>\n              <Button variant='ghost' color='neutral' size='small' aria-label='Chat history'>\n                <History />\n              </Button>\n              <Separator orientation='vertical' />\n              <DrawerClose asChild>\n                <Button variant='ghost' color='neutral' size='small' aria-label='Close chat'>\n                  <X />\n                </Button>\n              </DrawerClose>\n            </>\n          }\n        />\n      </DrawerContent>\n    </Drawer>\n  );\n};",
          "storyFile": "WallyAssistant/WallyAssistant.stories.tsx",
          "storyTitle": "AI/WallyAssistant",
          "description": "Hosted in a 480px Drawer opened by `ChatTrigger`. Esc in the textarea while a reply streams stops it without closing the drawer — ChatInput handles that itself, no host recipe needed."
        },
        {
          "name": "Analytics",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { Plus } from '@wallarm-org/design-system/icons';\nimport { type ChatAssistantMessage, type ChatFeedback, type ChatToolPermission, WallyAssistant } from '@wallarm-org/design-system/WallyAssistant';\nimport { CONVERSATION, useMockWally } from './mocks';\n\nexport const Analytics = () => {\n  const wally = useMockWally({ initial: CONVERSATION });\n  const [feedback, setFeedback] = useState<Record<string, ChatFeedback | null>>({});\n  const [permissions, setPermissions] = useState(CONVERSATION.permissions);\n  const messages = wally.snapshot.messages.map(m =>\n    m.role === 'assistant' && m.id in feedback ? withFeedback(m, feedback[m.id] ?? null) : m,\n  );\n\n  const handleFeedback = (message: ChatAssistantMessage, value: ChatFeedback | null) => {\n    setFeedback(f => ({ ...f, [message.id]: value }));\n  };\n\n  const handlePermissionChange = (permission: ChatToolPermission, allowed: boolean) => {\n    setPermissions(list => list?.map(x => (x.id === permission.id ? { ...x, allowed } : x)));\n  };\n\n  return (\n    <div className='h-640 w-480'>\n      <WallyAssistant\n        data-testid='wally'\n        data-analytics-id='wally.panel'\n        data-analytics-props='{\"surface\":\"story\"}'\n        {...wally.snapshot}\n        messages={messages}\n        permissions={permissions}\n        formatTimestamp={fixedTime}\n        onSubmit={wally.send}\n        onStop={wally.stop}\n        onApprovalRespond={wally.respond}\n        onFeedback={handleFeedback}\n        onPermissionChange={handlePermissionChange}\n        headerActions={\n          <Button\n            variant='ghost'\n            color='neutral'\n            size='small'\n            aria-label='New chat'\n            data-analytics-id='wally.new-chat'\n          >\n            <Plus />\n          </Button>\n        }\n        renderMessageActions={renderAnalyticsActions}\n      />\n    </div>\n  );\n};",
          "storyFile": "WallyAssistant/WallyAssistant.stories.tsx",
          "storyTitle": "AI/WallyAssistant",
          "description": "Analytics attributes land on real nodes: the root `<section>`, header-action Buttons and a tagged Copy from `renderMessageActions` (like, dislike and timestamp stay default). Closed targets (pills, Send, approval options) report through their callbacks — see ANALYTICS_GAPS.md."
        }
      ]
    },
    {
      "name": "WallyIcon",
      "description": "Wally, the mascot for Wallarm’s AI assistant — the mark that signals an AI surface rather than a general-purpose icon, so keep it for the assistant and reach for the icon set for everything else. `simple` is the bare mark and `circle` wraps it in its own badge so it can sit on a coloured surface; both are sized by height from 16px to 64px, with the width following.",
      "importPath": "@wallarm-org/design-system/WallyIcon",
      "props": [
        {
          "name": "variant",
          "type": "WallyIconStyle | undefined",
          "required": false,
          "defaultValue": "simple"
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "type",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "name",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "href",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "target",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "height",
          "type": "string | number | undefined",
          "required": false
        },
        {
          "name": "width",
          "type": "string | number | undefined",
          "required": false
        },
        {
          "name": "max",
          "type": "string | number | undefined",
          "required": false
        },
        {
          "name": "min",
          "type": "string | number | undefined",
          "required": false
        },
        {
          "name": "size",
          "type": "{ xs: string; sm: string; md: string; lg: string; xl: string; }",
          "required": false,
          "defaultValue": "md"
        }
      ],
      "variants": [
        {
          "name": "size",
          "options": [
            "xs",
            "sm",
            "md",
            "lg",
            "xl"
          ],
          "defaultValue": "md"
        }
      ],
      "subComponents": [],
      "examples": [
        {
          "name": "Basic",
          "code": "import { WallyIcon } from '@wallarm-org/design-system/WallyIcon';\n\nexport const Basic = () => <WallyIcon />;",
          "storyFile": "WallyIcon/WallyIcon.stories.tsx",
          "storyTitle": "Brand/WallyIcon",
          "description": "Wally at the defaults — `simple` at `md`, which is 24px tall."
        },
        {
          "name": "Styles",
          "code": "import { HStack, VStack } from '@wallarm-org/design-system/Stack';\nimport { WallyIcon } from '@wallarm-org/design-system/WallyIcon';\n\nexport const Styles = () => (\n  <HStack gap={32} justify='around' align='start'>\n    <VStack gap={8} align='center'>\n      <WallyIcon variant='simple' />\n    </VStack>\n    <VStack gap={8} align='center'>\n      <WallyIcon variant='circle' />\n    </VStack>\n  </HStack>\n);",
          "storyFile": "WallyIcon/WallyIcon.stories.tsx",
          "storyTitle": "Brand/WallyIcon",
          "description": "The two variants side by side. The badge is what lets the mark keep its edge on a coloured or busy surface; on a plain panel the bare mark is enough."
        },
        {
          "name": "Sizes",
          "code": "import { HStack, VStack } from '@wallarm-org/design-system/Stack';\nimport { WallyIcon } from '@wallarm-org/design-system/WallyIcon';\n\nexport const Sizes = () => (\n  <HStack gap={48} justify='center' align='stretch'>\n    <VStack gap={16} align='center'>\n      <WallyIcon variant='simple' size='xs' />\n      <WallyIcon variant='simple' size='sm' />\n      <WallyIcon variant='simple' size='md' />\n      <WallyIcon variant='simple' size='lg' />\n      <WallyIcon variant='simple' size='xl' />\n    </VStack>\n\n    <VStack gap={16} align='center'>\n      <WallyIcon variant='circle' size='xs' />\n      <WallyIcon variant='circle' size='sm' />\n      <WallyIcon variant='circle' size='md' />\n      <WallyIcon variant='circle' size='lg' />\n      <WallyIcon variant='circle' size='xl' />\n    </VStack>\n  </HStack>\n);",
          "storyFile": "WallyIcon/WallyIcon.stories.tsx",
          "storyTitle": "Brand/WallyIcon",
          "description": "`xs` to `xl` in both variants. Worth reading down the columns to see where the detail in the bare mark gives out and the badge stops helping."
        }
      ]
    },
    {
      "name": "WallySkeleton",
      "description": "Use the same WallySkeleton while the host downloads the assistant remote, the remote checks access, and the runtime connects. Import it from `@wallarm-org/design-system/WallySkeleton` without loading WallyAssistant or its markdown renderer. Give the parent a height; the skeleton fills it. Placeholders and the decorative mesh are static, so remounting between loading stages preserves the image, including with reduced motion. The surface announces “Loading Wally”; override `aria-label` for localization. It has no interactive controls.",
      "importPath": "@wallarm-org/design-system/WallySkeleton",
      "props": [
        {
          "name": "title",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "defaultChecked",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "defaultValue",
          "type": "string | number | readonly string[] | undefined",
          "required": false
        },
        {
          "name": "autoFocus",
          "type": "boolean | undefined",
          "required": false
        },
        {
          "name": "id",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "tabIndex",
          "type": "number | undefined",
          "required": false
        },
        {
          "name": "rel",
          "type": "string | undefined",
          "required": false
        },
        {
          "name": "onChange",
          "type": "ChangeEventHandler<T, Element> | undefined",
          "required": false
        },
        {
          "name": "data-testid",
          "type": "string | undefined",
          "required": false
        }
      ],
      "variants": [],
      "subComponents": [],
      "examples": [
        {
          "name": "Default",
          "code": "import { WallySkeleton } from '@wallarm-org/design-system/WallySkeleton';\n\nexport const Default = () => (\n  <div className='h-640 w-480 max-w-full'>\n    <WallySkeleton data-testid='wally-loading' />\n  </div>\n);",
          "storyFile": "WallySkeleton/WallySkeleton.stories.tsx",
          "storyTitle": "AI/WallySkeleton"
        },
        {
          "name": "Narrow",
          "code": "import { WallySkeleton } from '@wallarm-org/design-system/WallySkeleton';\n\nexport const Narrow = () => (\n  <div className='h-640 w-320 max-w-full'>\n    <WallySkeleton data-testid='wally-loading' />\n  </div>\n);",
          "storyFile": "WallySkeleton/WallySkeleton.stories.tsx",
          "storyTitle": "AI/WallySkeleton"
        },
        {
          "name": "Handoff",
          "code": "import { useState } from 'react';\nimport { Button } from '@wallarm-org/design-system/Button';\nimport { WallySkeleton } from '@wallarm-org/design-system/WallySkeleton';\n\nexport const Handoff = () => {\n  const [stage, setStage] = useState(0);\n\n  return (\n    <div className='flex flex-col gap-12'>\n      <Button data-testid='next-stage' onClick={() => setStage(current => current + 1)}>\n        Continue loading\n      </Button>\n      <div className='h-640 w-480 max-w-full'>\n        <WallySkeleton key={stage} data-testid='wally-loading' />\n      </div>\n    </div>\n  );\n};",
          "storyFile": "WallySkeleton/WallySkeleton.stories.tsx",
          "storyTitle": "AI/WallySkeleton",
          "description": "Continue loading remounts the skeleton, like replacing the host fallback with the remote’s own loading state. Its geometry, colors and background stay identical."
        }
      ]
    }
  ],
  "tokens": [
    {
      "name": "colors-primary",
      "description": "Primary brand colors (slate, red, w-orange, amber, green, blue, purple)",
      "tokens": [
        {
          "name": "--color-slate-50",
          "value": "#f8fafc"
        },
        {
          "name": "--color-slate-100",
          "value": "#f1f5f9"
        },
        {
          "name": "--color-slate-200",
          "value": "#e2e8f0"
        },
        {
          "name": "--color-slate-300",
          "value": "#cad5e2"
        },
        {
          "name": "--color-slate-400",
          "value": "#90a1b9"
        },
        {
          "name": "--color-slate-500",
          "value": "#62748e"
        },
        {
          "name": "--color-slate-600",
          "value": "#45556c"
        },
        {
          "name": "--color-slate-700",
          "value": "#314158"
        },
        {
          "name": "--color-slate-800",
          "value": "#1d293d"
        },
        {
          "name": "--color-slate-900",
          "value": "#0f172b"
        },
        {
          "name": "--color-slate-950",
          "value": "#020618"
        },
        {
          "name": "--color-slate-975",
          "value": "#010413"
        },
        {
          "name": "--color-red-50",
          "value": "#fef2f2"
        },
        {
          "name": "--color-red-100",
          "value": "#ffe2e2"
        },
        {
          "name": "--color-red-200",
          "value": "#ffc9c9"
        },
        {
          "name": "--color-red-300",
          "value": "#ffa2a2"
        },
        {
          "name": "--color-red-400",
          "value": "#ff6467"
        },
        {
          "name": "--color-red-500",
          "value": "#fb2c36"
        },
        {
          "name": "--color-red-600",
          "value": "#e7000b"
        },
        {
          "name": "--color-red-700",
          "value": "#c10007"
        },
        {
          "name": "--color-red-800",
          "value": "#9f0712"
        },
        {
          "name": "--color-red-900",
          "value": "#82181a"
        },
        {
          "name": "--color-red-950",
          "value": "#460809"
        },
        {
          "name": "--color-w-orange-50",
          "value": "#fff5ed"
        },
        {
          "name": "--color-w-orange-100",
          "value": "#ffe1d0"
        },
        {
          "name": "--color-w-orange-200",
          "value": "#ffc8ac"
        },
        {
          "name": "--color-w-orange-300",
          "value": "#ffa985"
        },
        {
          "name": "--color-w-orange-400",
          "value": "#ff8a52"
        },
        {
          "name": "--color-w-orange-500",
          "value": "#ff6633"
        },
        {
          "name": "--color-w-orange-600",
          "value": "#ff441c"
        },
        {
          "name": "--color-w-orange-700",
          "value": "#e12f0c"
        },
        {
          "name": "--color-w-orange-800",
          "value": "#b82005"
        },
        {
          "name": "--color-w-orange-900",
          "value": "#911908"
        },
        {
          "name": "--color-w-orange-950",
          "value": "#560e06"
        },
        {
          "name": "--color-amber-50",
          "value": "#fffbeb"
        },
        {
          "name": "--color-amber-100",
          "value": "#fef3c6"
        },
        {
          "name": "--color-amber-200",
          "value": "#fee685"
        },
        {
          "name": "--color-amber-300",
          "value": "#ffd230"
        },
        {
          "name": "--color-amber-400",
          "value": "#ffb900"
        },
        {
          "name": "--color-amber-500",
          "value": "#fe9a00"
        },
        {
          "name": "--color-amber-600",
          "value": "#e17100"
        },
        {
          "name": "--color-amber-700",
          "value": "#bb4d00"
        },
        {
          "name": "--color-amber-800",
          "value": "#973c00"
        },
        {
          "name": "--color-amber-900",
          "value": "#7b3306"
        },
        {
          "name": "--color-amber-950",
          "value": "#461901"
        },
        {
          "name": "--color-green-50",
          "value": "#f0fdf4"
        },
        {
          "name": "--color-green-100",
          "value": "#dcfce7"
        },
        {
          "name": "--color-green-200",
          "value": "#b9f8cf"
        },
        {
          "name": "--color-green-300",
          "value": "#7bf1a8"
        },
        {
          "name": "--color-green-400",
          "value": "#05df72"
        },
        {
          "name": "--color-green-500",
          "value": "#00c950"
        },
        {
          "name": "--color-green-600",
          "value": "#00a63e"
        },
        {
          "name": "--color-green-700",
          "value": "#008236"
        },
        {
          "name": "--color-green-800",
          "value": "#016630"
        },
        {
          "name": "--color-green-900",
          "value": "#0d542b"
        },
        {
          "name": "--color-green-950",
          "value": "#032e15"
        },
        {
          "name": "--color-blue-50",
          "value": "#eff6ff"
        },
        {
          "name": "--color-blue-100",
          "value": "#dbeafe"
        },
        {
          "name": "--color-blue-200",
          "value": "#bedbff"
        },
        {
          "name": "--color-blue-300",
          "value": "#8ec5ff"
        },
        {
          "name": "--color-blue-400",
          "value": "#51a2ff"
        },
        {
          "name": "--color-blue-500",
          "value": "#2b7fff"
        },
        {
          "name": "--color-blue-600",
          "value": "#155dfc"
        },
        {
          "name": "--color-blue-700",
          "value": "#1447e6"
        },
        {
          "name": "--color-blue-800",
          "value": "#193cb8"
        },
        {
          "name": "--color-blue-900",
          "value": "#1c398e"
        },
        {
          "name": "--color-blue-950",
          "value": "#162456"
        },
        {
          "name": "--color-purple-50",
          "value": "#faf5ff"
        },
        {
          "name": "--color-purple-100",
          "value": "#f3e8ff"
        },
        {
          "name": "--color-purple-200",
          "value": "#e9d4ff"
        },
        {
          "name": "--color-purple-300",
          "value": "#dab2ff"
        },
        {
          "name": "--color-purple-400",
          "value": "#c27aff"
        },
        {
          "name": "--color-purple-500",
          "value": "#ad46ff"
        },
        {
          "name": "--color-purple-600",
          "value": "#9810fa"
        },
        {
          "name": "--color-purple-700",
          "value": "#8200db"
        },
        {
          "name": "--color-purple-800",
          "value": "#6e11b0"
        },
        {
          "name": "--color-purple-900",
          "value": "#59168b"
        },
        {
          "name": "--color-purple-950",
          "value": "#3c0366"
        }
      ]
    },
    {
      "name": "colors-secondary",
      "description": "Secondary colors (orange, yellow, lime, emerald, teal, cyan, sky, indigo, violet, fuchsia, pink, rose)",
      "tokens": [
        {
          "name": "--color-orange-50",
          "value": "#fff7ed"
        },
        {
          "name": "--color-orange-100",
          "value": "#ffedd4"
        },
        {
          "name": "--color-orange-200",
          "value": "#ffd6a8"
        },
        {
          "name": "--color-orange-300",
          "value": "#ffb86a"
        },
        {
          "name": "--color-orange-400",
          "value": "#ff8904"
        },
        {
          "name": "--color-orange-500",
          "value": "#ff6900"
        },
        {
          "name": "--color-orange-600",
          "value": "#f54900"
        },
        {
          "name": "--color-orange-700",
          "value": "#ca3500"
        },
        {
          "name": "--color-orange-800",
          "value": "#9f2d00"
        },
        {
          "name": "--color-orange-900",
          "value": "#7e2a0c"
        },
        {
          "name": "--color-orange-950",
          "value": "#441306"
        },
        {
          "name": "--color-yellow-50",
          "value": "#fefce8"
        },
        {
          "name": "--color-yellow-100",
          "value": "#fef9c2"
        },
        {
          "name": "--color-yellow-200",
          "value": "#fff085"
        },
        {
          "name": "--color-yellow-300",
          "value": "#ffdf20"
        },
        {
          "name": "--color-yellow-400",
          "value": "#fdc700"
        },
        {
          "name": "--color-yellow-500",
          "value": "#f0b100"
        },
        {
          "name": "--color-yellow-600",
          "value": "#d08700"
        },
        {
          "name": "--color-yellow-700",
          "value": "#a65f00"
        },
        {
          "name": "--color-yellow-800",
          "value": "#894b00"
        },
        {
          "name": "--color-yellow-900",
          "value": "#733e0a"
        },
        {
          "name": "--color-yellow-950",
          "value": "#432004"
        },
        {
          "name": "--color-lime-50",
          "value": "#f7fee7"
        },
        {
          "name": "--color-lime-100",
          "value": "#ecfcca"
        },
        {
          "name": "--color-lime-200",
          "value": "#d8f999"
        },
        {
          "name": "--color-lime-300",
          "value": "#bbf451"
        },
        {
          "name": "--color-lime-400",
          "value": "#9ae600"
        },
        {
          "name": "--color-lime-500",
          "value": "#7ccf00"
        },
        {
          "name": "--color-lime-600",
          "value": "#5ea500"
        },
        {
          "name": "--color-lime-700",
          "value": "#497d00"
        },
        {
          "name": "--color-lime-800",
          "value": "#3c6300"
        },
        {
          "name": "--color-lime-900",
          "value": "#35530e"
        },
        {
          "name": "--color-lime-950",
          "value": "#192e03"
        },
        {
          "name": "--color-emerald-50",
          "value": "#ecfdf5"
        },
        {
          "name": "--color-emerald-100",
          "value": "#d0fae5"
        },
        {
          "name": "--color-emerald-200",
          "value": "#a4f4cf"
        },
        {
          "name": "--color-emerald-300",
          "value": "#5ee9b5"
        },
        {
          "name": "--color-emerald-400",
          "value": "#00d492"
        },
        {
          "name": "--color-emerald-500",
          "value": "#00bc7d"
        },
        {
          "name": "--color-emerald-600",
          "value": "#009966"
        },
        {
          "name": "--color-emerald-700",
          "value": "#007a55"
        },
        {
          "name": "--color-emerald-800",
          "value": "#006045"
        },
        {
          "name": "--color-emerald-900",
          "value": "#004f3b"
        },
        {
          "name": "--color-emerald-950",
          "value": "#002c22"
        },
        {
          "name": "--color-teal-50",
          "value": "#f0fdfa"
        },
        {
          "name": "--color-teal-100",
          "value": "#cbfbf1"
        },
        {
          "name": "--color-teal-200",
          "value": "#96f7e4"
        },
        {
          "name": "--color-teal-300",
          "value": "#46ecd5"
        },
        {
          "name": "--color-teal-400",
          "value": "#00d5be"
        },
        {
          "name": "--color-teal-500",
          "value": "#00bba7"
        },
        {
          "name": "--color-teal-600",
          "value": "#009689"
        },
        {
          "name": "--color-teal-700",
          "value": "#00786f"
        },
        {
          "name": "--color-teal-800",
          "value": "#005f5a"
        },
        {
          "name": "--color-teal-900",
          "value": "#0b4f4a"
        },
        {
          "name": "--color-teal-950",
          "value": "#022f2e"
        },
        {
          "name": "--color-cyan-50",
          "value": "#ecfeff"
        },
        {
          "name": "--color-cyan-100",
          "value": "#cefafe"
        },
        {
          "name": "--color-cyan-200",
          "value": "#a2f4fd"
        },
        {
          "name": "--color-cyan-300",
          "value": "#53eafd"
        },
        {
          "name": "--color-cyan-400",
          "value": "#00d3f3"
        },
        {
          "name": "--color-cyan-500",
          "value": "#00b8db"
        },
        {
          "name": "--color-cyan-600",
          "value": "#0092b8"
        },
        {
          "name": "--color-cyan-700",
          "value": "#007595"
        },
        {
          "name": "--color-cyan-800",
          "value": "#005f78"
        },
        {
          "name": "--color-cyan-900",
          "value": "#104e64"
        },
        {
          "name": "--color-cyan-950",
          "value": "#053345"
        },
        {
          "name": "--color-sky-50",
          "value": "#f0f9ff"
        },
        {
          "name": "--color-sky-100",
          "value": "#dff2fe"
        },
        {
          "name": "--color-sky-200",
          "value": "#b8e6fe"
        },
        {
          "name": "--color-sky-300",
          "value": "#74d4ff"
        },
        {
          "name": "--color-sky-400",
          "value": "#00bcff"
        },
        {
          "name": "--color-sky-500",
          "value": "#00a6f4"
        },
        {
          "name": "--color-sky-600",
          "value": "#0084d1"
        },
        {
          "name": "--color-sky-700",
          "value": "#0069a8"
        },
        {
          "name": "--color-sky-800",
          "value": "#00598a"
        },
        {
          "name": "--color-sky-900",
          "value": "#024a70"
        },
        {
          "name": "--color-sky-950",
          "value": "#052f4a"
        },
        {
          "name": "--color-indigo-50",
          "value": "#eef2ff"
        },
        {
          "name": "--color-indigo-100",
          "value": "#e0e7ff"
        },
        {
          "name": "--color-indigo-200",
          "value": "#c6d2ff"
        },
        {
          "name": "--color-indigo-300",
          "value": "#a3b3ff"
        },
        {
          "name": "--color-indigo-400",
          "value": "#7c86ff"
        },
        {
          "name": "--color-indigo-500",
          "value": "#615fff"
        },
        {
          "name": "--color-indigo-600",
          "value": "#4f39f6"
        },
        {
          "name": "--color-indigo-700",
          "value": "#432dd7"
        },
        {
          "name": "--color-indigo-800",
          "value": "#372aac"
        },
        {
          "name": "--color-indigo-900",
          "value": "#312c85"
        },
        {
          "name": "--color-indigo-950",
          "value": "#1e1a4d"
        },
        {
          "name": "--color-violet-50",
          "value": "#f5f3ff"
        },
        {
          "name": "--color-violet-100",
          "value": "#ede9fe"
        },
        {
          "name": "--color-violet-200",
          "value": "#ddd6ff"
        },
        {
          "name": "--color-violet-300",
          "value": "#c4b4ff"
        },
        {
          "name": "--color-violet-400",
          "value": "#a684ff"
        },
        {
          "name": "--color-violet-500",
          "value": "#8e51ff"
        },
        {
          "name": "--color-violet-600",
          "value": "#7f22fe"
        },
        {
          "name": "--color-violet-700",
          "value": "#7008e7"
        },
        {
          "name": "--color-violet-800",
          "value": "#5d0ec0"
        },
        {
          "name": "--color-violet-900",
          "value": "#4d179a"
        },
        {
          "name": "--color-violet-950",
          "value": "#2f0d68"
        },
        {
          "name": "--color-fuchsia-50",
          "value": "#fdf4ff"
        },
        {
          "name": "--color-fuchsia-100",
          "value": "#fae8ff"
        },
        {
          "name": "--color-fuchsia-200",
          "value": "#f6cfff"
        },
        {
          "name": "--color-fuchsia-300",
          "value": "#f4a8ff"
        },
        {
          "name": "--color-fuchsia-400",
          "value": "#ed6aff"
        },
        {
          "name": "--color-fuchsia-500",
          "value": "#e12afb"
        },
        {
          "name": "--color-fuchsia-600",
          "value": "#c800de"
        },
        {
          "name": "--color-fuchsia-700",
          "value": "#a800b7"
        },
        {
          "name": "--color-fuchsia-800",
          "value": "#8a0194"
        },
        {
          "name": "--color-fuchsia-900",
          "value": "#721378"
        },
        {
          "name": "--color-fuchsia-950",
          "value": "#4b004f"
        },
        {
          "name": "--color-pink-50",
          "value": "#fdf2f8"
        },
        {
          "name": "--color-pink-100",
          "value": "#fce7f3"
        },
        {
          "name": "--color-pink-200",
          "value": "#fccee8"
        },
        {
          "name": "--color-pink-300",
          "value": "#fda5d5"
        },
        {
          "name": "--color-pink-400",
          "value": "#fb64b6"
        },
        {
          "name": "--color-pink-500",
          "value": "#f6339a"
        },
        {
          "name": "--color-pink-600",
          "value": "#e60076"
        },
        {
          "name": "--color-pink-700",
          "value": "#c6005c"
        },
        {
          "name": "--color-pink-800",
          "value": "#a3004c"
        },
        {
          "name": "--color-pink-900",
          "value": "#861043"
        },
        {
          "name": "--color-pink-950",
          "value": "#510424"
        },
        {
          "name": "--color-rose-50",
          "value": "#fff1f2"
        },
        {
          "name": "--color-rose-100",
          "value": "#ffe4e6"
        },
        {
          "name": "--color-rose-200",
          "value": "#ffccd3"
        },
        {
          "name": "--color-rose-300",
          "value": "#ffa1ad"
        },
        {
          "name": "--color-rose-400",
          "value": "#ff637e"
        },
        {
          "name": "--color-rose-500",
          "value": "#ff2056"
        },
        {
          "name": "--color-rose-600",
          "value": "#ec003f"
        },
        {
          "name": "--color-rose-700",
          "value": "#c70036"
        },
        {
          "name": "--color-rose-800",
          "value": "#a50036"
        },
        {
          "name": "--color-rose-900",
          "value": "#8b0836"
        },
        {
          "name": "--color-rose-950",
          "value": "#4d0218"
        }
      ]
    },
    {
      "name": "colors-grayscale",
      "description": "Grayscale palettes (gray, zinc, neutral, stone)",
      "tokens": [
        {
          "name": "--color-gray-50",
          "value": "#f9fafb"
        },
        {
          "name": "--color-gray-100",
          "value": "#f3f4f6"
        },
        {
          "name": "--color-gray-200",
          "value": "#e5e7eb"
        },
        {
          "name": "--color-gray-300",
          "value": "#d1d5dc"
        },
        {
          "name": "--color-gray-400",
          "value": "#99a1af"
        },
        {
          "name": "--color-gray-500",
          "value": "#6a7282"
        },
        {
          "name": "--color-gray-600",
          "value": "#4a5565"
        },
        {
          "name": "--color-gray-700",
          "value": "#364153"
        },
        {
          "name": "--color-gray-800",
          "value": "#1e2939"
        },
        {
          "name": "--color-gray-900",
          "value": "#101828"
        },
        {
          "name": "--color-gray-950",
          "value": "#030712"
        },
        {
          "name": "--color-zinc-50",
          "value": "#fafafa"
        },
        {
          "name": "--color-zinc-100",
          "value": "#f4f4f5"
        },
        {
          "name": "--color-zinc-200",
          "value": "#e4e4e7"
        },
        {
          "name": "--color-zinc-300",
          "value": "#d4d4d8"
        },
        {
          "name": "--color-zinc-400",
          "value": "#9f9fa9"
        },
        {
          "name": "--color-zinc-500",
          "value": "#71717b"
        },
        {
          "name": "--color-zinc-600",
          "value": "#52525c"
        },
        {
          "name": "--color-zinc-700",
          "value": "#3f3f47"
        },
        {
          "name": "--color-zinc-800",
          "value": "#27272a"
        },
        {
          "name": "--color-zinc-900",
          "value": "#18181b"
        },
        {
          "name": "--color-zinc-950",
          "value": "#09090b"
        },
        {
          "name": "--color-neutral-50",
          "value": "#fafafa"
        },
        {
          "name": "--color-neutral-100",
          "value": "#f5f5f5"
        },
        {
          "name": "--color-neutral-200",
          "value": "#e5e5e5"
        },
        {
          "name": "--color-neutral-300",
          "value": "#d4d4d4"
        },
        {
          "name": "--color-neutral-400",
          "value": "#a1a1a1"
        },
        {
          "name": "--color-neutral-500",
          "value": "#737373"
        },
        {
          "name": "--color-neutral-600",
          "value": "#525252"
        },
        {
          "name": "--color-neutral-700",
          "value": "#404040"
        },
        {
          "name": "--color-neutral-800",
          "value": "#262626"
        },
        {
          "name": "--color-neutral-900",
          "value": "#171717"
        },
        {
          "name": "--color-neutral-950",
          "value": "#0a0a0a"
        },
        {
          "name": "--color-stone-50",
          "value": "#fafaf9"
        },
        {
          "name": "--color-stone-100",
          "value": "#f5f5f4"
        },
        {
          "name": "--color-stone-200",
          "value": "#e7e5e4"
        },
        {
          "name": "--color-stone-300",
          "value": "#d6d3d1"
        },
        {
          "name": "--color-stone-400",
          "value": "#a6a09b"
        },
        {
          "name": "--color-stone-500",
          "value": "#79716b"
        },
        {
          "name": "--color-stone-600",
          "value": "#57534d"
        },
        {
          "name": "--color-stone-700",
          "value": "#44403b"
        },
        {
          "name": "--color-stone-800",
          "value": "#292524"
        },
        {
          "name": "--color-stone-900",
          "value": "#1c1917"
        },
        {
          "name": "--color-stone-950",
          "value": "#0c0a09"
        }
      ]
    },
    {
      "name": "colors-other",
      "description": "Base colors (transparent, black, white)",
      "tokens": [
        {
          "name": "--color-transparent",
          "value": "transparent"
        },
        {
          "name": "--color-black",
          "value": "#000000"
        },
        {
          "name": "--color-white",
          "value": "#ffffff"
        }
      ]
    },
    {
      "name": "spacing",
      "description": "Spacing scale values",
      "tokens": [
        {
          "name": "--spacing",
          "value": "1px"
        },
        {
          "name": "--spacing-none",
          "value": "0px"
        },
        {
          "name": "--spacing-1",
          "value": "1px"
        },
        {
          "name": "--spacing-2",
          "value": "2px"
        },
        {
          "name": "--spacing-4",
          "value": "4px"
        },
        {
          "name": "--spacing-6",
          "value": "6px"
        },
        {
          "name": "--spacing-8",
          "value": "8px"
        },
        {
          "name": "--spacing-12",
          "value": "12px"
        },
        {
          "name": "--spacing-16",
          "value": "16px"
        },
        {
          "name": "--spacing-20",
          "value": "20px"
        },
        {
          "name": "--spacing-24",
          "value": "24px"
        },
        {
          "name": "--spacing-28",
          "value": "28px"
        },
        {
          "name": "--spacing-32",
          "value": "32px"
        },
        {
          "name": "--spacing-36",
          "value": "36px"
        },
        {
          "name": "--spacing-40",
          "value": "40px"
        },
        {
          "name": "--spacing-44",
          "value": "44px"
        },
        {
          "name": "--spacing-48",
          "value": "48px"
        },
        {
          "name": "--spacing-56",
          "value": "56px"
        },
        {
          "name": "--spacing-64",
          "value": "64px"
        },
        {
          "name": "--spacing-80",
          "value": "80px"
        },
        {
          "name": "--spacing-96",
          "value": "96px"
        },
        {
          "name": "--spacing-112",
          "value": "112px"
        },
        {
          "name": "--spacing-128",
          "value": "128px"
        },
        {
          "name": "--spacing-144",
          "value": "144px"
        }
      ]
    },
    {
      "name": "typography",
      "description": "Font families, sizes, weights, and line heights",
      "tokens": [
        {
          "name": "--font-pixel",
          "value": "'Geist Pixel', ui-sans-serif, system-ui, sans-serif"
        },
        {
          "name": "--font-serif",
          "value": "'Inter', ui-serif, Georgia, Cambria, 'Times New Roman', Times, serif"
        },
        {
          "name": "--font-weight-thin",
          "value": "100"
        },
        {
          "name": "--font-weight-extralight",
          "value": "200"
        },
        {
          "name": "--font-weight-light",
          "value": "300"
        },
        {
          "name": "--font-weight-normal",
          "value": "400"
        },
        {
          "name": "--font-weight-medium",
          "value": "450"
        },
        {
          "name": "--font-weight-semibold",
          "value": "600"
        },
        {
          "name": "--font-weight-bold",
          "value": "700"
        },
        {
          "name": "--font-weight-extrablod",
          "value": "800"
        },
        {
          "name": "--font-weight-black",
          "value": "900"
        },
        {
          "name": "--text-2xs",
          "value": "10px"
        },
        {
          "name": "--text-2xs--line-height",
          "value": "12px"
        },
        {
          "name": "--text-xs",
          "value": "12px"
        },
        {
          "name": "--text-xs--line-height",
          "value": "16px"
        },
        {
          "name": "--text-sm",
          "value": "14px"
        },
        {
          "name": "--text-sm--line-height",
          "value": "20px"
        },
        {
          "name": "--text-base",
          "value": "16px"
        },
        {
          "name": "--text-base--line-height",
          "value": "24px"
        },
        {
          "name": "--text-lg",
          "value": "18px"
        },
        {
          "name": "--text-lg--line-height",
          "value": "24px"
        },
        {
          "name": "--text-xl",
          "value": "20px"
        },
        {
          "name": "--text-xl--line-height",
          "value": "28px"
        },
        {
          "name": "--text-2xl",
          "value": "24px"
        },
        {
          "name": "--text-2xl--line-height",
          "value": "32px"
        },
        {
          "name": "--text-3xl",
          "value": "30px"
        },
        {
          "name": "--text-3xl--line-height",
          "value": "36px"
        },
        {
          "name": "--text-4xl",
          "value": "36px"
        },
        {
          "name": "--text-4xl--line-height",
          "value": "40px"
        },
        {
          "name": "--text-5xl",
          "value": "48px"
        },
        {
          "name": "--text-5xl--line-height",
          "value": "48px"
        },
        {
          "name": "--text-6xl",
          "value": "60px"
        },
        {
          "name": "--text-6xl--line-height",
          "value": "60px"
        },
        {
          "name": "--text-7xl",
          "value": "72px"
        },
        {
          "name": "--text-7xl--line-height",
          "value": "72px"
        },
        {
          "name": "--text-8xl",
          "value": "96px"
        },
        {
          "name": "--text-8xl--line-height",
          "value": "96px"
        },
        {
          "name": "--text-9xl",
          "value": "128px"
        },
        {
          "name": "--text-9xl--line-height",
          "value": "128px"
        },
        {
          "name": "--leading-2xs",
          "value": "12px"
        },
        {
          "name": "--leading-xs",
          "value": "16px"
        },
        {
          "name": "--leading-sm",
          "value": "20px"
        },
        {
          "name": "--leading-base",
          "value": "24px"
        },
        {
          "name": "--leading-lg",
          "value": "24px"
        },
        {
          "name": "--leading-xl",
          "value": "28px"
        },
        {
          "name": "--leading-2xl",
          "value": "32px"
        },
        {
          "name": "--leading-3xl",
          "value": "36px"
        },
        {
          "name": "--leading-4xl",
          "value": "40px"
        },
        {
          "name": "--leading-5xl",
          "value": "48px"
        },
        {
          "name": "--leading-6xl",
          "value": "60px"
        },
        {
          "name": "--leading-7xl",
          "value": "72px"
        },
        {
          "name": "--leading-8xl",
          "value": "96px"
        },
        {
          "name": "--leading-9xl",
          "value": "128px"
        },
        {
          "name": "--tracking-xl",
          "value": "-0.005em"
        },
        {
          "name": "--tracking-2xl",
          "value": "-0.01em"
        },
        {
          "name": "--tracking-3xl",
          "value": "-0.01em"
        },
        {
          "name": "--tracking-4xl",
          "value": "-0.015em"
        },
        {
          "name": "--tracking-5xl",
          "value": "-0.015em"
        },
        {
          "name": "--tracking-6xl",
          "value": "-0.02em"
        },
        {
          "name": "--tracking-7xl",
          "value": "-0.02em"
        }
      ]
    },
    {
      "name": "radius",
      "description": "Border radius values",
      "tokens": [
        {
          "name": "--radius-2",
          "value": "2px"
        },
        {
          "name": "--radius-4",
          "value": "4px"
        },
        {
          "name": "--radius-6",
          "value": "6px"
        },
        {
          "name": "--radius-8",
          "value": "8px"
        },
        {
          "name": "--radius-10",
          "value": "10px"
        },
        {
          "name": "--radius-12",
          "value": "12px"
        },
        {
          "name": "--radius-16",
          "value": "16px"
        },
        {
          "name": "--radius-24",
          "value": "24px"
        },
        {
          "name": "--radius-32",
          "value": "32px"
        },
        {
          "name": "--radius-full",
          "value": "9999px"
        }
      ]
    },
    {
      "name": "shadow",
      "description": "Box shadow values",
      "tokens": [
        {
          "name": "--shadow-2xs",
          "value": "0 1px 0 0 rgba(0, 0, 0, 0.05)"
        },
        {
          "name": "--shadow-xs",
          "value": "0 1px 2px 0 rgba(0, 0, 0, 0.05)"
        },
        {
          "name": "--shadow-sm",
          "value": "0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)"
        },
        {
          "name": "--shadow-md",
          "value": "0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.1)"
        },
        {
          "name": "--shadow-lg",
          "value": "0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1)"
        },
        {
          "name": "--shadow-xl",
          "value": "0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1)"
        },
        {
          "name": "--shadow-2xl",
          "value": "0 25px 50px -12px rgba(0, 0, 0, 0.25)"
        }
      ]
    },
    {
      "name": "blur",
      "description": "Blur values",
      "tokens": [
        {
          "name": "--blur-xs",
          "value": "4px"
        },
        {
          "name": "--blur-sm",
          "value": "8px"
        },
        {
          "name": "--blur-md",
          "value": "12px"
        },
        {
          "name": "--blur-lg",
          "value": "16px"
        },
        {
          "name": "--blur-xl",
          "value": "24px"
        },
        {
          "name": "--blur-2xl",
          "value": "40px"
        },
        {
          "name": "--blur-3xl",
          "value": "64px"
        }
      ]
    },
    {
      "name": "focus",
      "description": "Focus ring colors",
      "tokens": [
        {
          "name": "--color-focus-brand",
          "value": "--alpha(var(--color-w-orange-600) / 30%)"
        },
        {
          "name": "--color-focus-primary",
          "value": "--alpha(var(--color-slate-400) / 30%)"
        },
        {
          "name": "--color-focus-destructive",
          "value": "--alpha(var(--color-red-600) / 20%)"
        },
        {
          "name": "--color-focus-destructive-hover",
          "value": "--alpha(var(--color-red-600) / 30%)"
        }
      ]
    },
    {
      "name": "icon",
      "description": "Icon size values",
      "tokens": [
        {
          "name": "--icon-xs",
          "value": "10px"
        },
        {
          "name": "--icon-sm",
          "value": "12px"
        },
        {
          "name": "--icon-md",
          "value": "16px"
        },
        {
          "name": "--icon-lg",
          "value": "20px"
        },
        {
          "name": "--icon-xl",
          "value": "24px"
        },
        {
          "name": "--icon-2xl",
          "value": "32px"
        }
      ]
    },
    {
      "name": "semantic",
      "description": "Semantic design tokens for text, backgrounds, borders, states, and components",
      "tokens": [
        {
          "name": "--color-text-primary",
          "value": "var(--color-slate-900)"
        },
        {
          "name": "--color-text-primary-alt",
          "value": "var(--color-white)"
        },
        {
          "name": "--color-text-primary-fixed",
          "value": "var(--color-slate-900)"
        },
        {
          "name": "--color-text-primary-alt-fixed",
          "value": "var(--color-white)"
        },
        {
          "name": "--color-text-secondary",
          "value": "var(--color-slate-600)"
        },
        {
          "name": "--color-text-secondary-alt",
          "value": "--alpha(var(--color-white) / 80%)"
        },
        {
          "name": "--color-text-tertiary",
          "value": "var(--color-slate-300)"
        },
        {
          "name": "--color-text-tertiary-alt",
          "value": "--alpha(var(--color-white) / 70%)"
        },
        {
          "name": "--color-text-hint",
          "value": "var(--color-slate-300)"
        },
        {
          "name": "--color-text-brand",
          "value": "var(--color-w-orange-600)"
        },
        {
          "name": "--color-text-danger",
          "value": "var(--color-red-600)"
        },
        {
          "name": "--color-text-warning",
          "value": "var(--color-amber-700)"
        },
        {
          "name": "--color-text-success",
          "value": "var(--color-green-600)"
        },
        {
          "name": "--color-text-info",
          "value": "var(--color-blue-600)"
        },
        {
          "name": "--color-text-ai",
          "value": "var(--color-purple-600)"
        },
        {
          "name": "--color-text-disable-primary",
          "value": "--alpha(var(--color-slate-900) / 40%)"
        },
        {
          "name": "--color-text-disable-primary-alt",
          "value": "--alpha(var(--color-white) / 40%)"
        },
        {
          "name": "--color-text-disable-brand",
          "value": "var(--color-w-orange-200)"
        },
        {
          "name": "--color-text-disable-danger",
          "value": "var(--color-red-200)"
        },
        {
          "name": "--color-text-disable-warning",
          "value": "var(--color-amber-300)"
        },
        {
          "name": "--color-text-disable-succes",
          "value": "var(--color-green-200)"
        },
        {
          "name": "--color-text-disable-info",
          "value": "var(--color-blue-200)"
        },
        {
          "name": "--color-text-disable-ai",
          "value": "var(--color-purple-200)"
        },
        {
          "name": "--color-text-link-default",
          "value": "var(--color-blue-600)"
        },
        {
          "name": "--color-text-link-hover",
          "value": "var(--color-blue-800)"
        },
        {
          "name": "--color-text-link-default-alt",
          "value": "var(--color-blue-300)"
        },
        {
          "name": "--color-text-link-hover-alt",
          "value": "var(--color-blue-200)"
        },
        {
          "name": "--color-icon-primary",
          "value": "var(--color-slate-900)"
        },
        {
          "name": "--color-icon-primary-alt",
          "value": "var(--color-white)"
        },
        {
          "name": "--color-icon-primary-fixed",
          "value": "var(--color-slate-900)"
        },
        {
          "name": "--color-icon-primary-alt-fixed",
          "value": "var(--color-white)"
        },
        {
          "name": "--color-icon-primary-disable",
          "value": "--alpha(var(--color-slate-900) / 40%)"
        },
        {
          "name": "--color-icon-primary-alt-disable",
          "value": "--alpha(var(--color-white) / 40%)"
        },
        {
          "name": "--color-icon-secondary",
          "value": "var(--color-slate-600)"
        },
        {
          "name": "--color-icon-secondary-alt",
          "value": "--alpha(var(--color-white) / 80%)"
        },
        {
          "name": "--color-icon-brand",
          "value": "var(--color-w-orange-600)"
        },
        {
          "name": "--color-icon-danger",
          "value": "var(--color-red-600)"
        },
        {
          "name": "--color-icon-warning",
          "value": "var(--color-amber-600)"
        },
        {
          "name": "--color-icon-success",
          "value": "var(--color-green-600)"
        },
        {
          "name": "--color-icon-info",
          "value": "var(--color-blue-600)"
        },
        {
          "name": "--color-icon-ai",
          "value": "var(--color-purple-600)"
        },
        {
          "name": "--color-bg-page-bg",
          "value": "var(--color-white)"
        },
        {
          "name": "--color-bg-surface-1",
          "value": "var(--color-white)"
        },
        {
          "name": "--color-bg-surface-2",
          "value": "var(--color-white)"
        },
        {
          "name": "--color-bg-surface-3",
          "value": "var(--color-white)"
        },
        {
          "name": "--color-bg-surface-4",
          "value": "var(--color-white)"
        },
        {
          "name": "--color-bg-surface-5",
          "value": "var(--color-slate-100)"
        },
        {
          "name": "--color-bg-primary",
          "value": "var(--color-slate-100)"
        },
        {
          "name": "--color-bg-light-primary",
          "value": "var(--color-slate-50)"
        },
        {
          "name": "--color-bg-strong-primary",
          "value": "var(--color-slate-300)"
        },
        {
          "name": "--color-bg-brand",
          "value": "var(--color-w-orange-100)"
        },
        {
          "name": "--color-bg-light-brand",
          "value": "var(--color-w-orange-50)"
        },
        {
          "name": "--color-bg-strong-brand",
          "value": "var(--color-w-orange-300)"
        },
        {
          "name": "--color-bg-danger",
          "value": "var(--color-red-100)"
        },
        {
          "name": "--color-bg-light-danger",
          "value": "var(--color-red-50)"
        },
        {
          "name": "--color-bg-strong-danger",
          "value": "var(--color-red-300)"
        },
        {
          "name": "--color-bg-warning",
          "value": "var(--color-amber-100)"
        },
        {
          "name": "--color-bg-light-warning",
          "value": "var(--color-amber-50)"
        },
        {
          "name": "--color-bg-strong-warning",
          "value": "var(--color-amber-100)"
        },
        {
          "name": "--color-bg-success",
          "value": "var(--color-green-100)"
        },
        {
          "name": "--color-bg-light-success",
          "value": "var(--color-green-50)"
        },
        {
          "name": "--color-bg-strong-success",
          "value": "var(--color-green-300)"
        },
        {
          "name": "--color-bg-info",
          "value": "var(--color-blue-100)"
        },
        {
          "name": "--color-bg-light-info",
          "value": "var(--color-blue-50)"
        },
        {
          "name": "--color-bg-strong-info",
          "value": "var(--color-blue-300)"
        },
        {
          "name": "--color-bg-ai",
          "value": "var(--color-purple-100)"
        },
        {
          "name": "--color-bg-light-ai",
          "value": "var(--color-purple-50)"
        },
        {
          "name": "--color-bg-strong-ai",
          "value": "var(--color-purple-300)"
        },
        {
          "name": "--color-bg-fill-brand",
          "value": "var(--color-w-orange-600)"
        },
        {
          "name": "--color-bg-fill-danger",
          "value": "var(--color-red-600)"
        },
        {
          "name": "--color-bg-fill-warning",
          "value": "var(--color-amber-500)"
        },
        {
          "name": "--color-bg-fill-success",
          "value": "var(--color-green-600)"
        },
        {
          "name": "--color-bg-fill-info",
          "value": "var(--color-blue-600)"
        },
        {
          "name": "--color-bg-fill-ai",
          "value": "var(--color-purple-600)"
        },
        {
          "name": "--color-border-primary",
          "value": "var(--color-slate-300)"
        },
        {
          "name": "--color-border-primary-light",
          "value": "var(--color-slate-200)"
        },
        {
          "name": "--color-border-strong-primary",
          "value": "var(--color-slate-500)"
        },
        {
          "name": "--color-focus-ring-primary",
          "value": "--alpha(var(--color-slate-400) / 30%)"
        },
        {
          "name": "--color-border-brand",
          "value": "var(--color-w-orange-300)"
        },
        {
          "name": "--color-border-strong-brand",
          "value": "var(--color-w-orange-500)"
        },
        {
          "name": "--color-border-danger",
          "value": "var(--color-red-300)"
        },
        {
          "name": "--color-border-strong-danger",
          "value": "var(--color-red-600)"
        },
        {
          "name": "--color-border-warning",
          "value": "var(--color-amber-300)"
        },
        {
          "name": "--color-border-strong-warning",
          "value": "var(--color-amber-500)"
        },
        {
          "name": "--color-border-success",
          "value": "var(--color-green-300)"
        },
        {
          "name": "--color-border-strong-success",
          "value": "var(--color-green-500)"
        },
        {
          "name": "--color-border-info",
          "value": "var(--color-blue-300)"
        },
        {
          "name": "--color-border-strong-info",
          "value": "var(--color-blue-500)"
        },
        {
          "name": "--color-border-ai",
          "value": "var(--color-purple-300)"
        },
        {
          "name": "--color-border-strong-ai",
          "value": "var(--color-purple-500)"
        },
        {
          "name": "--color-states-default-all",
          "value": "--alpha(var(--color-white) / 0%)"
        },
        {
          "name": "--color-states-on-fill-hover",
          "value": "--alpha(var(--color-white) / 10%)"
        },
        {
          "name": "--color-states-on-fill-pressed",
          "value": "--alpha(var(--color-white) / 40%)"
        },
        {
          "name": "--color-states-on-fill-disabled",
          "value": "--alpha(var(--color-white) / 40%)"
        },
        {
          "name": "--color-states-primary-default-alt",
          "value": "--alpha(var(--color-slate-500) / 6%)"
        },
        {
          "name": "--color-states-primary-hover",
          "value": "--alpha(var(--color-slate-500) / 8%)"
        },
        {
          "name": "--color-states-primary-pressed",
          "value": "--alpha(var(--color-slate-500) / 16%)"
        },
        {
          "name": "--color-states-primary-active",
          "value": "--alpha(var(--color-slate-500) / 10%)"
        },
        {
          "name": "--color-states-primary-alt-default-alt",
          "value": "--alpha(var(--color-white) / 6%)"
        },
        {
          "name": "--color-states-primary-alt-hover",
          "value": "--alpha(var(--color-white) / 8%)"
        },
        {
          "name": "--color-states-primary-alt-pressed",
          "value": "--alpha(var(--color-white) / 16%)"
        },
        {
          "name": "--color-states-primary-alt-active",
          "value": "--alpha(var(--color-white) / 12%)"
        },
        {
          "name": "--color-states-brand-default-alt",
          "value": "--alpha(var(--color-w-orange-500) / 6%)"
        },
        {
          "name": "--color-states-brand-hover",
          "value": "--alpha(var(--color-w-orange-500) / 8%)"
        },
        {
          "name": "--color-states-brand-pressed",
          "value": "--alpha(var(--color-w-orange-500) / 16%)"
        },
        {
          "name": "--color-states-brand-active",
          "value": "--alpha(var(--color-w-orange-500) / 12%)"
        },
        {
          "name": "--color-states-danger-default-alt",
          "value": "--alpha(var(--color-red-500) / 6%)"
        },
        {
          "name": "--color-states-danger-hover",
          "value": "--alpha(var(--color-red-500) / 8%)"
        },
        {
          "name": "--color-states-danger-pressed",
          "value": "--alpha(var(--color-red-500) / 16%)"
        },
        {
          "name": "--color-states-danger-active",
          "value": "--alpha(var(--color-red-500) / 12%)"
        },
        {
          "name": "--color-states-warning-default-alt",
          "value": "--alpha(var(--color-amber-500) / 6%)"
        },
        {
          "name": "--color-states-warning-hover",
          "value": "--alpha(var(--color-amber-500) / 8%)"
        },
        {
          "name": "--color-states-warning-pressed",
          "value": "--alpha(var(--color-amber-500) / 16%)"
        },
        {
          "name": "--color-states-warning-active",
          "value": "--alpha(var(--color-amber-500) / 12%)"
        },
        {
          "name": "--color-states-success-default-alt",
          "value": "--alpha(var(--color-green-500) / 6%)"
        },
        {
          "name": "--color-states-success-hover",
          "value": "--alpha(var(--color-green-500) / 8%)"
        },
        {
          "name": "--color-states-success-pressed",
          "value": "--alpha(var(--color-green-500) / 16%)"
        },
        {
          "name": "--color-states-success-active",
          "value": "--alpha(var(--color-green-500) / 12%)"
        },
        {
          "name": "--color-states-info-default-alt",
          "value": "--alpha(var(--color-blue-500) / 6%)"
        },
        {
          "name": "--color-states-info-hover",
          "value": "--alpha(var(--color-blue-500) / 8%)"
        },
        {
          "name": "--color-states-info-pressed",
          "value": "--alpha(var(--color-blue-500) / 16%)"
        },
        {
          "name": "--color-states-info-active",
          "value": "--alpha(var(--color-blue-500) / 12%)"
        },
        {
          "name": "--color-states-ai-default-alt",
          "value": "--alpha(var(--color-purple-500) / 6%)"
        },
        {
          "name": "--color-states-ai-hover",
          "value": "--alpha(var(--color-purple-500) / 8%)"
        },
        {
          "name": "--color-states-ai-pressed",
          "value": "--alpha(var(--color-purple-500) / 16%)"
        },
        {
          "name": "--color-states-ai-active",
          "value": "--alpha(var(--color-purple-500) / 12%)"
        },
        {
          "name": "--color-component-outline-button-bg",
          "value": "var(--color-white)"
        },
        {
          "name": "--color-component-input-bg",
          "value": "var(--color-white)"
        },
        {
          "name": "--color-component-switcher-bg",
          "value": "var(--color-slate-200)"
        },
        {
          "name": "--color-component-border-hotkey",
          "value": "var(--color-slate-200)"
        },
        {
          "name": "--color-component-border-input-hover",
          "value": "var(--color-slate-400)"
        },
        {
          "name": "--color-component-overlay",
          "value": "--alpha(var(--color-slate-600) / 60%)"
        },
        {
          "name": "--color-component-tooltip-bg",
          "value": "--alpha(var(--color-slate-950) / 80%)"
        },
        {
          "name": "--color-component-logo-ic",
          "value": "var(--color-w-orange-600)"
        },
        {
          "name": "--color-component-logo-wordmark",
          "value": "var(--color-slate-950)"
        },
        {
          "name": "--color-component-logo-wordmark-alt",
          "value": "var(--color-white)"
        },
        {
          "name": "--color-component-kbi-tooltip-bg",
          "value": "--alpha(var(--color-white) / 20%)"
        },
        {
          "name": "--color-component-dialog-overlay",
          "value": "--alpha(var(--color-white) / 60%)"
        },
        {
          "name": "--color-component-avatar-overlay",
          "value": "--alpha(var(--color-white) / 80%)"
        },
        {
          "name": "--color-component-code-snippet-bg",
          "value": "--alpha(var(--color-slate-500) / 6%)"
        },
        {
          "name": "--color-component-toast-bg",
          "value": "var(--color-slate-800)"
        },
        {
          "name": "--color-component-toast-ic-destructive",
          "value": "var(--color-red-400)"
        },
        {
          "name": "--color-component-toast-ic-warning",
          "value": "var(--color-amber-400)"
        },
        {
          "name": "--color-component-toast-ic-success",
          "value": "var(--color-green-400)"
        },
        {
          "name": "--color-component-toast-ic-info",
          "value": "var(--color-blue-400)"
        },
        {
          "name": "--color-component-app-shell-bg",
          "value": "var(--color-slate-100)"
        },
        {
          "name": "--color-component-app-shell-bg-branded",
          "value": "var(--color-w-orange-50)"
        },
        {
          "name": "--color-component-app-shell-ambient-dot",
          "value": "--alpha(var(--color-slate-500) / 28%)"
        },
        {
          "name": "--color-component-empty-state-medallion-bg-from",
          "value": "var(--color-white)"
        },
        {
          "name": "--color-component-empty-state-medallion-bg-to",
          "value": "--alpha(var(--color-slate-100) / 80%)"
        },
        {
          "name": "--color-component-empty-state-medallion-border",
          "value": "--alpha(var(--color-slate-300) / 70%)"
        },
        {
          "name": "--color-syntax-no-syntax",
          "value": "var(--color-slate-900)"
        },
        {
          "name": "--color-syntax-keyword",
          "value": "var(--color-purple-600)"
        },
        {
          "name": "--color-syntax-function",
          "value": "var(--color-blue-600)"
        },
        {
          "name": "--color-syntax-string",
          "value": "var(--color-green-600)"
        },
        {
          "name": "--color-syntax-number-boolean",
          "value": "var(--color-amber-700)"
        },
        {
          "name": "--color-syntax-tag",
          "value": "var(--color-red-600)"
        },
        {
          "name": "--color-syntax-attribute",
          "value": "var(--color-amber-700)"
        },
        {
          "name": "--color-syntax-comment",
          "value": "var(--color-slate-400)"
        },
        {
          "name": "--color-syntax-type",
          "value": "var(--color-yellow-700)"
        },
        {
          "name": "--color-syntax-operator",
          "value": "var(--color-slate-700)"
        },
        {
          "name": "--color-syntax-variable",
          "value": "var(--color-red-600)"
        },
        {
          "name": "--color-syntax-number",
          "value": "var(--color-syntax-number-boolean)"
        },
        {
          "name": "--color-syntax-boolean",
          "value": "var(--color-syntax-keyword)"
        },
        {
          "name": "--color-syntax-constant",
          "value": "var(--color-syntax-keyword)"
        },
        {
          "name": "--color-syntax-builtin",
          "value": "var(--color-syntax-keyword)"
        },
        {
          "name": "--color-syntax-class-name",
          "value": "var(--color-syntax-type)"
        },
        {
          "name": "--color-syntax-property",
          "value": "var(--color-syntax-variable)"
        },
        {
          "name": "--color-syntax-attr-name",
          "value": "var(--color-syntax-attribute)"
        },
        {
          "name": "--color-syntax-attr-value",
          "value": "var(--color-syntax-string)"
        },
        {
          "name": "--color-syntax-regex",
          "value": "var(--color-syntax-string)"
        },
        {
          "name": "--color-syntax-punctuation",
          "value": "var(--color-syntax-operator)"
        },
        {
          "name": "--color-syntax-highlight-neutral-code",
          "value": "var(--color-slate-900)"
        },
        {
          "name": "--color-syntax-highlight-neutral-indicator",
          "value": "var(--color-slate-600)"
        },
        {
          "name": "--color-syntax-highlight-neutral-highlight",
          "value": "--alpha(var(--color-slate-500) / 6%)"
        },
        {
          "name": "--color-syntax-highlight-selected-code",
          "value": "var(--color-white)"
        },
        {
          "name": "--color-syntax-highlight-selected-highlight",
          "value": "var(--color-slate-950)"
        },
        {
          "name": "--color-syntax-highlight-error-code",
          "value": "var(--color-red-600)"
        },
        {
          "name": "--color-syntax-highlight-error-indicator",
          "value": "var(--color-red-600)"
        },
        {
          "name": "--color-syntax-highlight-error-highlight",
          "value": "--alpha(var(--color-red-500) / 6%)"
        },
        {
          "name": "--color-syntax-highlight-warning-code",
          "value": "var(--color-amber-700)"
        },
        {
          "name": "--color-syntax-highlight-warning-indicator",
          "value": "var(--color-amber-600)"
        },
        {
          "name": "--color-syntax-highlight-warning-highlight",
          "value": "--alpha(var(--color-amber-500) / 6%)"
        },
        {
          "name": "--color-syntax-highlight-info-code",
          "value": "var(--color-blue-600)"
        },
        {
          "name": "--color-syntax-highlight-info-indicator",
          "value": "var(--color-blue-600)"
        },
        {
          "name": "--color-syntax-highlight-info-highlight",
          "value": "--alpha(var(--color-blue-500) / 6%)"
        },
        {
          "name": "--color-syntax-highlight-success-code",
          "value": "var(--color-green-600)"
        },
        {
          "name": "--color-syntax-highlight-success-indicator",
          "value": "var(--color-green-600)"
        },
        {
          "name": "--color-syntax-highlight-success-highlight",
          "value": "--alpha(var(--color-green-500) / 6%)"
        },
        {
          "name": "--color-syntax-highlight-brand-code",
          "value": "var(--color-w-orange-600)"
        },
        {
          "name": "--color-syntax-highlight-brand-indicator",
          "value": "var(--color-w-orange-600)"
        },
        {
          "name": "--color-syntax-highlight-brand-highlight",
          "value": "--alpha(var(--color-w-orange-500) / 6%)"
        },
        {
          "name": "--color-syntax-highlight-ai-code",
          "value": "var(--color-purple-600)"
        },
        {
          "name": "--color-syntax-highlight-ai-indicator",
          "value": "var(--color-purple-600)"
        },
        {
          "name": "--color-syntax-highlight-ai-highlight",
          "value": "--alpha(var(--color-purple-500) / 6%)"
        },
        {
          "name": "--color-badge-on-solid",
          "value": "--alpha(var(--color-white) / 95%)"
        },
        {
          "name": "--color-badge-badge-bg",
          "value": "var(--color-white)"
        },
        {
          "name": "--color-badge-label-primary",
          "value": "var(--color-slate-700)"
        },
        {
          "name": "--color-badge-slate-light",
          "value": "var(--color-slate-100)"
        },
        {
          "name": "--color-badge-slate-strong",
          "value": "var(--color-slate-700)"
        },
        {
          "name": "--color-badge-slate-dark",
          "value": "var(--color-slate-700)"
        },
        {
          "name": "--color-badge-slate-dark-alt",
          "value": "var(--color-slate-500)"
        },
        {
          "name": "--color-badge-gray-light",
          "value": "var(--color-gray-100)"
        },
        {
          "name": "--color-badge-gray-strong",
          "value": "var(--color-gray-700)"
        },
        {
          "name": "--color-badge-gray-dark",
          "value": "var(--color-gray-700)"
        },
        {
          "name": "--color-badge-gray-dark-alt",
          "value": "var(--color-gray-500)"
        },
        {
          "name": "--color-badge-zinc-light",
          "value": "var(--color-zinc-100)"
        },
        {
          "name": "--color-badge-zinc-strong",
          "value": "var(--color-zinc-700)"
        },
        {
          "name": "--color-badge-zinc-dark",
          "value": "var(--color-zinc-700)"
        },
        {
          "name": "--color-badge-zinc-dark-alt",
          "value": "var(--color-zinc-500)"
        },
        {
          "name": "--color-badge-neutral-light",
          "value": "var(--color-neutral-100)"
        },
        {
          "name": "--color-badge-neutral-strong",
          "value": "var(--color-neutral-700)"
        },
        {
          "name": "--color-badge-neutral-dark",
          "value": "var(--color-neutral-700)"
        },
        {
          "name": "--color-badge-neutral-dark-alt",
          "value": "var(--color-neutral-500)"
        },
        {
          "name": "--color-badge-stone-light",
          "value": "var(--color-stone-100)"
        },
        {
          "name": "--color-badge-stone-strong",
          "value": "var(--color-stone-700)"
        },
        {
          "name": "--color-badge-stone-dark",
          "value": "var(--color-stone-700)"
        },
        {
          "name": "--color-badge-stone-dark-alt",
          "value": "var(--color-stone-500)"
        },
        {
          "name": "--color-badge-red-light",
          "value": "var(--color-red-100)"
        },
        {
          "name": "--color-badge-red-strong",
          "value": "var(--color-red-500)"
        },
        {
          "name": "--color-badge-red-dark",
          "value": "var(--color-red-800)"
        },
        {
          "name": "--color-badge-w-orange-light",
          "value": "var(--color-w-orange-100)"
        },
        {
          "name": "--color-badge-w-orange-strong",
          "value": "var(--color-w-orange-500)"
        },
        {
          "name": "--color-badge-w-orange-dark",
          "value": "var(--color-w-orange-800)"
        },
        {
          "name": "--color-badge-amber-light",
          "value": "var(--color-amber-100)"
        },
        {
          "name": "--color-badge-amber-strong",
          "value": "var(--color-amber-500)"
        },
        {
          "name": "--color-badge-amber-dark",
          "value": "var(--color-amber-800)"
        },
        {
          "name": "--color-badge-yellow-light",
          "value": "var(--color-yellow-100)"
        },
        {
          "name": "--color-badge-yellow-strong",
          "value": "var(--color-yellow-500)"
        },
        {
          "name": "--color-badge-yellow-dark",
          "value": "var(--color-yellow-800)"
        },
        {
          "name": "--color-badge-lime-light",
          "value": "var(--color-lime-100)"
        },
        {
          "name": "--color-badge-lime-strong",
          "value": "var(--color-lime-500)"
        },
        {
          "name": "--color-badge-lime-dark",
          "value": "var(--color-lime-800)"
        },
        {
          "name": "--color-badge-green-light",
          "value": "var(--color-green-100)"
        },
        {
          "name": "--color-badge-green-strong",
          "value": "var(--color-green-500)"
        },
        {
          "name": "--color-badge-green-dark",
          "value": "var(--color-green-800)"
        },
        {
          "name": "--color-badge-emerald-light",
          "value": "var(--color-emerald-100)"
        },
        {
          "name": "--color-badge-emerald-strong",
          "value": "var(--color-emerald-500)"
        },
        {
          "name": "--color-badge-emerald-dark",
          "value": "var(--color-emerald-800)"
        },
        {
          "name": "--color-badge-teal-light",
          "value": "var(--color-teal-100)"
        },
        {
          "name": "--color-badge-teal-strong",
          "value": "var(--color-teal-500)"
        },
        {
          "name": "--color-badge-teal-dark",
          "value": "var(--color-teal-800)"
        },
        {
          "name": "--color-badge-cyan-light",
          "value": "var(--color-cyan-100)"
        },
        {
          "name": "--color-badge-cyan-strong",
          "value": "var(--color-cyan-500)"
        },
        {
          "name": "--color-badge-cyan-dark",
          "value": "var(--color-cyan-800)"
        },
        {
          "name": "--color-badge-sky-light",
          "value": "var(--color-sky-100)"
        },
        {
          "name": "--color-badge-sky-strong",
          "value": "var(--color-sky-500)"
        },
        {
          "name": "--color-badge-sky-dark",
          "value": "var(--color-sky-800)"
        },
        {
          "name": "--color-badge-blue-light",
          "value": "var(--color-blue-100)"
        },
        {
          "name": "--color-badge-blue-strong",
          "value": "var(--color-blue-500)"
        },
        {
          "name": "--color-badge-blue-dark",
          "value": "var(--color-blue-800)"
        },
        {
          "name": "--color-badge-indigo-light",
          "value": "var(--color-indigo-100)"
        },
        {
          "name": "--color-badge-indigo-strong",
          "value": "var(--color-indigo-500)"
        },
        {
          "name": "--color-badge-indigo-dark",
          "value": "var(--color-indigo-800)"
        },
        {
          "name": "--color-badge-violet-light",
          "value": "var(--color-violet-100)"
        },
        {
          "name": "--color-badge-violet-strong",
          "value": "var(--color-violet-500)"
        },
        {
          "name": "--color-badge-violet-dark",
          "value": "var(--color-violet-800)"
        },
        {
          "name": "--color-badge-purple-light",
          "value": "var(--color-purple-100)"
        },
        {
          "name": "--color-badge-purple-strong",
          "value": "var(--color-purple-500)"
        },
        {
          "name": "--color-badge-purple-dark",
          "value": "var(--color-purple-800)"
        },
        {
          "name": "--color-badge-fuchsia-light",
          "value": "var(--color-fuchsia-100)"
        },
        {
          "name": "--color-badge-fuchsia-strong",
          "value": "var(--color-fuchsia-500)"
        },
        {
          "name": "--color-badge-fuchsia-dark",
          "value": "var(--color-fuchsia-800)"
        },
        {
          "name": "--color-badge-pink-light",
          "value": "var(--color-pink-100)"
        },
        {
          "name": "--color-badge-pink-strong",
          "value": "var(--color-pink-500)"
        },
        {
          "name": "--color-badge-pink-dark",
          "value": "var(--color-pink-800)"
        },
        {
          "name": "--color-badge-rose-light",
          "value": "var(--color-rose-100)"
        },
        {
          "name": "--color-badge-rose-strong",
          "value": "var(--color-rose-500)"
        },
        {
          "name": "--color-badge-rose-dark",
          "value": "var(--color-rose-800)"
        },
        {
          "name": "--color-data-viz-1",
          "value": "#ffffff"
        },
        {
          "name": "--temp-token",
          "value": "#ffffff"
        }
      ]
    },
    {
      "name": "semantic-dark",
      "description": "Dark mode overrides for semantic tokens",
      "tokens": [
        {
          "name": "--color-text-primary",
          "value": "var(--color-slate-50)"
        },
        {
          "name": "--color-text-primary-alt",
          "value": "var(--color-slate-900)"
        },
        {
          "name": "--color-text-primary-fixed",
          "value": "var(--color-slate-900)"
        },
        {
          "name": "--color-text-primary-alt-fixed",
          "value": "var(--color-white)"
        },
        {
          "name": "--color-text-secondary",
          "value": "--alpha(var(--color-slate-50) / 80%)"
        },
        {
          "name": "--color-text-secondary-alt",
          "value": "var(--color-slate-700)"
        },
        {
          "name": "--color-text-tertiary",
          "value": "--alpha(var(--color-slate-50) / 40%)"
        },
        {
          "name": "--color-text-tertiary-alt",
          "value": "var(--color-slate-600)"
        },
        {
          "name": "--color-text-hint",
          "value": "--alpha(var(--color-slate-50) / 40%)"
        },
        {
          "name": "--color-text-brand",
          "value": "var(--color-w-orange-300)"
        },
        {
          "name": "--color-text-danger",
          "value": "var(--color-red-300)"
        },
        {
          "name": "--color-text-warning",
          "value": "var(--color-amber-300)"
        },
        {
          "name": "--color-text-success",
          "value": "var(--color-green-300)"
        },
        {
          "name": "--color-text-info",
          "value": "var(--color-blue-300)"
        },
        {
          "name": "--color-text-ai",
          "value": "var(--color-purple-300)"
        },
        {
          "name": "--color-text-disable-primary",
          "value": "--alpha(var(--color-slate-50) / 40%)"
        },
        {
          "name": "--color-text-disable-primary-alt",
          "value": "--alpha(var(--color-slate-900) / 40%)"
        },
        {
          "name": "--color-text-disable-brand",
          "value": "--alpha(var(--color-w-orange-300) / 60%)"
        },
        {
          "name": "--color-text-disable-danger",
          "value": "--alpha(var(--color-red-300) / 60%)"
        },
        {
          "name": "--color-text-disable-warning",
          "value": "--alpha(var(--color-amber-300) / 60%)"
        },
        {
          "name": "--color-text-disable-succes",
          "value": "--alpha(var(--color-green-300) / 60%)"
        },
        {
          "name": "--color-text-disable-info",
          "value": "--alpha(var(--color-blue-300) / 60%)"
        },
        {
          "name": "--color-text-disable-ai",
          "value": "--alpha(var(--color-purple-300) / 60%)"
        },
        {
          "name": "--color-text-link-default",
          "value": "var(--color-blue-300)"
        },
        {
          "name": "--color-text-link-hover",
          "value": "var(--color-blue-200)"
        },
        {
          "name": "--color-text-link-default-alt",
          "value": "var(--color-blue-600)"
        },
        {
          "name": "--color-text-link-hover-alt",
          "value": "var(--color-blue-800)"
        },
        {
          "name": "--color-icon-primary",
          "value": "var(--color-slate-50)"
        },
        {
          "name": "--color-icon-primary-alt",
          "value": "var(--color-slate-900)"
        },
        {
          "name": "--color-icon-primary-alt-fixed",
          "value": "var(--color-white)"
        },
        {
          "name": "--color-icon-primary-disable",
          "value": "--alpha(var(--color-slate-50) / 40%)"
        },
        {
          "name": "--color-icon-primary-alt-disable",
          "value": "--alpha(var(--color-slate-900) / 40%)"
        },
        {
          "name": "--color-icon-secondary",
          "value": "--alpha(var(--color-slate-50) / 80%)"
        },
        {
          "name": "--color-icon-secondary-alt",
          "value": "var(--color-slate-500)"
        },
        {
          "name": "--color-icon-brand",
          "value": "var(--color-w-orange-300)"
        },
        {
          "name": "--color-icon-danger",
          "value": "var(--color-red-300)"
        },
        {
          "name": "--color-icon-warning",
          "value": "var(--color-amber-300)"
        },
        {
          "name": "--color-icon-success",
          "value": "var(--color-green-300)"
        },
        {
          "name": "--color-icon-info",
          "value": "var(--color-blue-300)"
        },
        {
          "name": "--color-icon-ai",
          "value": "var(--color-purple-300)"
        },
        {
          "name": "--color-bg-page-bg",
          "value": "var(--color-slate-950)"
        },
        {
          "name": "--color-bg-surface-1",
          "value": "#0d1123"
        },
        {
          "name": "--color-bg-surface-2",
          "value": "#141829"
        },
        {
          "name": "--color-bg-surface-3",
          "value": "#1b1f30"
        },
        {
          "name": "--color-bg-surface-4",
          "value": "#1f2334"
        },
        {
          "name": "--color-bg-surface-5",
          "value": "#262a3b"
        },
        {
          "name": "--color-bg-primary",
          "value": "#262a3b"
        },
        {
          "name": "--color-bg-light-primary",
          "value": "#1b1f30"
        },
        {
          "name": "--color-bg-strong-primary",
          "value": "#333848"
        },
        {
          "name": "--color-bg-brand",
          "value": "#25131c"
        },
        {
          "name": "--color-bg-light-brand",
          "value": "#160e1a"
        },
        {
          "name": "--color-bg-strong-brand",
          "value": "#3a1b1e"
        },
        {
          "name": "--color-bg-danger",
          "value": "#220516"
        },
        {
          "name": "--color-bg-light-danger",
          "value": "#140617"
        },
        {
          "name": "--color-bg-strong-danger",
          "value": "#340515"
        },
        {
          "name": "--color-bg-warning",
          "value": "#251b15"
        },
        {
          "name": "--color-bg-light-warning",
          "value": "#161216"
        },
        {
          "name": "--color-bg-strong-warning",
          "value": "#392713"
        },
        {
          "name": "--color-bg-success",
          "value": "#022120"
        },
        {
          "name": "--color-bg-light-success",
          "value": "#02161c"
        },
        {
          "name": "--color-bg-strong-success",
          "value": "#023124"
        },
        {
          "name": "--color-bg-info",
          "value": "#081738"
        },
        {
          "name": "--color-bg-light-info",
          "value": "#05102a"
        },
        {
          "name": "--color-bg-strong-info",
          "value": "#0b214b"
        },
        {
          "name": "--color-bg-ai",
          "value": "#1a0f38"
        },
        {
          "name": "--color-bg-light-ai",
          "value": "#100b2a"
        },
        {
          "name": "--color-bg-strong-ai",
          "value": "#28144b"
        },
        {
          "name": "--color-bg-fill-brand",
          "value": "var(--color-w-orange-400)"
        },
        {
          "name": "--color-bg-fill-danger",
          "value": "var(--color-red-400)"
        },
        {
          "name": "--color-bg-fill-warning",
          "value": "var(--color-amber-400)"
        },
        {
          "name": "--color-bg-fill-success",
          "value": "var(--color-green-400)"
        },
        {
          "name": "--color-bg-fill-info",
          "value": "var(--color-blue-400)"
        },
        {
          "name": "--color-bg-fill-ai",
          "value": "var(--color-purple-400)"
        },
        {
          "name": "--color-border-primary",
          "value": "var(--color-slate-600)"
        },
        {
          "name": "--color-border-primary-light",
          "value": "var(--color-slate-700)"
        },
        {
          "name": "--color-border-strong-primary",
          "value": "var(--color-slate-400)"
        },
        {
          "name": "--color-focus-ring-primary",
          "value": "--alpha(var(--color-slate-400) / 30%)"
        },
        {
          "name": "--color-border-brand",
          "value": "var(--color-w-orange-700)"
        },
        {
          "name": "--color-border-strong-brand",
          "value": "var(--color-w-orange-600)"
        },
        {
          "name": "--color-border-danger",
          "value": "var(--color-red-700)"
        },
        {
          "name": "--color-border-strong-danger",
          "value": "var(--color-red-500)"
        },
        {
          "name": "--color-border-warning",
          "value": "var(--color-amber-700)"
        },
        {
          "name": "--color-border-strong-warning",
          "value": "var(--color-amber-600)"
        },
        {
          "name": "--color-border-success",
          "value": "var(--color-green-700)"
        },
        {
          "name": "--color-border-strong-success",
          "value": "var(--color-green-500)"
        },
        {
          "name": "--color-border-info",
          "value": "var(--color-blue-700)"
        },
        {
          "name": "--color-border-strong-info",
          "value": "var(--color-blue-500)"
        },
        {
          "name": "--color-border-ai",
          "value": "var(--color-purple-700)"
        },
        {
          "name": "--color-border-strong-ai",
          "value": "var(--color-purple-500)"
        },
        {
          "name": "--color-states-default-all",
          "value": "--alpha(var(--color-slate-100) / 0%)"
        },
        {
          "name": "--color-states-on-fill-hover",
          "value": "--alpha(var(--color-white) / 10%)"
        },
        {
          "name": "--color-states-on-fill-pressed",
          "value": "--alpha(var(--color-white) / 40%)"
        },
        {
          "name": "--color-states-on-fill-disabled",
          "value": "--alpha(var(--color-white) / 40%)"
        },
        {
          "name": "--color-states-primary-default-alt",
          "value": "--alpha(var(--color-slate-100) / 6%)"
        },
        {
          "name": "--color-states-primary-hover",
          "value": "--alpha(var(--color-slate-100) / 8%)"
        },
        {
          "name": "--color-states-primary-pressed",
          "value": "--alpha(var(--color-slate-100) / 16%)"
        },
        {
          "name": "--color-states-primary-active",
          "value": "--alpha(var(--color-slate-100) / 12%)"
        },
        {
          "name": "--color-states-primary-alt-default-alt",
          "value": "--alpha(var(--color-slate-500) / 6%)"
        },
        {
          "name": "--color-states-primary-alt-hover",
          "value": "--alpha(var(--color-slate-500) / 8%)"
        },
        {
          "name": "--color-states-primary-alt-pressed",
          "value": "--alpha(var(--color-slate-500) / 16%)"
        },
        {
          "name": "--color-states-primary-alt-active",
          "value": "--alpha(var(--color-slate-500) / 12%)"
        },
        {
          "name": "--color-states-brand-default-alt",
          "value": "--alpha(var(--color-w-orange-300) / 6%)"
        },
        {
          "name": "--color-states-brand-hover",
          "value": "--alpha(var(--color-w-orange-300) / 8%)"
        },
        {
          "name": "--color-states-brand-pressed",
          "value": "--alpha(var(--color-w-orange-300) / 16%)"
        },
        {
          "name": "--color-states-brand-active",
          "value": "--alpha(var(--color-w-orange-300) / 12%)"
        },
        {
          "name": "--color-states-danger-default-alt",
          "value": "--alpha(var(--color-red-300) / 6%)"
        },
        {
          "name": "--color-states-danger-hover",
          "value": "--alpha(var(--color-red-300) / 8%)"
        },
        {
          "name": "--color-states-danger-pressed",
          "value": "--alpha(var(--color-red-300) / 16%)"
        },
        {
          "name": "--color-states-danger-active",
          "value": "--alpha(var(--color-red-300) / 12%)"
        },
        {
          "name": "--color-states-warning-default-alt",
          "value": "--alpha(var(--color-amber-300) / 6%)"
        },
        {
          "name": "--color-states-warning-hover",
          "value": "--alpha(var(--color-amber-300) / 8%)"
        },
        {
          "name": "--color-states-warning-pressed",
          "value": "--alpha(var(--color-amber-300) / 16%)"
        },
        {
          "name": "--color-states-warning-active",
          "value": "--alpha(var(--color-amber-300) / 12%)"
        },
        {
          "name": "--color-states-success-default-alt",
          "value": "--alpha(var(--color-green-300) / 6%)"
        },
        {
          "name": "--color-states-success-hover",
          "value": "--alpha(var(--color-green-300) / 8%)"
        },
        {
          "name": "--color-states-success-pressed",
          "value": "--alpha(var(--color-green-300) / 16%)"
        },
        {
          "name": "--color-states-success-active",
          "value": "--alpha(var(--color-green-300) / 12%)"
        },
        {
          "name": "--color-states-info-default-alt",
          "value": "--alpha(var(--color-blue-300) / 6%)"
        },
        {
          "name": "--color-states-info-hover",
          "value": "--alpha(var(--color-blue-300) / 8%)"
        },
        {
          "name": "--color-states-info-pressed",
          "value": "--alpha(var(--color-blue-300) / 16%)"
        },
        {
          "name": "--color-states-info-active",
          "value": "--alpha(var(--color-blue-300) / 12%)"
        },
        {
          "name": "--color-states-ai-default-alt",
          "value": "--alpha(var(--color-purple-300) / 6%)"
        },
        {
          "name": "--color-states-ai-hover",
          "value": "--alpha(var(--color-purple-300) / 8%)"
        },
        {
          "name": "--color-states-ai-pressed",
          "value": "--alpha(var(--color-purple-300) / 16%)"
        },
        {
          "name": "--color-states-ai-active",
          "value": "--alpha(var(--color-purple-300) / 12%)"
        },
        {
          "name": "--color-component-outline-button-bg",
          "value": "--alpha(var(--color-slate-200) / 5%)"
        },
        {
          "name": "--color-component-input-bg",
          "value": "--alpha(var(--color-slate-200) / 5%)"
        },
        {
          "name": "--color-component-switcher-bg",
          "value": "--alpha(var(--color-slate-50) / 30%)"
        },
        {
          "name": "--color-component-border-hotkey",
          "value": "var(--color-slate-700)"
        },
        {
          "name": "--color-component-border-input-hover",
          "value": "var(--color-slate-500)"
        },
        {
          "name": "--color-component-overlay",
          "value": "--alpha(var(--color-slate-950) / 60%)"
        },
        {
          "name": "--color-component-tooltip-bg",
          "value": "--alpha(var(--color-slate-100) / 93%)"
        },
        {
          "name": "--color-component-logo-ic",
          "value": "var(--color-w-orange-600)"
        },
        {
          "name": "--color-component-logo-wordmark",
          "value": "var(--color-white)"
        },
        {
          "name": "--color-component-logo-wordmark-alt",
          "value": "var(--color-slate-950)"
        },
        {
          "name": "--color-component-kbi-tooltip-bg",
          "value": "--alpha(var(--color-slate-950) / 20%)"
        },
        {
          "name": "--color-component-dialog-overlay",
          "value": "--alpha(var(--color-slate-950) / 60%)"
        },
        {
          "name": "--color-component-avatar-overlay",
          "value": "--alpha(var(--color-slate-950) / 80%)"
        },
        {
          "name": "--color-component-code-snippet-bg",
          "value": "--alpha(var(--color-slate-300) / 12%)"
        },
        {
          "name": "--color-component-toast-bg",
          "value": "var(--color-slate-100)"
        },
        {
          "name": "--color-component-toast-ic-destructive",
          "value": "var(--color-red-600)"
        },
        {
          "name": "--color-component-toast-ic-warning",
          "value": "var(--color-amber-600)"
        },
        {
          "name": "--color-component-toast-ic-success",
          "value": "var(--color-green-600)"
        },
        {
          "name": "--color-component-toast-ic-info",
          "value": "var(--color-blue-600)"
        },
        {
          "name": "--color-component-app-shell-bg",
          "value": "var(--color-slate-975)"
        },
        {
          "name": "--color-component-app-shell-bg-branded",
          "value": "#160e1a"
        },
        {
          "name": "--color-component-app-shell-ambient-dot",
          "value": "--alpha(var(--color-slate-50) / 15%)"
        },
        {
          "name": "--color-component-empty-state-medallion-bg-from",
          "value": "--alpha(var(--color-white) / 7%)"
        },
        {
          "name": "--color-component-empty-state-medallion-bg-to",
          "value": "--alpha(var(--color-white) / 2%)"
        },
        {
          "name": "--color-component-empty-state-medallion-border",
          "value": "--alpha(var(--color-white) / 13%)"
        },
        {
          "name": "--color-syntax-no-syntax",
          "value": "var(--color-slate-200)"
        },
        {
          "name": "--color-syntax-keyword",
          "value": "var(--color-purple-400)"
        },
        {
          "name": "--color-syntax-function",
          "value": "var(--color-blue-400)"
        },
        {
          "name": "--color-syntax-string",
          "value": "var(--color-green-300)"
        },
        {
          "name": "--color-syntax-number-boolean",
          "value": "var(--color-amber-300)"
        },
        {
          "name": "--color-syntax-tag",
          "value": "var(--color-red-400)"
        },
        {
          "name": "--color-syntax-attribute",
          "value": "var(--color-amber-300)"
        },
        {
          "name": "--color-syntax-comment",
          "value": "var(--color-slate-500)"
        },
        {
          "name": "--color-syntax-type",
          "value": "var(--color-yellow-300)"
        },
        {
          "name": "--color-syntax-operator",
          "value": "var(--color-slate-300)"
        },
        {
          "name": "--color-syntax-variable",
          "value": "var(--color-red-300)"
        },
        {
          "name": "--color-syntax-number",
          "value": "var(--color-syntax-number-boolean)"
        },
        {
          "name": "--color-syntax-boolean",
          "value": "var(--color-syntax-keyword)"
        },
        {
          "name": "--color-syntax-constant",
          "value": "var(--color-syntax-keyword)"
        },
        {
          "name": "--color-syntax-builtin",
          "value": "var(--color-syntax-keyword)"
        },
        {
          "name": "--color-syntax-class-name",
          "value": "var(--color-syntax-type)"
        },
        {
          "name": "--color-syntax-property",
          "value": "var(--color-syntax-variable)"
        },
        {
          "name": "--color-syntax-attr-name",
          "value": "var(--color-syntax-attribute)"
        },
        {
          "name": "--color-syntax-attr-value",
          "value": "var(--color-syntax-string)"
        },
        {
          "name": "--color-syntax-regex",
          "value": "var(--color-syntax-string)"
        },
        {
          "name": "--color-syntax-punctuation",
          "value": "var(--color-syntax-operator)"
        },
        {
          "name": "--color-syntax-highlight-neutral-code",
          "value": "var(--color-slate-200)"
        },
        {
          "name": "--color-syntax-highlight-neutral-indicator",
          "value": "var(--color-slate-400)"
        },
        {
          "name": "--color-syntax-highlight-neutral-highlight",
          "value": "--alpha(var(--color-slate-400) / 8%)"
        },
        {
          "name": "--color-syntax-highlight-selected-code",
          "value": "var(--color-slate-50)"
        },
        {
          "name": "--color-syntax-highlight-selected-highlight",
          "value": "var(--color-slate-700)"
        },
        {
          "name": "--color-syntax-highlight-error-code",
          "value": "var(--color-red-300)"
        },
        {
          "name": "--color-syntax-highlight-error-indicator",
          "value": "var(--color-red-400)"
        },
        {
          "name": "--color-syntax-highlight-error-highlight",
          "value": "--alpha(var(--color-red-400) / 8%)"
        },
        {
          "name": "--color-syntax-highlight-warning-code",
          "value": "var(--color-amber-300)"
        },
        {
          "name": "--color-syntax-highlight-warning-indicator",
          "value": "var(--color-amber-400)"
        },
        {
          "name": "--color-syntax-highlight-warning-highlight",
          "value": "var(--color-amber-400)"
        },
        {
          "name": "--color-syntax-highlight-info-code",
          "value": "var(--color-blue-300)"
        },
        {
          "name": "--color-syntax-highlight-info-indicator",
          "value": "var(--color-blue-400)"
        },
        {
          "name": "--color-syntax-highlight-info-highlight",
          "value": "--alpha(var(--color-blue-400) / 8%)"
        },
        {
          "name": "--color-syntax-highlight-success-code",
          "value": "var(--color-green-300)"
        },
        {
          "name": "--color-syntax-highlight-success-indicator",
          "value": "var(--color-green-400)"
        },
        {
          "name": "--color-syntax-highlight-success-highlight",
          "value": "--alpha(var(--color-green-400) / 8%)"
        },
        {
          "name": "--color-syntax-highlight-brand-code",
          "value": "var(--color-w-orange-300)"
        },
        {
          "name": "--color-syntax-highlight-brand-indicator",
          "value": "var(--color-w-orange-400)"
        },
        {
          "name": "--color-syntax-highlight-brand-highlight",
          "value": "--alpha(var(--color-w-orange-400) / 8%)"
        },
        {
          "name": "--color-syntax-highlight-ai-code",
          "value": "var(--color-purple-300)"
        },
        {
          "name": "--color-syntax-highlight-ai-indicator",
          "value": "var(--color-purple-400)"
        },
        {
          "name": "--color-syntax-highlight-ai-highlight",
          "value": "--alpha(var(--color-purple-400) / 8%)"
        },
        {
          "name": "--color-badge-on-solid",
          "value": "--alpha(var(--color-white) / 95%)"
        },
        {
          "name": "--color-badge-badge-bg",
          "value": "var(--color-slate-900)"
        },
        {
          "name": "--color-badge-label-primary",
          "value": "var(--color-slate-200)"
        },
        {
          "name": "--color-badge-slate-light",
          "value": "var(--color-slate-800)"
        },
        {
          "name": "--color-badge-slate-strong",
          "value": "var(--color-slate-500)"
        },
        {
          "name": "--color-badge-slate-dark",
          "value": "var(--color-slate-300)"
        },
        {
          "name": "--color-badge-slate-dark-alt",
          "value": "var(--color-slate-400)"
        },
        {
          "name": "--color-badge-gray-light",
          "value": "var(--color-gray-900)"
        },
        {
          "name": "--color-badge-gray-strong",
          "value": "var(--color-gray-500)"
        },
        {
          "name": "--color-badge-gray-dark",
          "value": "var(--color-gray-300)"
        },
        {
          "name": "--color-badge-gray-dark-alt",
          "value": "var(--color-gray-400)"
        },
        {
          "name": "--color-badge-zinc-light",
          "value": "var(--color-zinc-900)"
        },
        {
          "name": "--color-badge-zinc-strong",
          "value": "var(--color-zinc-500)"
        },
        {
          "name": "--color-badge-zinc-dark",
          "value": "var(--color-zinc-300)"
        },
        {
          "name": "--color-badge-zinc-dark-alt",
          "value": "var(--color-zinc-400)"
        },
        {
          "name": "--color-badge-neutral-light",
          "value": "var(--color-neutral-900)"
        },
        {
          "name": "--color-badge-neutral-strong",
          "value": "var(--color-neutral-500)"
        },
        {
          "name": "--color-badge-neutral-dark",
          "value": "var(--color-neutral-300)"
        },
        {
          "name": "--color-badge-neutral-dark-alt",
          "value": "var(--color-neutral-400)"
        },
        {
          "name": "--color-badge-stone-light",
          "value": "var(--color-stone-900)"
        },
        {
          "name": "--color-badge-stone-strong",
          "value": "var(--color-stone-500)"
        },
        {
          "name": "--color-badge-stone-dark",
          "value": "var(--color-stone-300)"
        },
        {
          "name": "--color-badge-stone-dark-alt",
          "value": "var(--color-stone-400)"
        },
        {
          "name": "--color-badge-red-light",
          "value": "var(--color-red-950)"
        },
        {
          "name": "--color-badge-red-strong",
          "value": "var(--color-red-400)"
        },
        {
          "name": "--color-badge-red-dark",
          "value": "var(--color-red-300)"
        },
        {
          "name": "--color-badge-w-orange-light",
          "value": "var(--color-w-orange-950)"
        },
        {
          "name": "--color-badge-w-orange-strong",
          "value": "var(--color-w-orange-400)"
        },
        {
          "name": "--color-badge-w-orange-dark",
          "value": "var(--color-w-orange-300)"
        },
        {
          "name": "--color-badge-amber-light",
          "value": "var(--color-amber-950)"
        },
        {
          "name": "--color-badge-amber-strong",
          "value": "var(--color-amber-400)"
        },
        {
          "name": "--color-badge-amber-dark",
          "value": "var(--color-amber-300)"
        },
        {
          "name": "--color-badge-yellow-light",
          "value": "var(--color-yellow-950)"
        },
        {
          "name": "--color-badge-yellow-strong",
          "value": "var(--color-yellow-400)"
        },
        {
          "name": "--color-badge-yellow-dark",
          "value": "var(--color-yellow-300)"
        },
        {
          "name": "--color-badge-lime-light",
          "value": "var(--color-lime-950)"
        },
        {
          "name": "--color-badge-lime-strong",
          "value": "var(--color-lime-400)"
        },
        {
          "name": "--color-badge-lime-dark",
          "value": "var(--color-lime-300)"
        },
        {
          "name": "--color-badge-green-light",
          "value": "var(--color-green-950)"
        },
        {
          "name": "--color-badge-green-strong",
          "value": "var(--color-green-400)"
        },
        {
          "name": "--color-badge-green-dark",
          "value": "var(--color-green-300)"
        },
        {
          "name": "--color-badge-emerald-light",
          "value": "var(--color-emerald-950)"
        },
        {
          "name": "--color-badge-emerald-strong",
          "value": "var(--color-emerald-400)"
        },
        {
          "name": "--color-badge-emerald-dark",
          "value": "var(--color-emerald-300)"
        },
        {
          "name": "--color-badge-teal-light",
          "value": "var(--color-teal-950)"
        },
        {
          "name": "--color-badge-teal-strong",
          "value": "var(--color-teal-400)"
        },
        {
          "name": "--color-badge-teal-dark",
          "value": "var(--color-teal-300)"
        },
        {
          "name": "--color-badge-cyan-light",
          "value": "var(--color-cyan-950)"
        },
        {
          "name": "--color-badge-cyan-strong",
          "value": "var(--color-cyan-400)"
        },
        {
          "name": "--color-badge-cyan-dark",
          "value": "var(--color-cyan-300)"
        },
        {
          "name": "--color-badge-sky-light",
          "value": "var(--color-sky-950)"
        },
        {
          "name": "--color-badge-sky-strong",
          "value": "var(--color-sky-400)"
        },
        {
          "name": "--color-badge-sky-dark",
          "value": "var(--color-sky-300)"
        },
        {
          "name": "--color-badge-blue-light",
          "value": "var(--color-blue-950)"
        },
        {
          "name": "--color-badge-blue-strong",
          "value": "var(--color-blue-400)"
        },
        {
          "name": "--color-badge-blue-dark",
          "value": "var(--color-blue-300)"
        },
        {
          "name": "--color-badge-indigo-light",
          "value": "var(--color-indigo-950)"
        },
        {
          "name": "--color-badge-indigo-strong",
          "value": "var(--color-indigo-400)"
        },
        {
          "name": "--color-badge-indigo-dark",
          "value": "var(--color-indigo-300)"
        },
        {
          "name": "--color-badge-violet-light",
          "value": "var(--color-violet-950)"
        },
        {
          "name": "--color-badge-violet-strong",
          "value": "var(--color-violet-400)"
        },
        {
          "name": "--color-badge-violet-dark",
          "value": "var(--color-violet-300)"
        },
        {
          "name": "--color-badge-purple-light",
          "value": "var(--color-purple-950)"
        },
        {
          "name": "--color-badge-purple-strong",
          "value": "var(--color-purple-400)"
        },
        {
          "name": "--color-badge-purple-dark",
          "value": "var(--color-purple-300)"
        },
        {
          "name": "--color-badge-fuchsia-light",
          "value": "var(--color-fuchsia-950)"
        },
        {
          "name": "--color-badge-fuchsia-strong",
          "value": "var(--color-fuchsia-400)"
        },
        {
          "name": "--color-badge-fuchsia-dark",
          "value": "var(--color-fuchsia-300)"
        },
        {
          "name": "--color-badge-pink-light",
          "value": "var(--color-pink-950)"
        },
        {
          "name": "--color-badge-pink-strong",
          "value": "var(--color-pink-400)"
        },
        {
          "name": "--color-badge-pink-dark",
          "value": "var(--color-pink-300)"
        },
        {
          "name": "--color-badge-rose-light",
          "value": "var(--color-rose-900)"
        },
        {
          "name": "--color-badge-rose-strong",
          "value": "var(--color-rose-400)"
        },
        {
          "name": "--color-badge-rose-dark",
          "value": "var(--color-rose-300)"
        },
        {
          "name": "--color-data-viz-1",
          "value": "#ffffff"
        },
        {
          "name": "--temp-token",
          "value": "#ffffff"
        }
      ]
    }
  ]
}