schema: ai-cjm-component-contract/v1 id: result-status version: 2.0.0 status: stable owner: AI CJM Design purpose: Сообщает результат фильтрации, загрузки или пользовательского действия без потери контекста. use_when: - Интерфейс меняет список, отправляет форму или загружает данные. evidence: - id: production-style url: https://aicjm.ru/edu/teachers/teachers.css?v=20260812-unified-person-cards locator: .filter-status, .filter-status strong supports: - anatomy - variant:default - size:default - state:default - id: production-dom url: https://aicjm.ru/edu/teachers/ locator: .teacher-filter-controls .filter-status[role='status'] supports: - approved-example - content anatomy: - id: message required: true role: Короткий итог операции. - id: count required: false role: Количество результатов. - id: recovery required: false 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: result-status 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 result-status. focus-visible: status: not-applicable basis: not-applicable description: focus-visible is not owned by result-status. active: status: not-applicable basis: not-applicable description: active is not owned by result-status. selected: status: not-applicable basis: not-applicable description: selected is not owned by result-status. open: status: not-applicable basis: not-applicable description: open is not owned by result-status. disabled: status: not-applicable basis: not-applicable description: disabled is not owned by result-status. loading: status: not-applicable basis: not-applicable description: loading is not owned by result-status. success: status: not-applicable basis: not-applicable description: success is not owned by result-status. error: status: not-applicable basis: not-applicable description: error is not owned by result-status. empty: status: not-applicable basis: not-applicable description: empty is not owned by result-status. responsive: mode: status-inline-to-wrapped-announcement reading_order: 'result-status: DOM order remains authoritative at every viewport.' rules: - Preserve result-status anatomy and primary action in one reading sequence. - Wrap text without horizontal page overflow and preserve evidence labels. accessibility: pattern: polite-live-result-status semantics: - Expose result-status 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: - text.secondary - text.primary - type.size.body-small - motion.duration.feedback content: required: - Короткий итог операции. constraints: - Обновлять текст и live-region одновременно. - Каждый факт и asset сохраняет provenance. do: - Обновлять текст и live-region одновременно. dont: - Не полагаться только на цвет. examples: approved: status: stable description: Live result-status at the scoped production locator. evidence: https://aicjm.ru/edu/teachers/ prohibited: description: Не полагаться только на цвет. acceptance: - id: result-status-1 criterion: Все обязательные anatomy parts присутствуют в DOM и видимы. method: automated-and-manual - id: result-status-2 criterion: На mobile сохраняются reading order, target size и отсутствие overflow. method: browser