schema: ai-cjm-component-contract/v1 id: case-card version: 2.0.0 status: stable owner: AI CJM Design purpose: Представляет один проверенный клиентский кейс до перехода в полную историю. use_when: - Кейс участвует в каталоге, подборке или related-блоке. evidence: - id: production-style url: https://aicjm.ru/edu/cases/case-card.css?v=20260811-case-canon locator: .case-card, .case-card__top, .case-card__body, .case-card__bottom supports: - anatomy - variant:default - size:default - state:default - id: production-dom url: https://aicjm.ru/edu/cases/ locator: .case-grid .case-card supports: - approved-example - content anatomy: - id: client required: true role: Логотип или текстовое имя клиента. - id: format required: true role: Тип работы или программы. - id: title required: true role: Короткий результатный заголовок. - id: summary required: true role: Задача и сделанное. - id: metric required: false role: Проверенная метрика с единицей. - id: link required: true role: Один переход к полной истории. variants: - id: default status: stable description: Каноническая композиция v2. evidence_refs: - production-style sizes: - id: default status: stable description: Размер следует токенам и содержимому без локальных чисел. evidence_refs: - production-style states: default: status: stable basis: observed description: case-card default is observed at the exact production locator. evidence_refs: - production-style hover: status: not-applicable basis: not-applicable description: hover is not owned by case-card. focus-visible: status: not-applicable basis: not-applicable description: focus-visible is not owned by case-card. active: status: not-applicable basis: not-applicable description: active is not owned by case-card. selected: status: not-applicable basis: not-applicable description: selected is not owned by case-card. open: status: not-applicable basis: not-applicable description: open is not owned by case-card. disabled: status: not-applicable basis: not-applicable description: disabled is not owned by case-card. loading: status: not-applicable basis: not-applicable description: loading is not owned by case-card. success: status: not-applicable basis: not-applicable description: success is not owned by case-card. error: status: not-applicable basis: not-applicable description: error is not owned by case-card. empty: status: not-applicable basis: not-applicable description: empty is not owned by case-card. responsive: mode: case-grid-cell-to-stacked-card reading_order: 'case-card: DOM order remains authoritative at every viewport.' rules: - Preserve case-card anatomy and primary action in one reading sequence. - Wrap text without horizontal page overflow and preserve evidence labels. accessibility: pattern: linked-case-article semantics: - Expose case-card as the nearest correct native landmark, article or control. keyboard: - Tab reaches real actions in DOM order; Enter or Space follows the native control contract. focus: - Interactive descendants use focus.ring and preserve a visible label. motion: - Reduced motion removes nonessential transitions without hiding state or evidence. tokens: - component.card.background - component.card.text - component.card.border - component.card.padding-desktop - action.primary - focus.ring content: required: - Логотип или текстовое имя клиента. - Тип работы или программы. - Короткий результатный заголовок. - Задача и сделанное. - Один переход к полной истории. constraints: - Показывать задачу и доказанный результат до перехода. - Каждый факт и asset сохраняет provenance. do: - Показывать задачу и доказанный результат до перехода. dont: - Не использовать метрику без источника. examples: approved: status: stable description: Live case-card at the scoped production locator. evidence: https://aicjm.ru/edu/cases/ prohibited: description: Не использовать метрику без источника. acceptance: - id: case-card-1 criterion: Все обязательные anatomy parts присутствуют в DOM и видимы. method: automated-and-manual - id: case-card-2 criterion: На mobile сохраняются reading order, target size и отсутствие overflow. method: browser