schema: ai-cjm-component-contract/v1 id: logo-marquee version: 1.0.0 status: stable owner: AI CJM Design purpose: Показывает набор проверенных клиентских логотипов с доступным статичным fallback. use_when: - Нужно компактно показать несколько подтверждённых организаций. evidence: - id: production-style url: https://aicjm.ru/edu/styles.css?v=20260811-edu-canon locator: '.logo-cloud__marquee, .logo-cloud__track, .logo-cloud__group, .logo-cloud__marquee:hover .logo-cloud__track, @media (prefers-reduced-motion: reduce)' supports: - anatomy - variant:ambient - variant:static - size:default - state:default - state:hover - state:paused - id: production-dom url: https://aicjm.ru/edu/ locator: .logo-cloud__marquee > .logo-cloud__track > .logo-cloud__group supports: - approved-example - content anatomy: - id: track required: true role: Лента логотипов. - id: logo-item required: true role: Один asset с названием. - id: static-fallback required: true role: Сетка без движения. - id: pause-control required: true role: Явная кнопка pause/resume с aria-pressed. variants: - id: ambient status: stable description: Непрерывная лента только при разрешённом motion. evidence_refs: - production-style - id: static status: stable description: Статичная сетка для reduced motion. evidence_refs: - production-style 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 paused: status: stable basis: observed description: Движение ленты остановлено явным control или pointer hover. evidence_refs: - production-style focus-visible: status: not-applicable basis: not-applicable description: The marquee container is not focusable; linked logo children use text-link behavior. active: status: not-applicable basis: not-applicable description: active is not owned by logo-marquee. selected: status: not-applicable basis: not-applicable description: selected is not owned by logo-marquee. open: status: not-applicable basis: not-applicable description: open is not owned by logo-marquee. disabled: status: not-applicable basis: not-applicable description: disabled is not owned by logo-marquee. loading: status: not-applicable basis: not-applicable description: loading is not owned by logo-marquee. success: status: not-applicable basis: not-applicable description: success is not owned by logo-marquee. error: status: not-applicable basis: not-applicable description: error is not owned by logo-marquee. empty: status: not-applicable basis: not-applicable description: empty is not owned by logo-marquee. responsive: mode: moving-track-to-static-grid reading_order: DOM order remains authoritative in every mode. rules: - Keep a complete unique logo set at every width. - Reduce track gaps before scaling brand assets below their readable minimum. - Replace motion with a static wrapping grid when reduced motion is requested. accessibility: pattern: labelled-logo-list semantics: - Expose one unique labelled list; duplicate track items are aria-hidden. - Pause control exposes the current state with aria-pressed. keyboard: - Tab reaches the pause control; Enter or Space toggles pause and resume. focus: - Pause control uses focus.ring; no focus is moved or trapped by the moving track. motion: - prefers-reduced-motion replaces the animated track with the complete static list and removes the redundant pause control. tokens: - surface.page - border.default - text.secondary - motion.duration.slow - motion.easing.standard content: required: - Только подтверждённые client assets. constraints: - Каждый логотип имеет provenance и alt/name. - Дубли служат только бесшовному track и скрыты от accessibility tree. do: - Останавливать движение при reduced motion. dont: - Не выдавать логотип за партнёрство без evidence. examples: approved: status: stable description: Компонент logo-marquee в указанном scoped production locator. evidence: https://aicjm.ru/edu/ prohibited: description: Не выдавать логотип за партнёрство без evidence. acceptance: - id: logo-marquee-1 criterion: Static fallback содержит полный уникальный набор. method: manual - id: logo-marquee-2 criterion: Повторы скрыты от screen reader. method: manual - id: logo-marquee-3 criterion: Pause control меняет aria-pressed и состояние движения с клавиатуры. method: automated