schema: ai-cjm-component-contract/v1 id: people version: 1.0.0 status: stable owner: AI CJM Design purpose: Представляет реального эксперта с ролью, компетенцией и переходом к профилю. use_when: - Нужен человек как автор, преподаватель или доказательство. evidence: - id: production-style url: https://aicjm.ru/edu/shared/person-card.css?v=20260812-unified-person-cards locator: .person-card, .person-card__media, .person-card__body, .person-card:hover .person-card__portrait, .person-card:focus-visible supports: - anatomy - variant:catalog-card - variant:profile-lead - variant:avatar-proof - size:default - state:default - state:hover - state:focus-visible - id: production-dom url: https://aicjm.ru/edu/teachers/ locator: .teachers-grid .person-card supports: - approved-example - content - id: production-root-team-dom url: https://aicjm.ru/edu/ locator: .team-grid .person-card supports: - anatomy - content - variant:horizontal-team-card - id: production-root-person-card-foundation url: https://aicjm.ru/edu/shared/person-card.css?v=20260812-horizontal-team-cards locator: .person-card, .person-card__media, .person-card__body, .person-card:hover .person-card__portrait, .person-card:focus-visible supports: - anatomy - state:default - state:hover - state:focus-visible - id: production-root-horizontal-team-card url: https://aicjm.ru/edu/styles.css?v=20260812-horizontal-team-cards locator: >- .team-grid .person-card { display: grid; grid-template-columns: minmax(220px, 42%) minmax(0, 1fr); } .team-grid .person-card__body { min-height: 242px; padding: 24px; } @media (max-width: 620px) { .team-grid .person-card { display: flex; flex-direction: column; } } supports: - variant:horizontal-team-card anatomy: - id: portrait required: true role: Проверенный portrait asset. - id: name required: true role: Имя человека. - id: role required: true role: Роль или компетенция. - id: tags required: false role: Категории навыков. - id: profile-link required: false role: Переход к профилю. variants: - id: catalog-card status: stable description: Карточка в каталоге. evidence_refs: - production-style - id: profile-lead status: stable description: Вводная часть профиля. evidence_refs: - production-style - id: avatar-proof status: stable description: Компактное подтверждение человеком. evidence_refs: - production-style - id: horizontal-team-card status: stable description: "Карточка команды на root `/edu/`: горизонтальная на широком экране и вертикальная на узком." evidence_refs: - production-root-horizontal-team-card sizes: - id: default status: stable description: Размер определяется содержимым и перечисленными semantic/component tokens; raw dimensions запрещены. evidence_refs: - production-style states: default: status: stable basis: observed description: default is observed at the exact production locator in evidence_refs. evidence_refs: - production-style hover: status: stable basis: observed description: hover is observed at the exact production locator in evidence_refs. evidence_refs: - production-style focus-visible: status: stable basis: observed description: focus-visible is observed at the exact production locator in evidence_refs. evidence_refs: - production-style active: status: not-applicable basis: not-applicable description: active is not owned by people. selected: status: not-applicable basis: not-applicable description: selected is not owned by people. open: status: not-applicable basis: not-applicable description: open is not owned by people. disabled: status: not-applicable basis: not-applicable description: disabled is not owned by people. loading: status: not-applicable basis: not-applicable description: Loading belongs to the people catalog pattern, not a person card. success: status: not-applicable basis: not-applicable description: success is not owned by people. error: status: not-applicable basis: not-applicable description: error is not owned by people. empty: status: not-applicable basis: not-applicable description: Empty belongs to the people catalog pattern, not a person card. responsive: mode: catalog-grid-and-horizontal-team-card reading_order: DOM order remains authoritative in every mode. rules: - Keep portrait, name, role and evidence in that order. - Reduce catalog columns progressively and use one column at the narrowest mode. - Preserve the approved portrait crop; never crop name or role text. - At wide widths, team cards keep portrait and body in horizontal columns. - At narrow widths, team cards stack portrait above body. accessibility: pattern: person-evidence-card semantics: - Use article or a named link; portrait alt identifies the person only when the adjacent name does not. keyboard: - Tab reaches a linked profile once; Enter opens it. focus: - The outer link owns focus.ring; no nested duplicate profile link. motion: - Portrait scale/entrance motion is removed under reduced motion. tokens: - component.card.background - component.card.text - component.card.border - component.card.radius - text.secondary - action.primary - type.size.heading-small - focus.ring content: required: - Настоящее имя. - Проверенная роль. - Portrait provenance. constraints: - Crop хранится в asset metadata. - Не придумывать регалии. do: - Сохранять focal point портрета. dont: - Не применять единый crop ко всем людям. examples: approved: status: stable description: Компонент people в указанном scoped production locator. evidence: https://aicjm.ru/edu/teachers/ prohibited: description: Не применять единый crop ко всем людям. acceptance: - id: people-1 criterion: Имя доступно как текст. method: manual - id: people-2 criterion: Alt не повторяет соседнее имя без пользы. method: manual