{
  "name": "InfoRow",
  "type": "component",
  "description": "A stacked label/value pair for information panels: a quiet 12/18 upper line over a 14/20 value.",
  "export": "@gtmi/strix-react/atoms/info-row",
  "path": "@gtmi/strix-react/atoms/info-row",
  "props": [
    {
      "name": "label",
      "type": "ReactNode",
      "required": true,
      "description": "The quiet upper line."
    },
    {
      "name": "value",
      "type": "ReactNode",
      "description": "The value. Omit it entirely for the label-only variant, which renders no second element. Pass null to render emptyValue instead. 0 and '' are real values and render as themselves."
    },
    {
      "name": "emptyValue",
      "type": "string",
      "default": "—",
      "description": "Shown when value is present but null."
    },
    {
      "name": "className",
      "type": "string",
      "description": "Merged through cn(), so a caller's utility wins."
    }
  ],
  "ai_tags": ["information", "label-value", "panel", "detail-row", "cintel"],
  "tokens_used": [
    "--color-text-tertiary",
    "--color-text-primary",
    "--spacing-gap-100",
    "--text-size-body-xsmall",
    "--text-size-body-small"
  ],
  "figma": {
    "file": "85sD2HI8wksP9Y7uDmJ9DK",
    "fileName": "Multi product demo",
    "node": "834:6978",
    "component": "Section Information",
    "note": "The Multi product demo file is the design authority for GTM-990. The components library holds this component only as a remote reference (remote: true), so its node is absent from that file's document and cannot be captured there. A separate, similarly-named local set `.section-information` (22:5665) exists in the components library and is a DIFFERENT component."
  },
  "notes": "Two colour substitutions, both measured rather than assumed, because the Figma file is authored dark-only and its palette is unverified in light. (1) The label: Figma's `color/gray/gray-300` #9aa0b4 measures 2.61:1 on the light surface, below WCAG 1.4.3's 4.5:1 for small text; `--color-text-tertiary` is 4.78:1 light / 8.17:1 dark, and 8.17 is the same ballpark as Figma's own 6.85:1 against its dark page, so the quiet intent survives. (2) The value: Figma's `color/brand/white` is 1.00:1 on a white page; `--color-text-primary` inverts per theme at 19.37:1 / 17.85:1.\n\nKnown limitation, pinned by a characterisation test rather than left to be discovered: on `--color-surface-neutral-soft` the label ink measures 4.50:1 in light and is fractionally BELOW the floor. The Figma panels declare no root fill and inherit `--color-surface-base`, which is the surface the guarantee is stated against; a panel that fills with soft neutral needs `--color-text-secondary` (7.17:1) for this label instead.\n\nRenders through Typography (`body-xs` / `body-s`) rather than hand-writing the four role utilities, matching MetricList. That keeps the role table in one place and keeps `text-size-*` out of this component's cva, where it would otherwise have to be filtered before the contrast assertion could mean anything.\n\nNOT MetricList, which is the nearest existing component and the wrong shape: it lays label and value out horizontally with a responsively flipping divider and an uppercase eyebrow per group, for reporting measurements. This is a vertical pair inside an information panel. Sharing one component would need a prop that switches axis, divider, typography and grouping at once.\n\nAn omitted `value` and `value={null}` are deliberately different: 'this row has no second line' versus 'we do not know this yet'. Collapsing them either breaks the 42px row rhythm or hides a real gap in the data. The implementation uses `??` and not `||` so that 0 and '' survive."
}
