schema: ai-cjm-component-contract/v1 id: lead-form version: 1.0.0 status: stable owner: AI CJM Design purpose: Собирает минимальные данные для следующего коммерческого или учебного шага. use_when: - Страница имеет один явный lead-capture сценарий. evidence: - id: production-style url: https://aicjm.ru/edu/styles.css?v=20260811-edu-canon locator: .lead-form, .lead-form__wide, .lead-form__consent, .lead-form__status, .lead-form__status.is-error supports: - anatomy - variant:deep - size:default - state:default - state:error - id: production-dom url: https://aicjm.ru/edu/ locator: form.lead-form in section.contact supports: - approved-example - content - id: production-runtime url: https://aicjm.ru/edu/script.js?v=20260812-mobile-refinements locator: form#lead-form submit handler and .lead-form__status state updates supports: - state:focus-visible - state:disabled - state:loading - state:success anatomy: - id: heading required: true role: Результат отправки. - id: fields required: true role: Набор form-control. - id: consent required: true role: Согласие и legal link. - id: submit required: true role: Button action. - id: form-status required: false role: Validation or outcome message. variants: - id: deep status: stable description: Форма на deep anchor. evidence_refs: - production-style - id: light status: candidate description: Normative gap без доказанного status palette. 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: not-applicable basis: not-applicable description: hover is not owned by lead-form. focus-visible: status: stable basis: observed description: Keyboard focus remains visible on native controls without layout shift. evidence_refs: - production-runtime active: status: not-applicable basis: not-applicable description: active is not owned by lead-form. selected: status: not-applicable basis: not-applicable description: selected is not owned by lead-form. open: status: not-applicable basis: not-applicable description: open is not owned by lead-form. disabled: status: stable basis: observed description: Native disabled submit prevents duplicate activation and preserves context. evidence_refs: - production-runtime loading: status: stable basis: observed description: Loading disables submit and announces progress through the form status. evidence_refs: - production-runtime success: status: stable basis: observed description: Confirmed completion is announced as text and offers an explicit acknowledgement action. evidence_refs: - production-runtime error: status: stable basis: observed description: error is observed at the exact production locator in evidence_refs. evidence_refs: - production-style empty: status: candidate basis: normative-gap description: Proposed empty contract for lead-form; approval is required before production use. behavior: Render an explicit no-content message and a recovery/reset action instead of a blank region. semantics: Expose the message as ordinary content or role=status after an asynchronous update. token_refs: - surface.deep - text.on-deep - text.on-deep-muted transition: Enter after a completed zero-result response and resolve after reset or new data. acceptance: - empty behavior, semantics, token refs and transition pass the lead-form manual state check. responsive: mode: two-column-to-one-column-form reading_order: DOM order remains authoritative in every mode. rules: - Keep controls, consent, submit, note and live status in DOM order. - Collapse two columns to one before labels or inputs become compressed. - Make submit full-row at narrow mode and keep status immediately after the action region. accessibility: pattern: named-form-with-live-outcome semantics: - Use form with labelled controls, consent, submit button, aria-busy and one live outcome region. keyboard: - Tab follows control order; Enter submits where native; Escape never clears user input. focus: - Failed submit focuses the first invalid control; success keeps focus on submit or moves to a confirmed next action. motion: - Loading indicator is nonessential motion and stops under reduced motion. tokens: - surface.deep - text.on-deep - text.on-deep-muted - border.on-deep - component.input.background - component.input.border - component.button.primary.background - component.button.primary.text - focus.ring content: required: - Короткий результат формы. - Только необходимые поля. - Согласие и privacy link. constraints: - Цель обработки ясна до отправки. - Claims не добавляются в consent. do: - Сохранять один submit и последовательный tab order. dont: - Не скрывать legal consent. examples: approved: status: stable description: Компонент lead-form в указанном scoped production locator. evidence: https://aicjm.ru/edu/ prohibited: description: Не скрывать legal consent. acceptance: - id: lead-form-1 criterion: Все controls имеют label. method: manual - id: lead-form-2 criterion: Loading блокирует повторную отправку и объявляет состояние через role=status. method: manual