{
  "$schema": "https://www.digitaltableteur.com/schemas/contract-spec/1.0/contract.schema.json",
  "specVersion": "1.0",
  "name": "Accordion",
  "status": "beta",
  "description": "Coordinated disclosure group: single or multiple open sections, animated reveal, keyboard-operable triggers.",
  "package": {
    "name": "@digitaltableteur/react",
    "import": "import { Accordion } from \"@digitaltableteur/react\";"
  },
  "props": {
    "items": {
      "type": "AccordionItem[]",
      "optional": false,
      "description": "Accordion sections (id, title, content, optional disabled)."
    },
    "type": {
      "type": "union",
      "values": [
        "single",
        "multiple"
      ],
      "optional": true,
      "description": "\"single\" (default) keeps at most one section open — opening another closes\nthe previous. \"multiple\" lets any number stay open for side-by-side reading."
    },
    "variant": {
      "type": "union",
      "values": [
        "contained",
        "enclosed",
        "divided"
      ],
      "optional": true,
      "description": "\"contained\" (default) is a bordered card group with dividers between rows;\n\"enclosed\" is the same outer border but seamless inside (no dividers);\n\"divided\" is flush with hairline separators only, for inline disclosure."
    },
    "defaultOpenId": {
      "type": "string",
      "optional": true,
      "description": "Initially open id (uncontrolled, single)."
    },
    "defaultOpenIds": {
      "type": "string[]",
      "optional": true,
      "description": "Initially open ids (uncontrolled); wins over defaultOpenId when set."
    },
    "openIds": {
      "type": "string[]",
      "optional": true,
      "description": "Controlled open ids. When set, the parent owns open state."
    },
    "onOpenChange": {
      "type": "(openIds: string[]) => void",
      "optional": true,
      "description": "Called with the full set of open ids whenever it changes."
    },
    "headingLevel": {
      "type": "2 | 3 | 4 | 5 | 6",
      "optional": true,
      "description": "Wraps each trigger in a heading of this level, so the section titles\njoin the page outline (screen reader users list and jump by headings).\nPick the level below the heading that introduces the accordion. Unset,\ntriggers are plain buttons."
    },
    "className": {
      "type": "string",
      "optional": true,
      "description": "Optional utility classes on the container."
    }
  },
  "accessibility": {
    "criteria": [
      {
        "id": "axe-no-violations",
        "statement": "Required stories produce no axe violations at the configured severity.",
        "verification": "automated",
        "wcag": [
          "2.5.8"
        ],
        "check": "npm run test:stories:matrix:ci",
        "evidence": [
          {
            "artifact": "../../../nextjs-app/shared/components/Accordion/__a11y-evidence__/layout-accordion-playground.dark.json",
            "sourceCommit": "ffbeeeec52e120b19494e2ac7b4dbab8ff13ceb3",
            "capturedAt": "2026-11-07T09:27:48.948Z",
            "passed": true,
            "runner": "local-audit-fixes"
          },
          {
            "artifact": "../../../nextjs-app/shared/components/Accordion/__a11y-evidence__/layout-accordion-playground.json",
            "sourceCommit": "ffbeeeec52e120b19494e2ac7b4dbab8ff13ceb3",
            "capturedAt": "2026-11-07T09:11:40.900Z",
            "passed": true,
            "runner": "local-audit-fixes"
          },
          {
            "artifact": "../../../nextjs-app/shared/components/Accordion/__a11y-evidence__/layout-accordion-playground.light.json",
            "sourceCommit": "ffbeeeec52e120b19494e2ac7b4dbab8ff13ceb3",
            "capturedAt": "2026-11-07T09:21:08.756Z",
            "passed": true,
            "runner": "local-audit-fixes"
          }
        ]
      },
      {
        "id": "accessibility-tree",
        "statement": "The accessibility tree (role, name, state) matches the committed snapshot for every required story.",
        "verification": "automated",
        "wcag": [
          "1.3.1",
          "4.1.2"
        ],
        "check": "npm run test:stories:matrix:ci",
        "evidence": [
          {
            "artifact": "../../../nextjs-app/shared/components/Accordion/__a11y-evidence__/layout-accordion-default.dark.json",
            "sourceCommit": "ffbeeeec52e120b19494e2ac7b4dbab8ff13ceb3",
            "capturedAt": "2026-11-07T09:27:48.493Z",
            "passed": true,
            "runner": "local-audit-fixes"
          },
          {
            "artifact": "../../../nextjs-app/shared/components/Accordion/__a11y-evidence__/layout-accordion-default.forced-colors.json",
            "sourceCommit": "ffbeeeec52e120b19494e2ac7b4dbab8ff13ceb3",
            "capturedAt": "2026-11-07T09:34:00.972Z",
            "passed": true,
            "runner": "local-audit-fixes"
          },
          {
            "artifact": "../../../nextjs-app/shared/components/Accordion/__a11y-evidence__/layout-accordion-default.json",
            "sourceCommit": "ffbeeeec52e120b19494e2ac7b4dbab8ff13ceb3",
            "capturedAt": "2026-11-07T09:11:40.400Z",
            "passed": true,
            "runner": "local-audit-fixes"
          },
          {
            "artifact": "../../../nextjs-app/shared/components/Accordion/__a11y-evidence__/layout-accordion-default.light.json",
            "sourceCommit": "ffbeeeec52e120b19494e2ac7b4dbab8ff13ceb3",
            "capturedAt": "2026-11-07T09:21:08.262Z",
            "passed": true,
            "runner": "local-audit-fixes"
          },
          {
            "artifact": "../../../nextjs-app/shared/components/Accordion/__a11y-evidence__/layout-accordion-example.dark.json",
            "sourceCommit": "ffbeeeec52e120b19494e2ac7b4dbab8ff13ceb3",
            "capturedAt": "2026-11-07T09:27:48.970Z",
            "passed": true,
            "runner": "local-audit-fixes"
          },
          {
            "artifact": "../../../nextjs-app/shared/components/Accordion/__a11y-evidence__/layout-accordion-example.forced-colors.json",
            "sourceCommit": "ffbeeeec52e120b19494e2ac7b4dbab8ff13ceb3",
            "capturedAt": "2026-11-07T09:34:01.303Z",
            "passed": true,
            "runner": "local-audit-fixes"
          },
          {
            "artifact": "../../../nextjs-app/shared/components/Accordion/__a11y-evidence__/layout-accordion-example.json",
            "sourceCommit": "ffbeeeec52e120b19494e2ac7b4dbab8ff13ceb3",
            "capturedAt": "2026-11-07T09:11:40.932Z",
            "passed": true,
            "runner": "local-audit-fixes"
          },
          {
            "artifact": "../../../nextjs-app/shared/components/Accordion/__a11y-evidence__/layout-accordion-example.light.json",
            "sourceCommit": "ffbeeeec52e120b19494e2ac7b4dbab8ff13ceb3",
            "capturedAt": "2026-11-07T09:21:08.782Z",
            "passed": true,
            "runner": "local-audit-fixes"
          },
          {
            "artifact": "../../../nextjs-app/shared/components/Accordion/__a11y-evidence__/layout-accordion-forced-colors.dark.json",
            "sourceCommit": "ffbeeeec52e120b19494e2ac7b4dbab8ff13ceb3",
            "capturedAt": "2026-11-07T09:27:48.989Z",
            "passed": true,
            "runner": "local-audit-fixes"
          },
          {
            "artifact": "../../../nextjs-app/shared/components/Accordion/__a11y-evidence__/layout-accordion-forced-colors.forced-colors.json",
            "sourceCommit": "ffbeeeec52e120b19494e2ac7b4dbab8ff13ceb3",
            "capturedAt": "2026-11-07T09:34:01.324Z",
            "passed": true,
            "runner": "local-audit-fixes"
          },
          {
            "artifact": "../../../nextjs-app/shared/components/Accordion/__a11y-evidence__/layout-accordion-forced-colors.json",
            "sourceCommit": "ffbeeeec52e120b19494e2ac7b4dbab8ff13ceb3",
            "capturedAt": "2026-11-07T09:11:40.952Z",
            "passed": true,
            "runner": "local-audit-fixes"
          },
          {
            "artifact": "../../../nextjs-app/shared/components/Accordion/__a11y-evidence__/layout-accordion-forced-colors.light.json",
            "sourceCommit": "ffbeeeec52e120b19494e2ac7b4dbab8ff13ceb3",
            "capturedAt": "2026-11-07T09:21:08.802Z",
            "passed": true,
            "runner": "local-audit-fixes"
          },
          {
            "artifact": "../../../nextjs-app/shared/components/Accordion/__a11y-evidence__/layout-accordion-playground.dark.json",
            "sourceCommit": "ffbeeeec52e120b19494e2ac7b4dbab8ff13ceb3",
            "capturedAt": "2026-11-07T09:27:48.948Z",
            "passed": true,
            "runner": "local-audit-fixes"
          },
          {
            "artifact": "../../../nextjs-app/shared/components/Accordion/__a11y-evidence__/layout-accordion-playground.forced-colors.json",
            "sourceCommit": "ffbeeeec52e120b19494e2ac7b4dbab8ff13ceb3",
            "capturedAt": "2026-11-07T09:34:01.281Z",
            "passed": true,
            "runner": "local-audit-fixes"
          },
          {
            "artifact": "../../../nextjs-app/shared/components/Accordion/__a11y-evidence__/layout-accordion-playground.json",
            "sourceCommit": "ffbeeeec52e120b19494e2ac7b4dbab8ff13ceb3",
            "capturedAt": "2026-11-07T09:11:40.900Z",
            "passed": true,
            "runner": "local-audit-fixes"
          },
          {
            "artifact": "../../../nextjs-app/shared/components/Accordion/__a11y-evidence__/layout-accordion-playground.light.json",
            "sourceCommit": "ffbeeeec52e120b19494e2ac7b4dbab8ff13ceb3",
            "capturedAt": "2026-11-07T09:21:08.756Z",
            "passed": true,
            "runner": "local-audit-fixes"
          }
        ]
      },
      {
        "id": "forced-colors-real-browser",
        "statement": "The component remains legible and operable under a real browser forced-colors: active pass.",
        "verification": "automated",
        "check": "npm run test:stories:hc",
        "evidence": [
          {
            "artifact": "../../../nextjs-app/shared/components/Accordion/__a11y-evidence__/layout-accordion-playground.forced-colors.json",
            "sourceCommit": "ffbeeeec52e120b19494e2ac7b4dbab8ff13ceb3",
            "capturedAt": "2026-11-07T09:34:01.281Z",
            "passed": true,
            "runner": "local-audit-fixes"
          }
        ]
      },
      {
        "id": "keyboard-contract",
        "statement": "Every documented keyboard interaction works as specified.",
        "verification": "unverified",
        "wcag": [
          "2.1.1",
          "2.1.2"
        ],
        "note": "No exportable evidence record for this check; re-run the check to capture one."
      },
      {
        "id": "aria-requirements",
        "statement": "Documented ARIA roles, states, and properties are present on the rendered output.",
        "verification": "unverified",
        "wcag": [
          "4.1.2"
        ],
        "note": "No exportable evidence record for this check; re-run the check to capture one."
      },
      {
        "id": "human-a11y-review",
        "statement": "A human completed an end-to-end accessibility review of this component.",
        "verification": "manual",
        "note": "2026-05-26 — production behavior verified in Storybook; argTypes and required stories aligned with validate:components.",
        "reviewedAt": "2026-05-26"
      }
    ]
  },
  "source": [
    "../../../nextjs-app/shared/components/Accordion/Accordion.module.css",
    "../../../nextjs-app/shared/components/Accordion/Accordion.tsx"
  ]
}
