{
 "generatedAt": "2026-10-11T20:19:15.768Z",
 "packs": [
  {
   "id": "core",
   "title": "Core",
   "description": "Базовая библиотека Vigent: заголовки, субтитры, данные, карточки, брендинг, фоны.",
   "style": "Тёмные чернила #0E0F0C, тёплый белый #F2EFE6, акцент #C6FF3D (все цвета меняются темой); expo-out и пружины.",
   "formats": "1920x1080, 1080x1920, 1080x1080",
   "counts": {
    "motions": 15,
    "transitions": 11,
    "effects": 9
   }
  },
  {
   "id": "glass",
   "title": "Glass — тёмное стекло + лайм",
   "description": "Моушн для вертикальных рилсов: стеклянные панели, iOS-иконки, кинетическая типографика Benzin, HUD-маркеры, морф логотипов, удары и короткие переходы.",
   "style": "Фон #0A0A0B с сеткой 108 px и виньеткой, стекло rgba(10,10,11,.72) с обводкой 13 % белого, единственный акцент лайм #C6FF3D, текст #FAFAFA; Benzin Bold (заголовки, капс) + Inter (текст) + JetBrains Mono (HUD); пружины без отскока-bounce, blur-in, зерно 2,5 %. Цвета (акцент, текст, фон) меняются темой таймлайна или props accent / textColor / backgroundColor; вторичные цвета статусов (оранжевый, бирюзовый) остаются.",
   "formats": "1080x1920 first (safe zone Instagram), работает в 1920x1080 и 1080x1080",
   "counts": {
    "motions": 63,
    "transitions": 6,
    "effects": 3
   }
  },
  {
   "id": "cam",
   "title": "Cam — приёмы монтажа съёмки",
   "description": "Монтаж говорящей головы и скринкастов: punch-in на склейках, съёмка в карточке снизу со стеклянной панелью сверху, кружок-PiP, запись экрана с автозумом и курсором, субтитры по слову, окно браузера, морф full↔card. Эффекты вешаются на видео-сцену, элементы — слоями поверх.",
   "style": "Тот же язык, что glass: фон #0A0A0B с сеткой 108 px, стекло с обводкой 13 %, акцент лайм #C6FF3D; Benzin Bold капсом + Inter + JetBrains Mono; движение bezier(0.16,1,0.3,1) без bounce. Геометрия карточки/кружка/окон — в долях кадра, по умолчанию под 1080x1920.",
   "formats": "1080x1920 first (карточка снизу, панель в safe zone), работает в 1920x1080 и 1080x1080",
   "counts": {
    "motions": 5,
    "transitions": 1,
    "effects": 4
   }
  },
  {
   "id": "toon",
   "title": "Toon 3D",
   "description": "3D-ситком в low-poly: вайбкодер, маскот Clawd (Claude Code) и робот GPT ночью перед огромным монитором. Персонажи из примитивов, игра по принципам Диснея (упреждение, пружины, запаздывание).",
   "style": "Ночная комната: холодный свет монитора #8FB0FF, тёплая лампа и гирлянды, тон-маппинг ACES, bloom, AO, DOF; акцент лайм #C6FF3D только на экране и у робота. Движение — пружины с перелётом.",
   "formats": "1080x1920 first; камера подстраивается под 1920x1080 и 1080x1080",
   "counts": {
    "motions": 4,
    "transitions": 0,
    "effects": 0
   }
  }
 ],
 "motions": [
  {
   "kind": "motion",
   "id": "kinetic-title",
   "pack": "core",
   "title": "Kinetic Title",
   "description": "Крупный заголовок: слова поднимаются из-под маски с пружиной, следом проявляется подзаголовок. Для открывающей сцены, смены темы, ключевой мысли.",
   "category": "typography",
   "tags": [
    "title",
    "headline",
    "заголовок",
    "kinetic",
    "intro",
    "text",
    "reveal"
   ],
   "tier": "open",
   "overlay": true,
   "gl": null,
   "width": 1920,
   "height": 1080,
   "fps": 30,
   "durationSec": 3,
   "version": "1.0.0",
   "themeMap": {
    "font": [
     "font"
    ],
    "text": [
     "color"
    ],
    "accent": [
     "accentColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "text": {
      "default": "Запускаем будущее",
      "description": "Текст заголовка; слова появляются по очереди",
      "type": "string"
     },
     "subtitle": {
      "default": "",
      "description": "Подзаголовок под заголовком, пусто — без него",
      "type": "string"
     },
     "font": {
      "default": "unbounded",
      "type": "string",
      "enum": [
       "inter",
       "manrope",
       "montserrat",
       "unbounded",
       "playfair",
       "jetbrains"
      ],
      "description": "Шрифт (все шрифты поддерживают кириллицу): inter/manrope/montserrat — гротески, unbounded — широкий акцидентный, playfair — антиква, jetbrains — моноширинный"
     },
     "color": {
      "default": "#FFFFFF",
      "description": "Цвет заголовка: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "accentColor": {
      "default": "#C6FF3D",
      "description": "Цвет подзаголовка и акцентной линии: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "background": {
      "default": "transparent",
      "description": "Фон; transparent — для наложения поверх видео: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "align": {
      "default": "center",
      "description": "Выравнивание",
      "type": "string",
      "enum": [
       "left",
       "center"
      ]
     },
     "wordStaggerFrames": {
      "default": 4,
      "description": "Задержка между словами, кадры",
      "type": "integer",
      "minimum": 1,
      "maximum": 20
     }
    }
   },
   "defaults": {
    "text": "Запускаем будущее",
    "subtitle": "",
    "font": "unbounded",
    "color": "#FFFFFF",
    "accentColor": "#C6FF3D",
    "background": "transparent",
    "align": "center",
    "wordStaggerFrames": 4
   },
   "preview": {
    "video": "previews/motion/kinetic-title.mp4",
    "poster": "previews/motion/kinetic-title.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 3
   }
  },
  {
   "kind": "motion",
   "id": "typewriter-headline",
   "pack": "core",
   "title": "Typewriter Headline",
   "description": "Заголовок печатается по буквам с мигающей кареткой, после окончания каретка продолжает мигать. Для тезиса, кода, «терминального» тона, ответа ИИ.",
   "category": "typography",
   "tags": [
    "typewriter",
    "печать",
    "каретка",
    "headline",
    "заголовок",
    "terminal",
    "text"
   ],
   "tier": "open",
   "overlay": true,
   "gl": null,
   "width": 1920,
   "height": 1080,
   "fps": 30,
   "durationSec": 4,
   "version": "1.0.0",
   "themeMap": {
    "font": [
     "font"
    ],
    "text": [
     "color"
    ],
    "accent": [
     "accentColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "text": {
      "default": "Сначала идея. Потом — код.",
      "description": "Текст, печатается по буквам; \\n — перенос строки",
      "type": "string"
     },
     "font": {
      "default": "jetbrains",
      "type": "string",
      "enum": [
       "inter",
       "manrope",
       "montserrat",
       "unbounded",
       "playfair",
       "jetbrains"
      ],
      "description": "Шрифт (все шрифты поддерживают кириллицу): inter/manrope/montserrat — гротески, unbounded — широкий акцидентный, playfair — антиква, jetbrains — моноширинный"
     },
     "color": {
      "default": "#F2EFE6",
      "description": "Цвет текста: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "accentColor": {
      "default": "#C6FF3D",
      "description": "Цвет каретки: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "background": {
      "default": "transparent",
      "description": "Фон; transparent — для наложения поверх видео: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "align": {
      "default": "left",
      "description": "Выравнивание",
      "type": "string",
      "enum": [
       "left",
       "center"
      ]
     },
     "charFrames": {
      "default": 2,
      "description": "Кадров на одну букву: меньше — быстрее печать",
      "type": "number",
      "minimum": 0.5,
      "maximum": 10
     },
     "startDelayFrames": {
      "default": 10,
      "description": "Пауза перед началом печати, кадры",
      "type": "integer",
      "minimum": 0,
      "maximum": 120
     }
    }
   },
   "defaults": {
    "text": "Сначала идея. Потом — код.",
    "font": "jetbrains",
    "color": "#F2EFE6",
    "accentColor": "#C6FF3D",
    "background": "transparent",
    "align": "left",
    "charFrames": 2,
    "startDelayFrames": 10
   },
   "preview": {
    "video": "previews/motion/typewriter-headline.mp4",
    "poster": "previews/motion/typewriter-headline.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 4
   }
  },
  {
   "kind": "motion",
   "id": "split-letters-title",
   "pack": "core",
   "title": "Split Letters Title",
   "description": "Заголовок собирается из букв: каждая прилетает снизу, из размытия в резкость, волной слева направо. Для вступления и крупной мысли, где нужна мягкость, а не удар.",
   "category": "typography",
   "tags": [
    "letters",
    "буквы",
    "blur",
    "stagger",
    "title",
    "заголовок",
    "intro"
   ],
   "tier": "open",
   "overlay": true,
   "gl": null,
   "width": 1920,
   "height": 1080,
   "fps": 30,
   "durationSec": 3,
   "version": "1.0.0",
   "themeMap": {
    "font": [
     "font"
    ],
    "text": [
     "color"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "text": {
      "default": "Движение — это смысл",
      "description": "Заголовок; буквы появляются со стаггером",
      "type": "string"
     },
     "font": {
      "default": "montserrat",
      "type": "string",
      "enum": [
       "inter",
       "manrope",
       "montserrat",
       "unbounded",
       "playfair",
       "jetbrains"
      ],
      "description": "Шрифт (все шрифты поддерживают кириллицу): inter/manrope/montserrat — гротески, unbounded — широкий акцидентный, playfair — антиква, jetbrains — моноширинный"
     },
     "color": {
      "default": "#F2EFE6",
      "description": "Цвет заголовка: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "background": {
      "default": "transparent",
      "description": "Фон; transparent — для наложения поверх видео: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "align": {
      "default": "left",
      "description": "Выравнивание",
      "type": "string",
      "enum": [
       "left",
       "center"
      ]
     },
     "letterStaggerFrames": {
      "default": 1,
      "description": "Задержка между буквами, кадры",
      "type": "number",
      "minimum": 0.2,
      "maximum": 4
     },
     "blur": {
      "default": 24,
      "description": "Начальное размытие букв, px при 1080p",
      "type": "number",
      "minimum": 0,
      "maximum": 60
     }
    }
   },
   "defaults": {
    "text": "Движение — это смысл",
    "font": "montserrat",
    "color": "#F2EFE6",
    "background": "transparent",
    "align": "left",
    "letterStaggerFrames": 1,
    "blur": 24
   },
   "preview": {
    "video": "previews/motion/split-letters-title.mp4",
    "poster": "previews/motion/split-letters-title.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 3
   }
  },
  {
   "kind": "motion",
   "id": "lower-third",
   "pack": "core",
   "title": "Lower Third",
   "description": "Плашка «имя + должность»: акцентная линия вырастает, плашка выезжает из-под маски, текст следом; в конце уезжает обратно. Для представления спикера в интервью и talking head.",
   "category": "overlays",
   "tags": [
    "lower third",
    "плашка",
    "имя",
    "спикер",
    "титр",
    "name",
    "overlay"
   ],
   "tier": "open",
   "overlay": true,
   "gl": null,
   "width": 1920,
   "height": 1080,
   "fps": 30,
   "durationSec": 4,
   "version": "1.0.0",
   "themeMap": {
    "font": [
     "font"
    ],
    "text": [
     "textColor"
    ],
    "accent": [
     "accentColor"
    ],
    "surface": [
     "plateColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "name": {
      "default": "Имя Фамилия",
      "description": "Имя",
      "type": "string"
     },
     "role": {
      "default": "Должность",
      "description": "Должность или подпись",
      "type": "string"
     },
     "font": {
      "default": "manrope",
      "type": "string",
      "enum": [
       "inter",
       "manrope",
       "montserrat",
       "unbounded",
       "playfair",
       "jetbrains"
      ],
      "description": "Шрифт (все шрифты поддерживают кириллицу): inter/manrope/montserrat — гротески, unbounded — широкий акцидентный, playfair — антиква, jetbrains — моноширинный"
     },
     "textColor": {
      "default": "#F2EFE6",
      "description": "Цвет имени и должности: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "plateColor": {
      "default": "rgba(14,15,12,0.88)",
      "description": "Цвет плашки: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "accentColor": {
      "default": "#C6FF3D",
      "description": "Цвет вертикальной линии: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "background": {
      "default": "transparent",
      "description": "Фон; transparent — для наложения поверх видео: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "position": {
      "default": "bottom-left",
      "description": "Угол, где стоит плашка",
      "type": "string",
      "enum": [
       "bottom-left",
       "bottom-right"
      ]
     }
    }
   },
   "defaults": {
    "name": "Имя Фамилия",
    "role": "Должность",
    "font": "manrope",
    "textColor": "#F2EFE6",
    "plateColor": "rgba(14,15,12,0.88)",
    "accentColor": "#C6FF3D",
    "background": "transparent",
    "position": "bottom-left"
   },
   "preview": {
    "video": "previews/motion/lower-third.mp4",
    "poster": "previews/motion/lower-third.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 4
   }
  },
  {
   "kind": "motion",
   "id": "word-captions",
   "pack": "core",
   "title": "Word Captions (karaoke)",
   "description": "Субтитры по словам в стиле рилсов: фраза по 2–4 слова, текущее слово подсвечено и слегка «подпрыгивает». Принимает слова с таймингом из транскрипции. Для talking head и вертикальных роликов.",
   "category": "captions",
   "tags": [
    "captions",
    "субтитры",
    "karaoke",
    "караоке",
    "reels",
    "words",
    "транскрипция"
   ],
   "tier": "cloud",
   "overlay": true,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 4.5,
   "version": "1.0.0",
   "themeMap": {
    "font": [
     "font"
    ],
    "text": [
     "color"
    ],
    "accent": [
     "highlightColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "words": {
      "default": [
       {
        "text": "Эти",
        "startSec": 0.2,
        "endSec": 0.5
       },
       {
        "text": "субтитры",
        "startSec": 0.5,
        "endSec": 1.1
       },
       {
        "text": "читают",
        "startSec": 1.1,
        "endSec": 1.5
       },
       {
        "text": "слово",
        "startSec": 1.5,
        "endSec": 1.9
       },
       {
        "text": "за",
        "startSec": 2.1,
        "endSec": 2.3
       },
       {
        "text": "словом",
        "startSec": 2.3,
        "endSec": 2.9
       },
       {
        "text": "в ритме",
        "startSec": 2.9,
        "endSec": 3.4
       },
       {
        "text": "речи",
        "startSec": 3.4,
        "endSec": 4
       }
      ],
      "description": "Слова с таймингом (из транскрипции): [{text, startSec, endSec}]",
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "text": {
         "type": "string",
         "description": "Слово"
        },
        "startSec": {
         "type": "number",
         "minimum": 0,
         "description": "Начало слова, секунды"
        },
        "endSec": {
         "type": "number",
         "minimum": 0,
         "description": "Конец слова, секунды"
        }
       },
       "required": [
        "text",
        "startSec",
        "endSec"
       ]
      }
     },
     "font": {
      "default": "montserrat",
      "type": "string",
      "enum": [
       "inter",
       "manrope",
       "montserrat",
       "unbounded",
       "playfair",
       "jetbrains"
      ],
      "description": "Шрифт (все шрифты поддерживают кириллицу): inter/manrope/montserrat — гротески, unbounded — широкий акцидентный, playfair — антиква, jetbrains — моноширинный"
     },
     "color": {
      "default": "#F2EFE6",
      "description": "Цвет уже сказанных слов: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "upcomingColor": {
      "default": "rgba(242,239,230,0.45)",
      "description": "Цвет ещё не сказанных слов фразы: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "highlightColor": {
      "default": "#C6FF3D",
      "description": "Цвет текущего слова: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "background": {
      "default": "transparent",
      "description": "Фон; transparent — для наложения поверх видео: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "position": {
      "default": "bottom",
      "description": "Положение блока субтитров",
      "type": "string",
      "enum": [
       "bottom",
       "center"
      ]
     },
     "maxWordsPerPhrase": {
      "default": 4,
      "description": "Максимум слов в одной фразе на экране",
      "type": "integer",
      "minimum": 1,
      "maximum": 8
     },
     "uppercase": {
      "default": true,
      "description": "Печатать заглавными, как в рилсах",
      "type": "boolean"
     }
    }
   },
   "defaults": {
    "words": [
     {
      "text": "Эти",
      "startSec": 0.2,
      "endSec": 0.5
     },
     {
      "text": "субтитры",
      "startSec": 0.5,
      "endSec": 1.1
     },
     {
      "text": "читают",
      "startSec": 1.1,
      "endSec": 1.5
     },
     {
      "text": "слово",
      "startSec": 1.5,
      "endSec": 1.9
     },
     {
      "text": "за",
      "startSec": 2.1,
      "endSec": 2.3
     },
     {
      "text": "словом",
      "startSec": 2.3,
      "endSec": 2.9
     },
     {
      "text": "в ритме",
      "startSec": 2.9,
      "endSec": 3.4
     },
     {
      "text": "речи",
      "startSec": 3.4,
      "endSec": 4
     }
    ],
    "font": "montserrat",
    "color": "#F2EFE6",
    "upcomingColor": "rgba(242,239,230,0.45)",
    "highlightColor": "#C6FF3D",
    "background": "transparent",
    "position": "bottom",
    "maxWordsPerPhrase": 4,
    "uppercase": true
   },
   "preview": {
    "video": "previews/motion/word-captions.mp4",
    "poster": "previews/motion/word-captions.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 4.5
   }
  },
  {
   "kind": "motion",
   "id": "stat-counter",
   "pack": "core",
   "title": "Stat Counter",
   "description": "Крупное число, которое считает от 0 до значения с торможением к концу; под ним вырастает линия и появляется подпись. Для ключевой цифры: выручка, рост, охват.",
   "category": "data",
   "tags": [
    "counter",
    "число",
    "цифра",
    "stat",
    "метрика",
    "KPI",
    "счётчик"
   ],
   "tier": "open",
   "overlay": true,
   "gl": null,
   "width": 1920,
   "height": 1080,
   "fps": 30,
   "durationSec": 4,
   "version": "1.0.0",
   "themeMap": {
    "font": [
     "font"
    ],
    "text": [
     "color"
    ],
    "accent": [
     "accentColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "value": {
      "default": 12480,
      "description": "Итоговое число",
      "type": "number"
     },
     "decimals": {
      "default": 0,
      "description": "Знаков после запятой",
      "type": "integer",
      "minimum": 0,
      "maximum": 3
     },
     "prefix": {
      "default": "",
      "description": "Префикс перед числом, например «$» или «×»",
      "type": "string"
     },
     "suffix": {
      "default": "",
      "description": "Суффикс после числа, например «%» или «k»",
      "type": "string"
     },
     "label": {
      "default": "роликов собрано агентами",
      "description": "Подпись под числом",
      "type": "string"
     },
     "font": {
      "default": "manrope",
      "type": "string",
      "enum": [
       "inter",
       "manrope",
       "montserrat",
       "unbounded",
       "playfair",
       "jetbrains"
      ],
      "description": "Шрифт (все шрифты поддерживают кириллицу): inter/manrope/montserrat — гротески, unbounded — широкий акцидентный, playfair — антиква, jetbrains — моноширинный"
     },
     "color": {
      "default": "#F2EFE6",
      "description": "Цвет числа и подписи: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "accentColor": {
      "default": "#C6FF3D",
      "description": "Цвет линии и префикса/суффикса: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "background": {
      "default": "transparent",
      "description": "Фон; transparent — для наложения поверх видео: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "align": {
      "default": "left",
      "description": "Выравнивание",
      "type": "string",
      "enum": [
       "left",
       "center"
      ]
     },
     "countFrames": {
      "default": 60,
      "description": "Длительность счёта, кадры",
      "type": "integer",
      "minimum": 10,
      "maximum": 120
     }
    }
   },
   "defaults": {
    "value": 12480,
    "decimals": 0,
    "prefix": "",
    "suffix": "",
    "label": "роликов собрано агентами",
    "font": "manrope",
    "color": "#F2EFE6",
    "accentColor": "#C6FF3D",
    "background": "transparent",
    "align": "left",
    "countFrames": 60
   },
   "preview": {
    "video": "previews/motion/stat-counter.mp4",
    "poster": "previews/motion/stat-counter.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 4
   }
  },
  {
   "kind": "motion",
   "id": "stats-row",
   "pack": "core",
   "title": "Stats Row",
   "description": "2–4 метрики в ряд (в вертикальном кадре — столбиком): числа считаются от 0 по очереди, под каждым линия и подпись. Для сводки результатов: рост, охват, конверсия.",
   "category": "data",
   "tags": [
    "stats",
    "метрики",
    "цифры",
    "KPI",
    "счётчик",
    "сводка",
    "counter",
    "row"
   ],
   "tier": "open",
   "overlay": true,
   "gl": null,
   "width": 1920,
   "height": 1080,
   "fps": 30,
   "durationSec": 5,
   "version": "1.0.0",
   "themeMap": {
    "font": [
     "font"
    ],
    "text": [
     "color"
    ],
    "accent": [
     "accentColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "items": {
      "default": [
       {
        "value": 12480,
        "prefix": "",
        "suffix": "",
        "decimals": 0,
        "label": "первая метрика"
       },
       {
        "value": 94,
        "prefix": "",
        "suffix": "%",
        "decimals": 0,
        "label": "вторая метрика"
       },
       {
        "value": 3.2,
        "prefix": "×",
        "suffix": "",
        "decimals": 1,
        "label": "третья метрика"
       }
      ],
      "description": "2–4 метрики; каждая считается от 0 со сдвигом по времени",
      "minItems": 2,
      "maxItems": 4,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "value": {
         "type": "number",
         "description": "Итоговое число"
        },
        "prefix": {
         "default": "",
         "description": "Префикс перед числом, например «$»",
         "type": "string"
        },
        "suffix": {
         "default": "",
         "description": "Суффикс после числа, например «%» или «k»",
         "type": "string"
        },
        "decimals": {
         "default": 0,
         "description": "Знаков после запятой",
         "type": "integer",
         "minimum": 0,
         "maximum": 3
        },
        "label": {
         "default": "",
         "description": "Подпись под числом",
         "type": "string"
        }
       },
       "required": [
        "value"
       ]
      }
     },
     "layout": {
      "default": "auto",
      "description": "Раскладка: auto — ряд в горизонтальном кадре и столбик в вертикальном",
      "type": "string",
      "enum": [
       "auto",
       "row",
       "column"
      ]
     },
     "font": {
      "default": "manrope",
      "type": "string",
      "enum": [
       "inter",
       "manrope",
       "montserrat",
       "unbounded",
       "playfair",
       "jetbrains"
      ],
      "description": "Шрифт (все шрифты поддерживают кириллицу): inter/manrope/montserrat — гротески, unbounded — широкий акцидентный, playfair — антиква, jetbrains — моноширинный"
     },
     "color": {
      "default": "#F2EFE6",
      "description": "Цвет чисел и подписей: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "accentColor": {
      "default": "#C6FF3D",
      "description": "Цвет линий и префикса/суффикса: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "background": {
      "default": "transparent",
      "description": "Фон; transparent — для наложения поверх видео: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "staggerFrames": {
      "default": 12,
      "description": "Задержка между метриками, кадры",
      "type": "integer",
      "minimum": 0,
      "maximum": 40
     },
     "countFrames": {
      "default": 50,
      "description": "Длительность счёта одной метрики, кадры",
      "type": "integer",
      "minimum": 10,
      "maximum": 120
     }
    }
   },
   "defaults": {
    "items": [
     {
      "value": 12480,
      "prefix": "",
      "suffix": "",
      "decimals": 0,
      "label": "первая метрика"
     },
     {
      "value": 94,
      "prefix": "",
      "suffix": "%",
      "decimals": 0,
      "label": "вторая метрика"
     },
     {
      "value": 3.2,
      "prefix": "×",
      "suffix": "",
      "decimals": 1,
      "label": "третья метрика"
     }
    ],
    "layout": "auto",
    "font": "manrope",
    "color": "#F2EFE6",
    "accentColor": "#C6FF3D",
    "background": "transparent",
    "staggerFrames": 12,
    "countFrames": 50
   },
   "preview": {
    "video": "previews/motion/stats-row.mp4",
    "poster": "previews/motion/stats-row.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "bar-chart",
   "pack": "core",
   "title": "Bar Chart",
   "description": "Столбчатая диаграмма: столбцы растут по очереди, значения считаются вместе с ростом, один столбец выделен акцентом. Для сравнения 2–8 величин.",
   "category": "data",
   "tags": [
    "bar",
    "chart",
    "диаграмма",
    "столбцы",
    "график",
    "data",
    "сравнение"
   ],
   "tier": "open",
   "overlay": true,
   "gl": null,
   "width": 1920,
   "height": 1080,
   "fps": 30,
   "durationSec": 4,
   "version": "1.0.0",
   "themeMap": {
    "font": [
     "font"
    ],
    "text": [
     "color"
    ],
    "accent": [
     "accentColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "title": {
      "default": "Выручка по кварталам, млн ₽",
      "description": "Заголовок графика, пусто — без него",
      "type": "string"
     },
     "data": {
      "default": [
       {
        "label": "Q1",
        "value": 12
       },
       {
        "label": "Q2",
        "value": 18
       },
       {
        "label": "Q3",
        "value": 15
       },
       {
        "label": "Q4",
        "value": 31
       }
      ],
      "description": "Столбцы: [{label, value}], 2–8 штук",
      "minItems": 2,
      "maxItems": 8,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "label": {
         "type": "string",
         "description": "Подпись столбца"
        },
        "value": {
         "type": "number",
         "description": "Значение"
        }
       },
       "required": [
        "label",
        "value"
       ]
      }
     },
     "highlight": {
      "default": "max",
      "description": "Какой столбец выделить акцентом: максимальный, последний или никакой",
      "type": "string",
      "enum": [
       "max",
       "last",
       "none"
      ]
     },
     "font": {
      "default": "manrope",
      "type": "string",
      "enum": [
       "inter",
       "manrope",
       "montserrat",
       "unbounded",
       "playfair",
       "jetbrains"
      ],
      "description": "Шрифт (все шрифты поддерживают кириллицу): inter/manrope/montserrat — гротески, unbounded — широкий акцидентный, playfair — антиква, jetbrains — моноширинный"
     },
     "color": {
      "default": "#F2EFE6",
      "description": "Цвет текста: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "barColor": {
      "default": "rgba(242,239,230,0.28)",
      "description": "Цвет обычных столбцов: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "accentColor": {
      "default": "#C6FF3D",
      "description": "Цвет выделенного столбца: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "background": {
      "default": "transparent",
      "description": "Фон; transparent — для наложения поверх видео: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     }
    }
   },
   "defaults": {
    "title": "Выручка по кварталам, млн ₽",
    "data": [
     {
      "label": "Q1",
      "value": 12
     },
     {
      "label": "Q2",
      "value": 18
     },
     {
      "label": "Q3",
      "value": 15
     },
     {
      "label": "Q4",
      "value": 31
     }
    ],
    "highlight": "max",
    "font": "manrope",
    "color": "#F2EFE6",
    "barColor": "rgba(242,239,230,0.28)",
    "accentColor": "#C6FF3D",
    "background": "transparent"
   },
   "preview": {
    "video": "previews/motion/bar-chart.mp4",
    "poster": "previews/motion/bar-chart.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 4
   }
  },
  {
   "kind": "motion",
   "id": "line-chart",
   "pack": "core",
   "title": "Line Chart",
   "description": "Линейный график: линия рисуется слева направо, на её конце бежит точка со значением. Минимум осей и сетки. Для динамики, роста, тренда.",
   "category": "data",
   "tags": [
    "line",
    "chart",
    "график",
    "линия",
    "тренд",
    "рост",
    "data"
   ],
   "tier": "premium",
   "overlay": true,
   "gl": null,
   "width": 1920,
   "height": 1080,
   "fps": 30,
   "durationSec": 4,
   "version": "1.0.0",
   "themeMap": {
    "font": [
     "font"
    ],
    "text": [
     "color"
    ],
    "accent": [
     "accentColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "title": {
      "default": "Подписчики за год",
      "description": "Заголовок графика, пусто — без него",
      "type": "string"
     },
     "values": {
      "default": [
       4,
       6,
       5,
       9,
       12,
       11,
       18,
       24,
       31
      ],
      "description": "Значения по порядку, 2–24 точки",
      "minItems": 2,
      "maxItems": 24,
      "type": "array",
      "items": {
       "type": "number"
      }
     },
     "labels": {
      "default": [
       "янв",
       "мар",
       "май",
       "июл",
       "сен"
      ],
      "description": "Подписи по оси X, равномерно по ширине; пусто — без подписей",
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "unit": {
      "default": "k",
      "description": "Единица у финального значения, например «k» или «%»",
      "type": "string"
     },
     "font": {
      "default": "manrope",
      "type": "string",
      "enum": [
       "inter",
       "manrope",
       "montserrat",
       "unbounded",
       "playfair",
       "jetbrains"
      ],
      "description": "Шрифт (все шрифты поддерживают кириллицу): inter/manrope/montserrat — гротески, unbounded — широкий акцидентный, playfair — антиква, jetbrains — моноширинный"
     },
     "color": {
      "default": "#F2EFE6",
      "description": "Цвет текста и осей: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "accentColor": {
      "default": "#C6FF3D",
      "description": "Цвет линии и точки: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "background": {
      "default": "transparent",
      "description": "Фон; transparent — для наложения поверх видео: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "drawFrames": {
      "default": 70,
      "description": "Сколько кадров рисуется линия",
      "type": "integer",
      "minimum": 15,
      "maximum": 150
     }
    }
   },
   "defaults": {
    "title": "Подписчики за год",
    "values": [
     4,
     6,
     5,
     9,
     12,
     11,
     18,
     24,
     31
    ],
    "labels": [
     "янв",
     "мар",
     "май",
     "июл",
     "сен"
    ],
    "unit": "k",
    "font": "manrope",
    "color": "#F2EFE6",
    "accentColor": "#C6FF3D",
    "background": "transparent",
    "drawFrames": 70
   },
   "preview": {
    "video": "previews/motion/line-chart.mp4",
    "poster": "previews/motion/line-chart.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 4
   }
  },
  {
   "kind": "motion",
   "id": "quote-card",
   "pack": "core",
   "title": "Quote Card",
   "description": "Светлая карточка с цитатой: карточка выезжает, слова цитаты проявляются по очереди, затем линия и автор. Типографика на антикве. Для отзывов, афоризмов, слов эксперта.",
   "category": "cards",
   "tags": [
    "quote",
    "цитата",
    "отзыв",
    "card",
    "карточка",
    "testimonial",
    "автор"
   ],
   "tier": "open",
   "overlay": true,
   "gl": null,
   "width": 1920,
   "height": 1080,
   "fps": 30,
   "durationSec": 5,
   "version": "1.0.0",
   "themeMap": {
    "font": [
     "font"
    ],
    "text": [
     "textColor"
    ],
    "accent": [
     "accentColor"
    ],
    "surface": [
     "cardColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "quote": {
      "default": "Хороший дизайн — это когда не видно, сколько в нём труда.",
      "description": "Текст цитаты, без кавычек",
      "type": "string"
     },
     "author": {
      "default": "Автор цитаты",
      "description": "Автор",
      "type": "string"
     },
     "role": {
      "default": "",
      "description": "Подпись автора, пусто — без неё",
      "type": "string"
     },
     "font": {
      "default": "playfair",
      "type": "string",
      "enum": [
       "inter",
       "manrope",
       "montserrat",
       "unbounded",
       "playfair",
       "jetbrains"
      ],
      "description": "Шрифт (все шрифты поддерживают кириллицу): inter/manrope/montserrat — гротески, unbounded — широкий акцидентный, playfair — антиква, jetbrains — моноширинный"
     },
     "cardColor": {
      "default": "#F2EFE6",
      "description": "Цвет карточки: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "textColor": {
      "default": "#14150F",
      "description": "Цвет текста на карточке: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "accentColor": {
      "default": "#C6FF3D",
      "description": "Цвет маркера-кавычки: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "background": {
      "default": "transparent",
      "description": "Фон за карточкой; transparent — для наложения поверх видео: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     }
    }
   },
   "defaults": {
    "quote": "Хороший дизайн — это когда не видно, сколько в нём труда.",
    "author": "Автор цитаты",
    "role": "",
    "font": "playfair",
    "cardColor": "#F2EFE6",
    "textColor": "#14150F",
    "accentColor": "#C6FF3D",
    "background": "transparent"
   },
   "preview": {
    "video": "previews/motion/quote-card.mp4",
    "poster": "previews/motion/quote-card.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "feature-list",
   "pack": "core",
   "title": "Feature List",
   "description": "Список из 1–6 пунктов: строки появляются по очереди, галочка прорисовывается, разделитель выезжает. Для преимуществ, шагов, состава продукта.",
   "category": "cards",
   "tags": [
    "list",
    "список",
    "features",
    "преимущества",
    "галочки",
    "checklist",
    "bullets"
   ],
   "tier": "open",
   "overlay": true,
   "gl": null,
   "width": 1920,
   "height": 1080,
   "fps": 30,
   "durationSec": 5,
   "version": "1.0.0",
   "themeMap": {
    "font": [
     "font"
    ],
    "text": [
     "color"
    ],
    "accent": [
     "accentColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "title": {
      "default": "Что внутри",
      "description": "Заголовок списка, пусто — без него",
      "type": "string"
     },
     "items": {
      "default": [
       "Каталог анимаций с параметрами",
       "Таймлайн из сцен и переходов",
       "Превью-кадр за секунды",
       "Готовый MP4 одной командой"
      ],
      "description": "Пункты списка, 1–6 коротких фраз",
      "minItems": 1,
      "maxItems": 6,
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "font": {
      "default": "manrope",
      "type": "string",
      "enum": [
       "inter",
       "manrope",
       "montserrat",
       "unbounded",
       "playfair",
       "jetbrains"
      ],
      "description": "Шрифт (все шрифты поддерживают кириллицу): inter/manrope/montserrat — гротески, unbounded — широкий акцидентный, playfair — антиква, jetbrains — моноширинный"
     },
     "color": {
      "default": "#F2EFE6",
      "description": "Цвет текста и разделителей: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "accentColor": {
      "default": "#C6FF3D",
      "description": "Цвет галочек: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "background": {
      "default": "transparent",
      "description": "Фон; transparent — для наложения поверх видео: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "staggerFrames": {
      "default": 12,
      "description": "Задержка между пунктами, кадры",
      "type": "integer",
      "minimum": 4,
      "maximum": 30
     }
    }
   },
   "defaults": {
    "title": "Что внутри",
    "items": [
     "Каталог анимаций с параметрами",
     "Таймлайн из сцен и переходов",
     "Превью-кадр за секунды",
     "Готовый MP4 одной командой"
    ],
    "font": "manrope",
    "color": "#F2EFE6",
    "accentColor": "#C6FF3D",
    "background": "transparent",
    "staggerFrames": 12
   },
   "preview": {
    "video": "previews/motion/feature-list.mp4",
    "poster": "previews/motion/feature-list.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "logo-reveal",
   "pack": "core",
   "title": "Logo Reveal",
   "description": "Раскрытие логотипа маской: акцентная линия пробегает слева направо и открывает текст или картинку, под ним вырастает тонкая черта и строка-слоган. Для концовки и заставки.",
   "category": "branding",
   "tags": [
    "logo",
    "логотип",
    "reveal",
    "outro",
    "концовка",
    "intro",
    "brand"
   ],
   "tier": "open",
   "overlay": true,
   "gl": null,
   "width": 1920,
   "height": 1080,
   "fps": 30,
   "durationSec": 3,
   "version": "1.0.0",
   "themeMap": {
    "font": [
     "font"
    ],
    "text": [
     "color"
    ],
    "accent": [
     "accentColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "text": {
      "default": "Бренд",
      "description": "Текст-логотип; используется, если imageUrl пуст",
      "type": "string"
     },
     "imageUrl": {
      "default": "",
      "description": "URL или путь к картинке логотипа (png/svg с прозрачным фоном); пусто — текстовый логотип",
      "type": "string"
     },
     "tagline": {
      "default": "",
      "description": "Строка под логотипом, пусто — без неё",
      "type": "string"
     },
     "font": {
      "default": "unbounded",
      "type": "string",
      "enum": [
       "inter",
       "manrope",
       "montserrat",
       "unbounded",
       "playfair",
       "jetbrains"
      ],
      "description": "Шрифт (все шрифты поддерживают кириллицу): inter/manrope/montserrat — гротески, unbounded — широкий акцидентный, playfair — антиква, jetbrains — моноширинный"
     },
     "color": {
      "default": "#F2EFE6",
      "description": "Цвет логотипа и строки: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "accentColor": {
      "default": "#C6FF3D",
      "description": "Цвет бегущей линии: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "background": {
      "default": "transparent",
      "description": "Фон; transparent — для наложения поверх видео: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     }
    }
   },
   "defaults": {
    "text": "Бренд",
    "imageUrl": "",
    "tagline": "",
    "font": "unbounded",
    "color": "#F2EFE6",
    "accentColor": "#C6FF3D",
    "background": "transparent"
   },
   "preview": {
    "video": "previews/motion/logo-reveal.mp4",
    "poster": "previews/motion/logo-reveal.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 3
   }
  },
  {
   "kind": "motion",
   "id": "cta-end-card",
   "pack": "core",
   "title": "CTA End Card",
   "description": "Финальная карточка с призывом: светлая плашка въезжает на тёмный фон, заголовок поднимается из маски, кнопка с стрелкой «нажимается», внизу ссылка. Для концовки рекламного ролика.",
   "category": "branding",
   "tags": [
    "cta",
    "призыв",
    "end card",
    "концовка",
    "кнопка",
    "outro",
    "call to action"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1920,
   "height": 1080,
   "fps": 30,
   "durationSec": 4,
   "version": "1.0.0",
   "themeMap": {
    "font": [
     "font"
    ],
    "text": [
     "color"
    ],
    "accent": [
     "accentColor"
    ],
    "surface": [
     "cardColor"
    ],
    "background": [
     "background"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "headline": {
      "default": "Соберите ролик за вечер",
      "description": "Призыв к действию, крупно",
      "type": "string"
     },
     "button": {
      "default": "Попробовать бесплатно",
      "description": "Текст кнопки",
      "type": "string"
     },
     "handle": {
      "default": "",
      "description": "Ссылка или @handle внизу; можно оставить пустым",
      "type": "string"
     },
     "font": {
      "default": "unbounded",
      "type": "string",
      "enum": [
       "inter",
       "manrope",
       "montserrat",
       "unbounded",
       "playfair",
       "jetbrains"
      ],
      "description": "Шрифт (все шрифты поддерживают кириллицу): inter/manrope/montserrat — гротески, unbounded — широкий акцидентный, playfair — антиква, jetbrains — моноширинный"
     },
     "color": {
      "default": "#14150F",
      "description": "Цвет текста на карточке: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "cardColor": {
      "default": "#F2EFE6",
      "description": "Цвет финальной карточки: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "accentColor": {
      "default": "#C6FF3D",
      "description": "Цвет кнопки: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "background": {
      "default": "#0E0F0C",
      "description": "Фон сцены: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     }
    }
   },
   "defaults": {
    "headline": "Соберите ролик за вечер",
    "button": "Попробовать бесплатно",
    "handle": "",
    "font": "unbounded",
    "color": "#14150F",
    "cardColor": "#F2EFE6",
    "accentColor": "#C6FF3D",
    "background": "#0E0F0C"
   },
   "preview": {
    "video": "previews/motion/cta-end-card.mp4",
    "poster": "previews/motion/cta-end-card.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 4
   }
  },
  {
   "kind": "motion",
   "id": "gradient-mesh-bg",
   "pack": "core",
   "title": "Gradient Mesh Background",
   "description": "Живой фон из больших мягких цветных пятен, которые медленно дрейфуют, с лёгким зерном. Палитра 2–4 цвета параметром. Подложка под титры и карточки; зацикливается.",
   "category": "backgrounds",
   "tags": [
    "background",
    "фон",
    "gradient",
    "mesh",
    "градиент",
    "пятна",
    "loop"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1920,
   "height": 1080,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "background": [
     "background"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "background": {
      "default": "#0E120D",
      "description": "Базовый цвет фона: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "colors": {
      "default": [
       "#C6FF3D",
       "#1F7A5C",
       "#FF6B2C",
       "#0F4A3C"
      ],
      "description": "Цвета пятен, 2–4 CSS-цвета",
      "minItems": 2,
      "maxItems": 4,
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "intensity": {
      "default": 0.55,
      "description": "Насыщенность пятен: 0.1 — еле заметно, 1 — ярко",
      "type": "number",
      "minimum": 0.1,
      "maximum": 1
     },
     "speed": {
      "default": 1,
      "description": "Скорость дрейфа, 1 — медленно и спокойно",
      "type": "number",
      "minimum": 0.1,
      "maximum": 3
     },
     "grain": {
      "default": 0.07,
      "description": "Плёночное зерно поверх, 0 — выключено",
      "type": "number",
      "minimum": 0,
      "maximum": 0.3
     }
    }
   },
   "defaults": {
    "background": "#0E120D",
    "colors": [
     "#C6FF3D",
     "#1F7A5C",
     "#FF6B2C",
     "#0F4A3C"
    ],
    "intensity": 0.55,
    "speed": 1,
    "grain": 0.07
   },
   "preview": {
    "video": "previews/motion/gradient-mesh-bg.mp4",
    "poster": "previews/motion/gradient-mesh-bg.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "grid-glow-bg",
   "pack": "core",
   "title": "Perspective Grid Background",
   "description": "Тонкая сетка в перспективе уходит к горизонту и медленно движется на зрителя, линии тают к дали. Сдержанный технологичный фон под заголовки; зацикливается.",
   "category": "backgrounds",
   "tags": [
    "background",
    "фон",
    "grid",
    "сетка",
    "перспектива",
    "tech",
    "loop"
   ],
   "tier": "open",
   "overlay": false,
   "gl": null,
   "width": 1920,
   "height": 1080,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "background": [
     "background"
    ],
    "accent": [
     "lineColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "background": {
      "default": "#0E0F0C",
      "description": "Цвет фона: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "lineColor": {
      "default": "#C6FF3D",
      "description": "Цвет линий сетки: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "cellSize": {
      "default": 120,
      "description": "Размер ячейки сетки, px при 1080p",
      "type": "number",
      "minimum": 40,
      "maximum": 300
     },
     "speed": {
      "default": 1,
      "description": "Скорость движения сетки к зрителю; 0 — статично",
      "type": "number",
      "minimum": 0,
      "maximum": 3
     },
     "horizon": {
      "default": 0.42,
      "description": "Положение горизонта по высоте кадра: 0.2 — высоко, 0.8 — низко",
      "type": "number",
      "minimum": 0.2,
      "maximum": 0.8
     },
     "lineOpacity": {
      "default": 0.35,
      "description": "Яркость линий",
      "type": "number",
      "minimum": 0.05,
      "maximum": 1
     }
    }
   },
   "defaults": {
    "background": "#0E0F0C",
    "lineColor": "#C6FF3D",
    "cellSize": 120,
    "speed": 1,
    "horizon": 0.42,
    "lineOpacity": 0.35
   },
   "preview": {
    "video": "previews/motion/grid-glow-bg.mp4",
    "poster": "previews/motion/grid-glow-bg.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-hook",
   "pack": "glass",
   "title": "Glass Hook",
   "description": "Хук-открытие рилса в стиле «тёмное стекло + лайм»: крупные слова Benzin по одному, HUD-маркеры (плашка, контур, зачёркивание, скрамбл, бирка), 3D-плита, штамп, слово-удар, морф логотипов; бейдж (иконка, число, счётчик, кольцо) и ряд иконок. Первые 1–3 секунды ролика.",
   "category": "typography",
   "tags": [
    "hook",
    "хук",
    "intro",
    "открытие",
    "kinetic",
    "заголовок",
    "hud",
    "маркер",
    "плита",
    "slab",
    "stamp",
    "reels",
    "рилс",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 3,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "lines": {
      "default": [
       "Ролик за [минуту|60 С]",
       [
        {
         "text": "без",
         "size": 110,
         "accent": false,
         "mark": "none",
         "tag": "",
         "box": false,
         "marker": false,
         "punch": false,
         "stamp": false,
         "slab": false,
         "glow": false,
         "scramble": false,
         "swapTo": "",
         "logo": false
        },
        {
         "text": "монтажа",
         "size": 110,
         "accent": false,
         "mark": "none",
         "tag": "",
         "box": false,
         "marker": false,
         "punch": false,
         "stamp": false,
         "slab": false,
         "glow": true,
         "scramble": false,
         "swapTo": "",
         "logo": false
        }
       ],
       "~руками~ — {агентом}"
      ],
      "description": "Строки хука сверху вниз. Строка — либо текст с разметкой маркеров, либо массив слов с полями (плита, штамп, удар, логотип, замена)",
      "minItems": 1,
      "type": "array",
      "items": {
       "anyOf": [
        {
         "type": "string",
         "description": "Строка с разметкой: [плашка] [плашка|тег] {контур} {контур|тег} ~зачёркивание~ *скрамбл* [*скрамбл в плашке*]; [две слова] — один маркер"
        },
        {
         "type": "array",
         "items": {
          "type": "object",
          "properties": {
           "text": {
            "type": "string",
            "description": "Слово или короткая фраза (одна ячейка строки). Для логотипа — ключ: claude, openai, gemini, skill, anthropic, n8n, telegram, cursor, deepseek, supabase"
           },
           "at": {
            "description": "Появление, сек от начала; без него — через staggerSec после предыдущего слова",
            "type": "number",
            "minimum": 0
           },
           "size": {
            "description": "Кегль, px при 1080p; без него — size хука",
            "type": "number",
            "minimum": 16,
            "maximum": 300
           },
           "accent": {
            "default": false,
            "description": "Цвет акцента (лайм)",
            "type": "boolean"
           },
           "mark": {
            "default": "none",
            "description": "HUD-маркер: solid — лаймовая плашка с уголками (тёмный текст), outline — уголки + лаймовое свечение, strike — зачёркивание (в strikeSec или через 0,4 с после появления), scramble — перебор символов в контуре",
            "type": "string",
            "enum": [
             "none",
             "solid",
             "outline",
             "strike",
             "scramble"
            ]
           },
           "tag": {
            "default": "",
            "description": "Бирка моноширинным над правым верхним углом маркера: «60 С», «100 ×»",
            "type": "string"
           },
           "box": {
            "default": false,
            "description": "Рамка выделения как в Figma + бегущий блик",
            "type": "boolean"
           },
           "marker": {
            "default": false,
            "description": "Маркер-подсветка: полупрозрачный лаймовый штрих закрашивает слово слева направо",
            "type": "boolean"
           },
           "punch": {
            "default": false,
            "description": "Слово-удар: влетает крупно (×2,3) и садится в строку",
            "type": "boolean"
           },
           "stamp": {
            "default": false,
            "description": "Штамп по буквам: каждая буква 2,5× → 1 из серого с толщиной",
            "type": "boolean"
           },
           "slab": {
            "default": false,
            "description": "3D-плита: лаймовая плита с толщиной и свечением, буквы штампом; короткие слова, ≤ 820 px шириной",
            "type": "boolean"
           },
           "slabOutSec": {
            "description": "Выход плиты ребром (поворот на 85°), сек",
            "type": "number",
            "minimum": 0
           },
           "glow": {
            "default": false,
            "description": "Слово-удар без плиты: лайм, свечение, тёмно-лаймовая толщина",
            "type": "boolean"
           },
           "strikeSec": {
            "description": "Момент зачёркивания, сек (слово сереет, по нему проходит лаймовая линия)",
            "type": "number",
            "minimum": 0
           },
           "scramble": {
            "default": false,
            "description": "Скрамбл без контура: буквы перебираются и фиксируются слева направо (названия)",
            "type": "boolean"
           },
           "letters": {
            "description": "Каждая буква из размытия; по умолчанию включено при кегле ≥ 90",
            "type": "boolean"
           },
           "swapTo": {
            "default": "",
            "description": "Замена слова: старое уходит вверх в размытие, новое проявляется акцентом. У логотипа — ключ второго логотипа (морф)",
            "type": "string"
           },
           "swapAtSec": {
            "description": "Момент замены, сек",
            "type": "number",
            "minimum": 0
           },
           "logo": {
            "default": false,
            "description": "text — ключ логотипа: силуэт в цвете бренда высотой с кегль",
            "type": "boolean"
           }
          },
          "required": [
           "text"
          ]
         },
         "description": "Строка из слов с полями"
        }
       ]
      }
     },
     "size": {
      "default": 84,
      "description": "Кегль слов по умолчанию, px при 1080p (Benzin)",
      "type": "number",
      "minimum": 24,
      "maximum": 200
     },
     "startSec": {
      "default": 0.15,
      "description": "Появление первого слова, сек",
      "type": "number",
      "minimum": 0
     },
     "staggerSec": {
      "default": 0.3,
      "description": "Пауза между словами без явного at, сек",
      "type": "number",
      "minimum": 0.02,
      "maximum": 2
     },
     "uppercase": {
      "default": false,
      "description": "Капсом (HUD-стиль)",
      "type": "boolean"
     },
     "badge": {
      "default": {
       "kind": "glyph",
       "value": "claude",
       "from": "0",
       "ring": 0.75,
       "label": "",
       "sub": "",
       "loopSec": 0,
       "swapTo": ""
      },
      "description": "Бейдж над строками; kind none — без бейджа",
      "type": "object",
      "properties": {
       "kind": {
        "type": "string",
        "enum": [
         "none",
         "number",
         "counter",
         "ring",
         "glyph",
         "calendar"
        ],
        "description": "Бейдж над строками: number — крупное число/знак, counter — счётчик from → value, ring — кольцо прогресса, glyph — иконка-плитка, calendar — листок календаря"
       },
       "value": {
        "default": "",
        "description": "number/counter/calendar — текст или число («×10», «350 000»); glyph — имя иконки (claude, openai, n8n, telegram, terminal, notion, figma, check, x…)",
        "type": "string"
       },
       "from": {
        "default": "0",
        "description": "counter: начальное значение",
        "type": "string"
       },
       "ring": {
        "default": 0.75,
        "description": "ring: доля заполнения 0–1",
        "type": "number",
        "minimum": 0,
        "maximum": 1
       },
       "label": {
        "default": "",
        "description": "ring: текст в центре (по умолчанию проценты)",
        "type": "string"
       },
       "sub": {
        "default": "",
        "description": "ring: подпись под текстом; calendar: шапка листка",
        "type": "string"
       },
       "loopSec": {
        "default": 0,
        "description": "ring: заполнять по кругу раз в N сек со вспышкой (0 — один раз)",
        "type": "number",
        "minimum": 0
       },
       "atSec": {
        "description": "Появление бейджа, сек (по умолчанию — с началом)",
        "type": "number",
        "minimum": 0
       },
       "swapTo": {
        "default": "",
        "description": "glyph: морф в другой логотип (оба из списка логотипов)",
        "type": "string"
       },
       "swapAtSec": {
        "description": "glyph: момент морфа, сек",
        "type": "number",
        "minimum": 0
       }
      },
      "required": [
       "kind"
      ]
     },
     "icons": {
      "default": [],
      "description": "Ряд крупных иконок-плиток над строками (до 4)",
      "maxItems": 4,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "icon": {
         "type": "string",
         "description": "Имя иконки (claude, openai, gemini, n8n, telegram, terminal, notion, figma, mail, sheet, brain, lock…)"
        },
        "atSec": {
         "description": "Появление, сек; по умолчанию — со сдвигом 1/3 с на иконку",
         "type": "number",
         "minimum": 0
        },
        "size": {
         "default": 220,
         "description": "Сторона плитки, px при 1080p",
         "type": "number",
         "minimum": 60,
         "maximum": 400
        },
        "swapTo": {
         "default": "",
         "description": "Морф плитки в другой логотип",
         "type": "string"
        },
        "swapAtSec": {
         "description": "Момент морфа, сек",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "icon"
       ]
      }
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "lines": [
     "Ролик за [минуту|60 С]",
     [
      {
       "text": "без",
       "size": 110,
       "accent": false,
       "mark": "none",
       "tag": "",
       "box": false,
       "marker": false,
       "punch": false,
       "stamp": false,
       "slab": false,
       "glow": false,
       "scramble": false,
       "swapTo": "",
       "logo": false
      },
      {
       "text": "монтажа",
       "size": 110,
       "accent": false,
       "mark": "none",
       "tag": "",
       "box": false,
       "marker": false,
       "punch": false,
       "stamp": false,
       "slab": false,
       "glow": true,
       "scramble": false,
       "swapTo": "",
       "logo": false
      }
     ],
     "~руками~ — {агентом}"
    ],
    "size": 84,
    "startSec": 0.15,
    "staggerSec": 0.3,
    "uppercase": false,
    "badge": {
     "kind": "glyph",
     "value": "claude",
     "from": "0",
     "ring": 0.75,
     "label": "",
     "sub": "",
     "loopSec": 0,
     "swapTo": ""
    },
    "icons": [],
    "background": true,
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-hook.mp4",
    "poster": "previews/motion/glass-hook.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 3
   }
  },
  {
   "kind": "motion",
   "id": "glass-hook-overlay",
   "pack": "glass",
   "title": "Glass Hook Overlay",
   "description": "Прозрачный хук поверх съёмки: стеклянная панель с иконкой, крупным словом в лаймовой рамке и 1–3 строками; опционально счётчик и красный штамп. Первые секунды говорящей головы, без фона.",
   "category": "overlays",
   "tags": [
    "hook",
    "хук",
    "overlay",
    "оверлей",
    "поверх видео",
    "talking head",
    "панель",
    "стекло",
    "счётчик",
    "штамп",
    "glass"
   ],
   "tier": "premium",
   "overlay": true,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 5.3,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "title": {
      "default": "CLAUDE CODE",
      "description": "Крупное слово в лаймовой рамке с бегущим бликом (Benzin); каждое слово — своей строкой",
      "type": "string"
     },
     "lines": {
      "default": [
       "дорогая модель командует,",
       "дешёвые агенты делают"
      ],
      "description": "1–3 строки под заголовком; слова входят по очереди из размытия",
      "maxItems": 3,
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "icon": {
      "default": "claude",
      "description": "Иконка-плитка слева от заголовка (claude, openai, n8n, telegram, terminal…); пусто — без иконки",
      "type": "string"
     },
     "size": {
      "default": 100,
      "description": "Кегль заголовка, px при 1080p",
      "type": "number",
      "minimum": 40,
      "maximum": 160
     },
     "position": {
      "default": "top",
      "description": "Где панель: top — верх safe zone (над лицом), center, bottom",
      "type": "string",
      "enum": [
       "top",
       "center",
       "bottom"
      ]
     },
     "outAtSec": {
      "default": 0,
      "description": "Начало мягкого ухода, сек; 0 — за 0,3 с до конца",
      "type": "number",
      "minimum": 0
     },
     "counterTo": {
      "default": 0,
      "description": "Вместо заголовка — счётчик 0 → counterTo (0 — выключен)",
      "type": "number",
      "minimum": 0
     },
     "counterFromSec": {
      "default": 0.15,
      "description": "Старт счётчика, сек",
      "type": "number",
      "minimum": 0
     },
     "counterUntilSec": {
      "default": 1.5,
      "description": "Конец счётчика, сек",
      "type": "number",
      "minimum": 0
     },
     "stampText": {
      "default": "",
      "description": "Красный штамп поверх («REMOVED», «ЗАПРЕЩЕНО»); пусто — без штампа",
      "type": "string"
     },
     "stampSub": {
      "default": "",
      "description": "Подпись под штампом",
      "type": "string"
     },
     "stampAtSec": {
      "default": 1.5,
      "description": "Момент штампа, сек",
      "type": "number",
      "minimum": 0
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "title": "CLAUDE CODE",
    "lines": [
     "дорогая модель командует,",
     "дешёвые агенты делают"
    ],
    "icon": "claude",
    "size": 100,
    "position": "top",
    "outAtSec": 0,
    "counterTo": 0,
    "counterFromSec": 0.15,
    "counterUntilSec": 1.5,
    "stampText": "",
    "stampSub": "",
    "stampAtSec": 1.5,
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-hook-overlay.mp4",
    "poster": "previews/motion/glass-hook-overlay.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-captions",
   "pack": "glass",
   "title": "Glass Captions",
   "description": "Подписи-заголовки по фразам в стиле glass: слова входят из размытия, HUD-маркеры (лаймовая плашка, контур, зачёркивание, скрамбл, бирка), выход размытием или разлётом. Поверх видео или моушна; тайминг — {text, startSec, endSec}.",
   "category": "captions",
   "tags": [
    "captions",
    "subtitles",
    "подписи",
    "субтитры",
    "фразы",
    "hud",
    "маркер",
    "плашка",
    "reels",
    "glass"
   ],
   "tier": "premium",
   "overlay": true,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 5,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "items": {
      "default": [
       {
        "text": "Агент собирает ролик",
        "startSec": 0.2,
        "endSec": 1.6,
        "accent": false
       },
       {
        "text": "по [сценарию|JSON]",
        "startSec": 1.7,
        "endSec": 3,
        "accent": false
       },
       {
        "text": "~руками~ больше не надо",
        "startSec": 3.1,
        "endSec": 4.6,
        "accent": false
       }
      ],
      "description": "Фразы подписей по времени; одна фраза в кадре, слова входят по очереди",
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "text": {
         "type": "string",
         "description": "Фраза; разметка маркеров: [плашка] [плашка|тег] {контур} ~зачёркивание~ *скрамбл* (одно маркерное слово на строку)"
        },
        "startSec": {
         "type": "number",
         "minimum": 0,
         "description": "Появление фразы, сек"
        },
        "endSec": {
         "type": "number",
         "minimum": 0,
         "description": "Уход фразы, сек (следующая фраза тоже её сменяет)"
        },
        "accent": {
         "default": false,
         "description": "Вся фраза акцентом",
         "type": "boolean"
        }
       },
       "required": [
        "text",
        "startSec",
        "endSec"
       ]
      }
     },
     "style": {
      "default": "v2",
      "description": "v2 — Inter 600, слова из размытия; hud — Benzin капсом, слова по ходу фразы, выход разлётом",
      "type": "string",
      "enum": [
       "v2",
       "hud"
      ]
     },
     "exit": {
      "default": "auto",
      "description": "Уход фразы: blur — размытие, scatter — слова разлетаются в 3D; auto — blur в v2, scatter в hud",
      "type": "string",
      "enum": [
       "auto",
       "blur",
       "scatter"
      ]
     },
     "position": {
      "default": "bottom",
      "description": "Где подпись: bottom — низ safe zone, center, top",
      "type": "string",
      "enum": [
       "bottom",
       "center",
       "top"
      ]
     },
     "size": {
      "default": 0,
      "description": "Кегль, px при 1080p; 0 — по стилю (v2 62, hud 56)",
      "type": "number",
      "minimum": 0,
      "maximum": 140
     },
     "scrim": {
      "default": false,
      "description": "Тёмная подложка-градиент под строкой (подпись поверх пёстрого видео)",
      "type": "boolean"
     },
     "wordSpread": {
      "default": 0.6,
      "description": "Доля длительности фразы, за которую проходят слова (hud — появление, маркеры — срабатывание); 0 — сразу",
      "type": "number",
      "minimum": 0,
      "maximum": 1
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "items": [
     {
      "text": "Агент собирает ролик",
      "startSec": 0.2,
      "endSec": 1.6,
      "accent": false
     },
     {
      "text": "по [сценарию|JSON]",
      "startSec": 1.7,
      "endSec": 3,
      "accent": false
     },
     {
      "text": "~руками~ больше не надо",
      "startSec": 3.1,
      "endSec": 4.6,
      "accent": false
     }
    ],
    "style": "v2",
    "exit": "auto",
    "position": "bottom",
    "size": 0,
    "scrim": false,
    "wordSpread": 0.6,
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-captions.mp4",
    "poster": "previews/motion/glass-captions.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-scramble-text",
   "pack": "glass",
   "title": "Glass Scramble Text",
   "description": "Скрамбл-текст: на месте букв перебираются случайные символы, буквы фиксируются слева направо. Для названий продуктов, терминов, «взлома», техно-подписей.",
   "category": "typography",
   "tags": [
    "scramble",
    "скрамбл",
    "decode",
    "расшифровка",
    "glitch text",
    "hacker",
    "техно",
    "текст",
    "glass"
   ],
   "tier": "premium",
   "overlay": true,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 3,
   "version": "1.0.0",
   "themeMap": {
    "text": [
     "color"
    ],
    "accent": [
     "accent"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "text": {
      "default": "CLAUDE CODE",
      "description": "Текст; перенос строки — \\n, длинные строки переносятся по словам",
      "type": "string"
     },
     "size": {
      "default": 110,
      "description": "Кегль, px при 1080p",
      "type": "number",
      "minimum": 20,
      "maximum": 260
     },
     "font": {
      "default": "display",
      "description": "display — Benzin (широкий акцидентный), body — Inter, mono — JetBrains Mono",
      "type": "string",
      "enum": [
       "display",
       "body",
       "mono"
      ]
     },
     "color": {
      "default": "#FAFAFA",
      "description": "Цвет текста (CSS)",
      "type": "string"
     },
     "uppercase": {
      "default": false,
      "description": "Капсом",
      "type": "boolean"
     },
     "align": {
      "default": "center",
      "description": "Выравнивание",
      "type": "string",
      "enum": [
       "center",
       "left"
      ]
     },
     "startSec": {
      "default": 0.15,
      "description": "Старт эффекта, сек",
      "type": "number",
      "minimum": 0
     },
     "outSec": {
      "default": 0,
      "description": "Уход размытием вверх, сек; 0 — без ухода",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": false,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "delaySec": {
      "default": 0.2,
      "description": "Сколько перебираются символы до фиксации первой буквы, сек",
      "type": "number",
      "minimum": 0,
      "maximum": 3
     },
     "stepSec": {
      "default": 0.05,
      "description": "Шаг фиксации букв слева направо, сек",
      "type": "number",
      "minimum": 0.005,
      "maximum": 0.5
     },
     "pool": {
      "default": "letters",
      "description": "Случайные символы: letters — буквы и цифры (акцентные, полупрозрачные), hud — машинные #%<>{} в цвете текста",
      "type": "string",
      "enum": [
       "letters",
       "hud"
      ]
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "text": "CLAUDE CODE",
    "size": 110,
    "font": "display",
    "color": "#FAFAFA",
    "uppercase": false,
    "align": "center",
    "startSec": 0.15,
    "outSec": 0,
    "background": false,
    "delaySec": 0.2,
    "stepSec": 0.05,
    "pool": "letters",
    "accent": "#C6FF3D",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-scramble-text.mp4",
    "poster": "previews/motion/glass-scramble-text.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 3
   }
  },
  {
   "kind": "motion",
   "id": "glass-letter-text",
   "pack": "glass",
   "title": "Glass Letter Text",
   "description": "Текст по буквам: каждая буква проявляется из размытия с подъёмом, слева направо. Спокойный крупный заголовок, ключевое слово, цифра.",
   "category": "typography",
   "tags": [
    "letters",
    "по буквам",
    "blur in",
    "reveal",
    "проявление",
    "заголовок",
    "текст",
    "glass"
   ],
   "tier": "premium",
   "overlay": true,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 3,
   "version": "1.0.0",
   "themeMap": {
    "text": [
     "color"
    ],
    "accent": [
     "accent"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "text": {
      "default": "Нейросети работают за вас",
      "description": "Текст; перенос строки — \\n, длинные строки переносятся по словам",
      "type": "string"
     },
     "size": {
      "default": 110,
      "description": "Кегль, px при 1080p",
      "type": "number",
      "minimum": 20,
      "maximum": 260
     },
     "font": {
      "default": "display",
      "description": "display — Benzin (широкий акцидентный), body — Inter, mono — JetBrains Mono",
      "type": "string",
      "enum": [
       "display",
       "body",
       "mono"
      ]
     },
     "color": {
      "default": "#FAFAFA",
      "description": "Цвет текста (CSS)",
      "type": "string"
     },
     "uppercase": {
      "default": false,
      "description": "Капсом",
      "type": "boolean"
     },
     "align": {
      "default": "center",
      "description": "Выравнивание",
      "type": "string",
      "enum": [
       "center",
       "left"
      ]
     },
     "startSec": {
      "default": 0.15,
      "description": "Старт эффекта, сек",
      "type": "number",
      "minimum": 0
     },
     "outSec": {
      "default": 0,
      "description": "Уход размытием вверх, сек; 0 — без ухода",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": false,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "stepSec": {
      "default": 0.03333333333333333,
      "description": "Задержка между буквами, сек; каждая буква проявляется из размытия за 0,2 с",
      "type": "number",
      "minimum": 0.005,
      "maximum": 0.5
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "text": "Нейросети работают за вас",
    "size": 110,
    "font": "display",
    "color": "#FAFAFA",
    "uppercase": false,
    "align": "center",
    "startSec": 0.15,
    "outSec": 0,
    "background": false,
    "stepSec": 0.03333333333333333,
    "accent": "#C6FF3D",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-letter-text.mp4",
    "poster": "previews/motion/glass-letter-text.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 3
   }
  },
  {
   "kind": "motion",
   "id": "glass-logo-morph",
   "pack": "glass",
   "title": "Glass Logo Morph",
   "description": "Морф логотипов AI-сервисов: силуэт одного бренда перетекает в другой (Claude → Gemini → OpenAI…), фон плитки и цвет смешиваются. Для «замени X на Y», сравнения инструментов, перечисления стека.",
   "category": "branding",
   "tags": [
    "logo",
    "morph",
    "логотип",
    "морф",
    "перетекание",
    "claude",
    "openai",
    "gemini",
    "n8n",
    "telegram",
    "brand",
    "glass"
   ],
   "tier": "cloud",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 4,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "logos": {
      "default": [
       "claude",
       "gemini",
       "openai"
      ],
      "description": "Логотипы по порядку; соседние перетекают друг в друга. Хорошие пары: claude↔gemini, skill↔openai, gemini↔openai, claude↔telegram, gemini↔deepseek, cursor↔claude, claude↔deepseek, claude↔openai, skill↔gemini",
      "minItems": 1,
      "maxItems": 8,
      "type": "array",
      "items": {
       "type": "string",
       "enum": [
        "claude",
        "openai",
        "gemini",
        "skill",
        "anthropic",
        "n8n",
        "telegram",
        "cursor",
        "deepseek",
        "supabase"
       ]
      }
     },
     "times": {
      "default": [],
      "description": "Моменты смен (середина морфа), сек — по одному на каждую смену; пусто — каждые everySec начиная с firstSec",
      "type": "array",
      "items": {
       "type": "number",
       "minimum": 0
      }
     },
     "firstSec": {
      "default": 1,
      "description": "Первая смена, сек (если times пуст)",
      "type": "number",
      "minimum": 0
     },
     "everySec": {
      "default": 1.2,
      "description": "Шаг смен, сек (если times пуст)",
      "type": "number",
      "minimum": 0.3
     },
     "mode": {
      "default": "tile",
      "description": "tile — iOS-плитка (фон плитки тоже смешивается), silhouette — силуэт в цвете бренда",
      "type": "string",
      "enum": [
       "tile",
       "silhouette"
      ]
     },
     "size": {
      "default": 360,
      "description": "Сторона плитки/силуэта, px при 1080p",
      "type": "number",
      "minimum": 80,
      "maximum": 800
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный",
      "type": "boolean"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "logos": [
     "claude",
     "gemini",
     "openai"
    ],
    "times": [],
    "firstSec": 1,
    "everySec": 1.2,
    "mode": "tile",
    "size": 360,
    "background": true,
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-logo-morph.mp4",
    "poster": "previews/motion/glass-logo-morph.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 4
   }
  },
  {
   "kind": "motion",
   "id": "glass-background",
   "pack": "glass",
   "title": "Glass Background",
   "description": "Фон пака glass: почти чёрный #0A0A0B, тонкая сетка 108 px с дрейфом, частицы, виньетка, мягкое лаймовое свечение и зерно. Подложка под стеклянные карточки, хуки и текст пака.",
   "category": "backgrounds",
   "tags": [
    "background",
    "фон",
    "grid",
    "сетка",
    "glow",
    "свечение",
    "dark",
    "тёмный",
    "grain",
    "зерно",
    "glass"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 5,
   "version": "1.0.0",
   "themeMap": {
    "background": [
     "background"
    ],
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "grid": {
      "default": true,
      "description": "Сетка 108 px с медленным дрейфом",
      "type": "boolean"
     },
     "particles": {
      "default": true,
      "description": "Медленно плывущие светлые точки",
      "type": "boolean"
     },
     "vignette": {
      "default": true,
      "description": "Виньетка: края кадра темнее",
      "type": "boolean"
     },
     "glow": {
      "default": 0.8,
      "description": "Сила акцентного свечения ~1100 px (0 — без него)",
      "type": "number",
      "minimum": 0,
      "maximum": 1.5
     },
     "glowX": {
      "default": 50,
      "description": "Центр свечения, % ширины",
      "type": "number",
      "minimum": 0,
      "maximum": 100
     },
     "glowY": {
      "default": 45,
      "description": "Центр свечения, % высоты",
      "type": "number",
      "minimum": 0,
      "maximum": 100
     },
     "grain": {
      "default": true,
      "description": "Зерно 2,5 % — гасит полосы (бандинг) на свечении в H.264",
      "type": "boolean"
     },
     "bpm": {
      "default": 0,
      "description": "Пульс сетки и свечения в такт музыке, BPM (0 — без пульса)",
      "type": "number",
      "minimum": 0,
      "maximum": 240
     },
     "handle": {
      "default": "",
      "description": "Водяной знак @handle слева сверху; пусто — без него",
      "type": "string"
     },
     "background": {
      "default": "#0A0A0B",
      "description": "Цвет фона (CSS)",
      "type": "string"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Цвет свечения (hex #RRGGBB)",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     }
    }
   },
   "defaults": {
    "grid": true,
    "particles": true,
    "vignette": true,
    "glow": 0.8,
    "glowX": 50,
    "glowY": 45,
    "grain": true,
    "bpm": 0,
    "handle": "",
    "background": "#0A0A0B",
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA"
   },
   "preview": {
    "video": "previews/motion/glass-background.mp4",
    "poster": "previews/motion/glass-background.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-cards",
   "pack": "glass",
   "title": "Glass Cards",
   "description": "Стеклянные карточки со списками: столбик, сетка, стопка, флип на обратную сторону, 3D-плоскости (floor, tilt, iso, fan). Пункты с маркерами (файл, крест, галочка, чекбокс), зачёркиванием, прогресс-барами, дрожанием-ошибкой. Для сравнений «было/стало», списков шагов, чек-листов.",
   "category": "cards",
   "tags": [
    "cards",
    "карточки",
    "список",
    "checklist",
    "чек-лист",
    "стопка",
    "stack",
    "flip",
    "флип",
    "plane",
    "плоскость",
    "floor",
    "tilt",
    "iso",
    "fan",
    "веер",
    "glass",
    "стекло",
    "было стало"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 8,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "cards": {
      "default": [
       {
        "title": "Было",
        "subtitle": "руками",
        "icon": "folder",
        "items": [
         {
          "text": "Монтаж 6 часов"
         },
         {
          "text": "Субтитры вручную"
         },
         {
          "text": "Экспорт, правки, снова экспорт"
         }
        ],
        "marks": [
         "x",
         "x",
         "x"
        ]
       },
       {
        "title": "Стало",
        "subtitle": "агентом",
        "icon": "claude",
        "items": [
         {
          "text": "Сценарий в чате",
          "checkSec": 2.2
         },
         {
          "text": "Ролик собирается сам",
          "checkSec": 2.7
         },
         {
          "text": "Готово за минуту",
          "checkSec": 3.2
         }
        ],
        "marks": [
         "todo",
         "todo",
         "todo"
        ]
       }
      ],
      "description": "Карточки. 1 — крупная, 2–3 — столбик, 4+ — сетка 2×2, layout stack — стопка",
      "minItems": 1,
      "maxItems": 6,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "atSec": {
         "description": "Появление карточки, сек; без него — startSec + номер × staggerSec",
         "type": "number",
         "minimum": 0
        },
        "title": {
         "type": "string",
         "description": "Заголовок карточки (Benzin, лайм)"
        },
        "subtitle": {
         "default": "",
         "description": "Подзаголовок под заголовком",
         "type": "string"
        },
        "icon": {
         "default": "folder",
         "description": "Иконка-плитка: claude, openai, n8n, telegram, terminal, notion, folder, notes, check, x, brain, mail, sheet, lock…",
         "type": "string"
        },
        "items": {
         "default": [],
         "description": "Пункты списка",
         "type": "array",
         "items": {
          "type": "object",
          "properties": {
           "text": {
            "type": "string",
            "description": "Текст пункта"
           },
           "atSec": {
            "description": "Появление пункта, сек; без него — через 0,23 с после карточки со стаггером 0,08 с",
            "type": "number",
            "minimum": 0
           },
           "checkSec": {
            "description": "Момент, когда ставится галочка (только при marks: todo), сек",
            "type": "number",
            "minimum": 0
           },
           "strikeSec": {
            "description": "Момент, когда пункт зачёркивается акцентной линией, сек",
            "type": "number",
            "minimum": 0
           },
           "progress": {
            "description": "Полоса прогресса под пунктом, 0–1",
            "type": "number",
            "minimum": 0,
            "maximum": 1
           }
          },
          "required": [
           "text"
          ]
         }
        },
        "marks": {
         "description": "Маркер слева от каждого пункта: file — файл, x — крест, check — галочка, num — номер, todo — чекбокс (ставится на checkSec)",
         "type": "array",
         "items": {
          "type": "string",
          "enum": [
           "file",
           "x",
           "check",
           "num",
           "todo"
          ]
         }
        },
        "shakeSec": {
         "description": "Дрожание карточки с оранжевой вспышкой (ошибка), сек",
         "type": "number",
         "minimum": 0
        },
        "flipSec": {
         "description": "Флип по Y на обратную сторону back, сек (нужен back)",
         "type": "number",
         "minimum": 0
        },
        "back": {
         "description": "Обратная сторона карточки для флипа",
         "type": "object",
         "properties": {
          "title": {
           "type": "string",
           "description": "Заголовок обратной стороны"
          },
          "subtitle": {
           "description": "Подзаголовок (по умолчанию как на лицевой стороне)",
           "type": "string"
          },
          "icon": {
           "description": "Иконка (по умолчанию как на лицевой стороне)",
           "type": "string"
          },
          "items": {
           "default": [],
           "description": "Пункты обратной стороны: строки или объекты как у пунктов лицевой",
           "type": "array",
           "items": {
            "anyOf": [
             {
              "type": "string"
             },
             {
              "type": "object",
              "properties": {
               "text": {
                "type": "string",
                "description": "Текст пункта"
               },
               "atSec": {
                "description": "Появление пункта, сек; без него — через 0,23 с после карточки со стаггером 0,08 с",
                "type": "number",
                "minimum": 0
               },
               "checkSec": {
                "description": "Момент, когда ставится галочка (только при marks: todo), сек",
                "type": "number",
                "minimum": 0
               },
               "strikeSec": {
                "description": "Момент, когда пункт зачёркивается акцентной линией, сек",
                "type": "number",
                "minimum": 0
               },
               "progress": {
                "description": "Полоса прогресса под пунктом, 0–1",
                "type": "number",
                "minimum": 0,
                "maximum": 1
               }
              },
              "required": [
               "text"
              ]
             }
            ]
           }
          }
         },
         "required": [
          "title"
         ]
        }
       },
       "required": [
        "title"
       ]
      }
     },
     "header": {
      "description": "Шапка над карточками: иконка и заголовок",
      "type": "object",
      "properties": {
       "text": {
        "type": "string",
        "description": "Текст шапки над карточками"
       },
       "icon": {
        "description": "Иконка шапки",
        "type": "string"
       },
       "atSec": {
        "description": "Появление шапки, сек",
        "type": "number",
        "minimum": 0
       }
      },
      "required": [
       "text"
      ]
     },
     "layout": {
      "default": "auto",
      "description": "auto — столбик/сетка по числу карточек; stack — стопка: новая сверху, старые уходят вниз, темнеют и размываются",
      "type": "string",
      "enum": [
       "auto",
       "stack"
      ]
     },
     "plane": {
      "default": "none",
      "description": "3D-плоскость: floor — новая карточка в слоте героя, прошлые ложатся на пол; tilt — наклон; iso — изометрическая стопка; fan — веер",
      "type": "string",
      "enum": [
       "none",
       "floor",
       "tilt",
       "iso",
       "fan"
      ]
     },
     "planeSec": {
      "description": "Момент перехода из плоской раскладки в плоскость, сек (по умолчанию — с самого начала)",
      "type": "number",
      "minimum": 0
     },
     "big": {
      "default": false,
      "description": "Крупные карточки: шрифты ×1,6",
      "type": "boolean"
     },
     "startSec": {
      "default": 0.1,
      "description": "Появление первой карточки, сек",
      "type": "number",
      "minimum": 0
     },
     "staggerSec": {
      "default": 1.1,
      "description": "Пауза между карточками без atSec, сек",
      "type": "number",
      "minimum": 0.1,
      "maximum": 5
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "cards": [
     {
      "title": "Было",
      "subtitle": "руками",
      "icon": "folder",
      "items": [
       {
        "text": "Монтаж 6 часов"
       },
       {
        "text": "Субтитры вручную"
       },
       {
        "text": "Экспорт, правки, снова экспорт"
       }
      ],
      "marks": [
       "x",
       "x",
       "x"
      ]
     },
     {
      "title": "Стало",
      "subtitle": "агентом",
      "icon": "claude",
      "items": [
       {
        "text": "Сценарий в чате",
        "checkSec": 2.2
       },
       {
        "text": "Ролик собирается сам",
        "checkSec": 2.7
       },
       {
        "text": "Готово за минуту",
        "checkSec": 3.2
       }
      ],
      "marks": [
       "todo",
       "todo",
       "todo"
      ]
     }
    ],
    "layout": "auto",
    "plane": "none",
    "big": false,
    "startSec": 0.1,
    "staggerSec": 1.1,
    "background": true,
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-cards.mp4",
    "poster": "previews/motion/glass-cards.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-pipeline",
   "pack": "glass",
   "title": "Glass Pipeline",
   "description": "Пайплайн из 2–6 стеклянных узлов-пилюль зигзагом: иконка, название, роль; пунктирные дуги с подписью шага рисуются по ходу, по ним летят светящиеся пакеты; финальный узел подсвечивается лаймом. Для схем «вход → обработка → результат», цепочек инструментов, шагов процесса.",
   "category": "scenes",
   "tags": [
    "pipeline",
    "пайплайн",
    "схема",
    "flow",
    "workflow",
    "шаги",
    "steps",
    "узлы",
    "nodes",
    "connector",
    "дуги",
    "packets",
    "процесс",
    "glass",
    "стекло"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 8,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "nodes": {
      "default": [
       {
        "title": "Идея",
        "subtitle": "голосовая заметка",
        "icon": "mic"
       },
       {
        "title": "Claude",
        "subtitle": "сценарий и план",
        "icon": "claude"
       },
       {
        "title": "Vigent",
        "subtitle": "анимации и монтаж",
        "icon": "layers"
       },
       {
        "title": "Ролик",
        "subtitle": "готовый MP4",
        "icon": "video",
        "glowSec": 4.6
       }
      ],
      "description": "Узлы-пилюли зигзагом (2–6), между ними пунктирные дуги",
      "minItems": 2,
      "maxItems": 6,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "title": {
         "type": "string",
         "description": "Название узла (Benzin)"
        },
        "subtitle": {
         "default": "",
         "description": "Роль узла под названием",
         "type": "string"
        },
        "icon": {
         "default": "claude",
         "description": "Иконка-плитка: claude, openai, n8n, telegram, terminal, notion, figma, mail, sheet, brain, lock, check…",
         "type": "string"
        },
        "atSec": {
         "description": "Появление узла, сек; без него — startSec + номер × staggerSec",
         "type": "number",
         "minimum": 0
        },
        "glowSec": {
         "description": "Момент, с которого узел подсвечен лаймом и пульсирует (финал), сек",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "title"
       ]
      }
     },
     "packets": {
      "default": true,
      "description": "Светящийся пакет летит по дуге перед появлением следующего узла",
      "type": "boolean"
     },
     "steps": {
      "default": true,
      "description": "Подписи «N шаг» на дугах; false — без чисел на экране",
      "type": "boolean"
     },
     "stepLabel": {
      "default": "шаг",
      "description": "Слово в подписи дуги: «2 шаг», «3 шаг»…",
      "type": "string"
     },
     "startSec": {
      "default": 0.15,
      "description": "Появление первого узла, сек",
      "type": "number",
      "minimum": 0
     },
     "staggerSec": {
      "default": 1.2,
      "description": "Пауза между узлами без atSec, сек (не меньше 0,9: дуга и пакет бегут перед узлом)",
      "type": "number",
      "minimum": 0.9,
      "maximum": 5
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "nodes": [
     {
      "title": "Идея",
      "subtitle": "голосовая заметка",
      "icon": "mic"
     },
     {
      "title": "Claude",
      "subtitle": "сценарий и план",
      "icon": "claude"
     },
     {
      "title": "Vigent",
      "subtitle": "анимации и монтаж",
      "icon": "layers"
     },
     {
      "title": "Ролик",
      "subtitle": "готовый MP4",
      "icon": "video",
      "glowSec": 4.6
     }
    ],
    "packets": true,
    "steps": true,
    "stepLabel": "шаг",
    "startSec": 0.15,
    "staggerSec": 1.2,
    "background": true,
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-pipeline.mp4",
    "poster": "previews/motion/glass-pipeline.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-stats",
   "pack": "glass",
   "title": "Glass Stats",
   "description": "Таблица «было → стало» на одной стеклянной карточке: строки появляются по очереди, старое значение зачёркнуто, новое — лаймовое с бегущим бликом, числа скручиваются от старого к новому; итоговая строка и футер. Для сравнения цифр до и после, экономии времени и денег.",
   "category": "data",
   "tags": [
    "stats",
    "таблица",
    "было стало",
    "before after",
    "сравнение",
    "цифры",
    "числа",
    "counter",
    "скручивание",
    "итого",
    "метрики",
    "data",
    "glass",
    "стекло"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 5,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "title": {
      "default": "Итого за месяц",
      "description": "Заголовок таблицы слева сверху (Benzin, лайм)",
      "type": "string"
     },
     "subtitle": {
      "default": "руками → со штатом",
      "description": "Подпись справа сверху",
      "type": "string"
     },
     "rows": {
      "default": [
       {
        "label": "Монтаж",
        "before": "46 ч",
        "after": "2 ч",
        "total": false
       },
       {
        "label": "Субтитры",
        "before": "12 ч",
        "after": "0 ч",
        "total": false
       },
       {
        "label": "Правки",
        "before": "20 ч",
        "after": "3 ч",
        "total": false
       },
       {
        "label": "Всего",
        "before": "78 ч",
        "after": "5 ч",
        "total": true
       }
      ],
      "description": "Строки «было → стало»",
      "minItems": 1,
      "maxItems": 8,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "label": {
         "type": "string",
         "description": "Название строки"
        },
        "before": {
         "type": "string",
         "description": "Значение «было» (зачёркивается, серое): «46,5 ч», «330 000»"
        },
        "after": {
         "type": "string",
         "description": "Значение «стало» (лайм, Benzin); при count число скручивается от before к after"
        },
        "atSec": {
         "description": "Появление строки, сек; без него — startSec + 0,5 + номер × staggerSec",
         "type": "number",
         "minimum": 0
        },
        "total": {
         "default": false,
         "description": "Итоговая строка: линия сверху, крупнее",
         "type": "boolean"
        }
       },
       "required": [
        "label",
        "before",
        "after"
       ]
      }
     },
     "footer": {
      "description": "Подпись внизу карточки",
      "type": "object",
      "properties": {
       "text": {
        "type": "string",
        "description": "Текст футера"
       },
       "atSec": {
        "type": "number",
        "minimum": 0,
        "description": "Появление футера, сек"
       }
      },
      "required": [
       "text",
       "atSec"
      ]
     },
     "count": {
      "default": true,
      "description": "Числа скручиваются от «было» к «стало»; false — «стало» появляется сразу",
      "type": "boolean"
     },
     "startSec": {
      "default": 0.1,
      "description": "Появление карточки, сек",
      "type": "number",
      "minimum": 0
     },
     "staggerSec": {
      "default": 0.7,
      "description": "Пауза между строками без atSec, сек",
      "type": "number",
      "minimum": 0.1,
      "maximum": 5
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "title": "Итого за месяц",
    "subtitle": "руками → со штатом",
    "rows": [
     {
      "label": "Монтаж",
      "before": "46 ч",
      "after": "2 ч",
      "total": false
     },
     {
      "label": "Субтитры",
      "before": "12 ч",
      "after": "0 ч",
      "total": false
     },
     {
      "label": "Правки",
      "before": "20 ч",
      "after": "3 ч",
      "total": false
     },
     {
      "label": "Всего",
      "before": "78 ч",
      "after": "5 ч",
      "total": true
     }
    ],
    "count": true,
    "startSec": 0.1,
    "staggerSec": 0.7,
    "background": true,
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-stats.mp4",
    "poster": "previews/motion/glass-stats.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-terminal",
   "pack": "glass",
   "title": "Glass Terminal",
   "description": "Окно терминала в стиле «тёмное стекло»: команды печатаются с лаймовым курсором, ответы появляются строками (out — серые, ok — лаймовые, err — оранжевые). Режим big увеличивает окно. Для демонстрации работы агента, CLI, установки, логов.",
   "category": "scenes",
   "tags": [
    "terminal",
    "терминал",
    "cli",
    "консоль",
    "console",
    "команда",
    "command",
    "typing",
    "печать",
    "claude code",
    "логи",
    "agent",
    "агент",
    "glass",
    "стекло"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 8,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "title": {
      "default": "claude",
      "description": "Заголовок окна терминала (рядом с тремя точками)",
      "type": "string"
     },
     "lines": {
      "default": [
       {
        "kind": "cmd",
        "text": "claude \"собери ролик по сценарию\""
       },
       {
        "kind": "out",
        "text": "Читаю сценарий… 6 сцен"
       },
       {
        "kind": "out",
        "text": "Подбираю элементы из каталога"
       },
       {
        "kind": "ok",
        "text": "Таймлайн собран"
       },
       {
        "kind": "cmd",
        "text": "render --mp4"
       },
       {
        "kind": "ok",
        "text": "Готово: reel.mp4"
       }
      ],
      "description": "Строки терминала сверху вниз",
      "minItems": 1,
      "maxItems": 14,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "kind": {
         "default": "out",
         "description": "cmd — команда с «❯», печатается с курсором; out — серый ответ; ok — лаймовый успех; err — оранжевая ошибка",
         "type": "string",
         "enum": [
          "cmd",
          "out",
          "ok",
          "err"
         ]
        },
        "text": {
         "type": "string",
         "description": "Текст строки"
        },
        "atSec": {
         "description": "Появление строки, сек; без него — после предыдущей (команда печатается, потом пауза 0,4 с)",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "text"
       ]
      }
     },
     "big": {
      "default": false,
      "description": "Крупное окно: масштаб zoom (по умолчанию 1,3), ширина та же — шрифт крупнее",
      "type": "boolean"
     },
     "zoom": {
      "description": "Масштаб окна при big; без него — 1,3",
      "type": "number",
      "minimum": 1,
      "maximum": 2
     },
     "startSec": {
      "default": 0.1,
      "description": "Появление окна и первой строки, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "title": "claude",
    "lines": [
     {
      "kind": "cmd",
      "text": "claude \"собери ролик по сценарию\""
     },
     {
      "kind": "out",
      "text": "Читаю сценарий… 6 сцен"
     },
     {
      "kind": "out",
      "text": "Подбираю элементы из каталога"
     },
     {
      "kind": "ok",
      "text": "Таймлайн собран"
     },
     {
      "kind": "cmd",
      "text": "render --mp4"
     },
     {
      "kind": "ok",
      "text": "Готово: reel.mp4"
     }
    ],
    "big": false,
    "startSec": 0.1,
    "background": true,
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-terminal.mp4",
    "poster": "previews/motion/glass-terminal.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-talk",
   "pack": "glass",
   "title": "Glass Talk",
   "description": "Голова говорящего (картинка src, без неё — нейтральный силуэт) в углу и стеклянный речевой пузырь, в котором слова реплики появляются кинетически: акцент, рамка, маркер, слово-удар. Подскок головы по cues. Для реплик персонажа, закадровой «речи», комментариев.",
   "category": "characters",
   "tags": [
    "talk",
    "говорит",
    "реплика",
    "speech bubble",
    "пузырь",
    "голова",
    "head",
    "avatar",
    "аватар",
    "персонаж",
    "character",
    "dialog",
    "диалог",
    "glass",
    "стекло"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 5,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "src": {
      "default": "",
      "description": "Картинка головы (PNG с прозрачным фоном, URL или файл из public/). Пусто — нейтральный силуэт-плейсхолдер",
      "type": "string"
     },
     "side": {
      "default": "left",
      "description": "Сторона головы; пузырь — с другой",
      "type": "string",
      "enum": [
       "left",
       "right"
      ]
     },
     "lines": {
      "default": [
       "Я просто описываю",
       "задачу, а *агент* [собирает] весь ролик"
      ],
      "description": "Реплика в речевом пузыре построчно; слова появляются одно за другим",
      "minItems": 1,
      "type": "array",
      "items": {
       "anyOf": [
        {
         "type": "string",
         "description": "Строка текста; слова через пробел. *слово* — акцент, [слово] — маркер, !слово! — удар"
        },
        {
         "type": "array",
         "items": {
          "type": "object",
          "properties": {
           "text": {
            "type": "string",
            "description": "Слово"
           },
           "atSec": {
            "description": "Появление слова, сек; без него — через staggerSec после предыдущего",
            "type": "number",
            "minimum": 0
           },
           "accent": {
            "default": false,
            "description": "Цвет акцента (лайм)",
            "type": "boolean"
           },
           "box": {
            "default": false,
            "description": "Рамка выделения + бегущий блик",
            "type": "boolean"
           },
           "marker": {
            "default": false,
            "description": "Маркер-подсветка слева направо",
            "type": "boolean"
           },
           "punch": {
            "default": false,
            "description": "Слово-удар: влетает крупно и садится в строку",
            "type": "boolean"
           }
          },
          "required": [
           "text"
          ]
         },
         "description": "Строка из слов с полями"
        }
       ]
      }
     },
     "cues": {
      "default": [],
      "description": "Смена выражения головы по ходу: подскок и, если задан src, другая картинка",
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "atSec": {
         "type": "number",
         "minimum": 0,
         "description": "Момент смены выражения, сек: голова подскакивает"
        },
        "src": {
         "description": "Другая картинка головы (URL или файл) — выражение; без неё — подскок той же",
         "type": "string"
        }
       },
       "required": [
        "atSec"
       ]
      }
     },
     "size": {
      "default": 34,
      "description": "Кегль слов в пузыре, px при 1080p",
      "type": "number",
      "minimum": 24,
      "maximum": 60
     },
     "startSec": {
      "default": 0.2,
      "description": "Появление головы, сек; пузырь — на 0,07 с позже",
      "type": "number",
      "minimum": 0
     },
     "wordStartSec": {
      "description": "Появление первого слова, сек (по умолчанию startSec + 0,3)",
      "type": "number",
      "minimum": 0
     },
     "staggerSec": {
      "default": 0.2,
      "description": "Пауза между словами без atSec, сек",
      "type": "number",
      "minimum": 0.03,
      "maximum": 2
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "src": "",
    "side": "left",
    "lines": [
     "Я просто описываю",
     "задачу, а *агент* [собирает] весь ролик"
    ],
    "cues": [],
    "size": 34,
    "startSec": 0.2,
    "staggerSec": 0.2,
    "background": true,
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-talk.mp4",
    "poster": "previews/motion/glass-talk.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-profile",
   "pack": "glass",
   "title": "Glass Profile",
   "description": "Мокап профиля соцсети (стекло и лайм): аватар, имя, ник, плитки статистики, описание и кнопка «Подписаться», по которой в нужную секунду кликает курсор — кнопка переключается в «Подписан». Для призыва подписаться, показа аккаунта.",
   "category": "scenes",
   "tags": [
    "profile",
    "профиль",
    "подписка",
    "subscribe",
    "follow",
    "instagram",
    "cursor",
    "курсор",
    "cta",
    "мокап",
    "mockup",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 4,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "name": {
      "default": "Артём Хиса",
      "description": "Имя в профиле (Benzin)",
      "type": "string"
     },
     "handle": {
      "default": "@hisa.ai",
      "description": "Ник под именем",
      "type": "string"
     },
     "bio": {
      "default": "Нейросети, автоматизации и ИИ-агенты для бизнеса. Разбираю на практике.",
      "description": "Описание профиля, 2–3 строки",
      "type": "string"
     },
     "posts": {
      "default": "248",
      "description": "Число постов (текстом)",
      "type": "string"
     },
     "followers": {
      "default": "52,4 тыс.",
      "description": "Число подписчиков (текстом)",
      "type": "string"
     },
     "following": {
      "default": "312",
      "description": "Число подписок (текстом)",
      "type": "string"
     },
     "src": {
      "default": "",
      "description": "Аватар профиля: URL, путь к файлу или имя из public. Пусто — нейтральный силуэт (фото людей в паке нет)",
      "type": "string"
     },
     "startSec": {
      "default": 0.1,
      "description": "Появление карточки профиля, сек",
      "type": "number",
      "minimum": 0
     },
     "clickSec": {
      "default": 1.6,
      "description": "Момент клика курсора по «Подписаться», сек от начала",
      "type": "number",
      "minimum": 0.3
     },
     "followText": {
      "default": "Подписаться",
      "description": "Текст кнопки до клика",
      "type": "string"
     },
     "doneText": {
      "default": "✓ Подписан",
      "description": "Текст кнопки после клика",
      "type": "string"
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "name": "Артём Хиса",
    "handle": "@hisa.ai",
    "bio": "Нейросети, автоматизации и ИИ-агенты для бизнеса. Разбираю на практике.",
    "posts": "248",
    "followers": "52,4 тыс.",
    "following": "312",
    "src": "",
    "startSec": 0.1,
    "clickSec": 1.6,
    "followText": "Подписаться",
    "doneText": "✓ Подписан",
    "background": true,
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-profile.mp4",
    "poster": "previews/motion/glass-profile.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 4
   }
  },
  {
   "kind": "motion",
   "id": "glass-cta",
   "pack": "glass",
   "title": "Glass CTA",
   "description": "Финальный призыв (call to action): строки оффера по словам, под ними мокап поля комментария — курсор кликает, печатается кодовое слово (с блеском), курсор жмёт «Опубликовать». Для «напиши слово в комментарии, пришлю гайд».",
   "category": "scenes",
   "tags": [
    "cta",
    "призыв",
    "call to action",
    "комментарий",
    "comment",
    "кодовое слово",
    "codeword",
    "финал",
    "outro",
    "cursor",
    "курсор",
    "печать",
    "typing",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 5,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "lines": {
      "default": [
       "Хочешь такого же агента?",
       "Напиши в комментариях *АГЕНТ*"
      ],
      "description": "Строки оффера сверху вниз; слова по одному появляются blur-in; слово в *звёздочках* — акцентным цветом (одно слово без пробелов)",
      "minItems": 1,
      "maxItems": 4,
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "codeword": {
      "default": "АГЕНТ",
      "description": "Кодовое слово, которое печатается в поле комментария",
      "type": "string"
     },
     "startSec": {
      "default": 0.15,
      "description": "Появление первого слова оффера, сек",
      "type": "number",
      "minimum": 0
     },
     "staggerSec": {
      "default": 0.12,
      "description": "Пауза между словами оффера, сек",
      "type": "number",
      "minimum": 0.02,
      "maximum": 1
     },
     "codewordSec": {
      "default": 1.8,
      "description": "Момент начала печати кодового слова (клик по полю), сек от начала",
      "type": "number",
      "minimum": 0.3
     },
     "typeSec": {
      "default": 0.5,
      "description": "Длительность печати кодового слова, сек",
      "type": "number",
      "minimum": 0.1,
      "maximum": 3
     },
     "placeholder": {
      "default": "Добавьте комментарий…",
      "description": "Подсказка в пустом поле",
      "type": "string"
     },
     "publishText": {
      "default": "Опубликовать",
      "description": "Текст кнопки отправки справа в поле",
      "type": "string"
     },
     "cursor": {
      "default": true,
      "description": "Курсор: клик по полю, затем клик «Опубликовать»",
      "type": "boolean"
     },
     "src": {
      "default": "",
      "description": "Аватар в поле комментария: URL, путь к файлу или имя из public. Пусто — нейтральный силуэт",
      "type": "string"
     },
     "size": {
      "default": 44,
      "description": "Кегль слов оффера, px при 1080p",
      "type": "number",
      "minimum": 24,
      "maximum": 80
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "lines": [
     "Хочешь такого же агента?",
     "Напиши в комментариях *АГЕНТ*"
    ],
    "codeword": "АГЕНТ",
    "startSec": 0.15,
    "staggerSec": 0.12,
    "codewordSec": 1.8,
    "typeSec": 0.5,
    "placeholder": "Добавьте комментарий…",
    "publishText": "Опубликовать",
    "cursor": true,
    "src": "",
    "size": 44,
    "background": true,
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-cta.mp4",
    "poster": "previews/motion/glass-cta.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-apple",
   "pack": "glass",
   "title": "Glass Apple UI",
   "description": "Apple-микроанимации интерфейса iOS (без звука): Pay → Face ID → галочка, тумблер, баннер уведомления, поле с печатью сообщения, замок, Dynamic Island. Стадии задаются секундами. Для «оплата прошла», «включил», «пришло уведомление», «готово».",
   "category": "overlays",
   "tags": [
    "apple",
    "ios",
    "iphone",
    "pay",
    "apple pay",
    "face id",
    "toggle",
    "тумблер",
    "notification",
    "уведомление",
    "keyboard",
    "клавиатура",
    "печать",
    "lock",
    "замок",
    "dynamic island",
    "остров",
    "оплата",
    "микроанимация",
    "glass"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 5,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "kind": {
      "default": "pay",
      "description": "Вид: pay — кнопка Pay → Face ID → галочка; toggle — тумблер iOS; notification — баннер уведомления сверху; keyboard — поле ввода с печатью; lock — замок; island — Dynamic Island",
      "type": "string",
      "enum": [
       "pay",
       "toggle",
       "notification",
       "keyboard",
       "lock",
       "island"
      ]
     },
     "stagesSec": {
      "default": [],
      "description": "Стадии, сек от начала. pay: [нажатие, Face ID, галочка] (по умолчанию 0,5 / 1,2 / 2,2); toggle: [включить, выключить?] (0,5); notification: [показ, уход?] (0,4 / 2,6); keyboard: [старт печати] (0,5); lock: [смена замка] (0,8); island: [раскрыть, свернуть?] (0,5 / 2,8). Пусто — значения по умолчанию",
      "maxItems": 4,
      "type": "array",
      "items": {
       "type": "number",
       "minimum": 0
      }
     },
     "startSec": {
      "default": 0,
      "description": "Появление элемента, сек",
      "type": "number",
      "minimum": 0
     },
     "label": {
      "default": "",
      "description": "pay: надпись на кнопке (по умолчанию «Pay»); lock: «open» — замок открывается, иначе закрывается",
      "type": "string"
     },
     "icon": {
      "default": "telegram",
      "description": "notification / island: иконка-плитка приложения (claude, openai, gemini, skill, anthropic, n8n, telegram, cursor, deepseek, supabase, mail, notion, lock…)",
      "type": "string"
     },
     "title": {
      "default": "Новое сообщение",
      "description": "notification: заголовок; island: основной текст",
      "type": "string"
     },
     "subtitle": {
      "default": "Ролик готов, можно забирать",
      "description": "notification: текст уведомления; island: подпись",
      "type": "string"
     },
     "text": {
      "default": "Привет! Как дела?",
      "description": "keyboard: печатаемый текст; island: основной текст (если title пуст)",
      "type": "string"
     },
     "big": {
      "default": false,
      "description": "notification: крупный баннер (иконка 130, кегль ×1,4)",
      "type": "boolean"
     },
     "cps": {
      "default": 14,
      "description": "keyboard: символов в секунду",
      "type": "number",
      "minimum": 2,
      "maximum": 40
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "kind": "pay",
    "stagesSec": [],
    "startSec": 0,
    "label": "",
    "icon": "telegram",
    "title": "Новое сообщение",
    "subtitle": "Ролик готов, можно забирать",
    "text": "Привет! Как дела?",
    "big": false,
    "cps": 14,
    "background": true,
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-apple.mp4",
    "poster": "previews/motion/glass-apple.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-nav",
   "pack": "glass",
   "title": "Glass Nav",
   "description": "Навигатор пунктов: ряд стеклянных чипов с номерами, словами или иконками; в заданные секунды активным становится следующий (лаймовая обводка, увеличение), прошлые притухают с точкой. Оверлей на весь ролик: «пункт 1 из 4», шаги, список инструментов.",
   "category": "overlays",
   "tags": [
    "nav",
    "навигатор",
    "chips",
    "чипы",
    "steps",
    "шаги",
    "progress",
    "пункты",
    "список",
    "tabs",
    "оглавление",
    "overlay",
    "оверлей",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": true,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 4,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "labels": {
      "default": [
       "1",
       "2",
       "3",
       "4"
      ],
      "description": "Подписи чипов слева направо: короткие (≤ 3 знака) — номер Benzin, длиннее — слово Inter в широком чипе. Число чипов = max(labels, icons)",
      "maxItems": 8,
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "icons": {
      "default": [],
      "description": "Иконки-плитки вместо подписей (claude, openai, n8n, telegram, notion, figma…); пусто — подписи",
      "maxItems": 8,
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "activeSec": {
      "default": [
       0.6,
       1.4,
       2.2,
       3
      ],
      "description": "Моменты, сек: на activeSec[i] активен i-й чип (лаймовая обводка, ×1,12), предыдущий притухает с лаймовой точкой; ряд появляется на activeSec[0]",
      "maxItems": 8,
      "type": "array",
      "items": {
       "type": "number",
       "minimum": 0
      }
     },
     "showSec": {
      "description": "Если задано — ряд въезжает раньше первого пункта, сек (без активного чипа)",
      "type": "number",
      "minimum": 0
     },
     "allSec": {
      "description": "Финал: все чипы загораются волной в этот момент, сек",
      "type": "number",
      "minimum": 0
     },
     "grow": {
      "default": false,
      "description": "true — чип въезжает на своём activeSec[i], стек копится",
      "type": "boolean"
     },
     "pos": {
      "default": "bottom",
      "description": "Ряд внизу или вверху кадра (в 9:16 — в safe zone: низ Y 1404, верх Y 286)",
      "type": "string",
      "enum": [
       "bottom",
       "top"
      ]
     },
     "background": {
      "default": false,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх основного видео",
      "type": "boolean"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "labels": [
     "1",
     "2",
     "3",
     "4"
    ],
    "icons": [],
    "activeSec": [
     0.6,
     1.4,
     2.2,
     3
    ],
    "grow": false,
    "pos": "bottom",
    "background": false,
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-nav.mp4",
    "poster": "previews/motion/glass-nav.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 4
   }
  },
  {
   "kind": "motion",
   "id": "glass-backdrop",
   "pack": "glass",
   "title": "Glass Backdrop",
   "description": "Смысловой второй план: наклонённый полупрозрачный слой на тёмном фоне — код, гигантский логотип, сетка Figma или мозаика стеклянных карточек, слегка размытый (глубина резкости), с переводом фокуса в нужные секунды: слой становится резким и ярче. Подложка под заголовок или основной слой.",
   "category": "backgrounds",
   "tags": [
    "backdrop",
    "второй план",
    "background",
    "фон",
    "depth of field",
    "dof",
    "глубина резкости",
    "code",
    "код",
    "logo",
    "логотип",
    "grid",
    "figma",
    "cards",
    "карточки",
    "3d",
    "tilt",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 5,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "kind": {
      "default": "code",
      "description": "Второй план: code — строки кода, logo — гигантская серая иконка, grid — сетка Figma с направляющими, cards — мозаика стеклянных карточек",
      "type": "string",
      "enum": [
       "code",
       "logo",
       "grid",
       "cards"
      ]
     },
     "text": {
      "default": "",
      "description": "code: строки кода через \\n (пусто — заглушка); grid: подпись фрейма (пусто — «Frame 1 · 1080 × 1920»)",
      "type": "string"
     },
     "icon": {
      "default": "claude",
      "description": "logo: иконка (claude, openai, n8n, terminal, skill, instagram, palmier, calendar; прочие — через glyph)",
      "type": "string"
     },
     "focusSec": {
      "default": [],
      "description": "Переводы фокуса, сек: на каждом слой переключается между размытым-тусклым и резким-ярким (первый — выход на резкость, второй — обратно…)",
      "maxItems": 6,
      "type": "array",
      "items": {
       "type": "number",
       "minimum": 0
      }
     },
     "focusDurSec": {
      "default": 0.45,
      "description": "Длительность перевода фокуса, сек",
      "type": "number",
      "minimum": 0.05,
      "maximum": 2
     },
     "startSec": {
      "default": 0,
      "description": "Появление слоя (проявление за 0,3 с), сек",
      "type": "number",
      "minimum": 0
     },
     "drift": {
      "default": true,
      "description": "Медленный дрейф слоя (sin)",
      "type": "boolean"
     },
     "background": {
      "default": true,
      "description": "Фон пака под слоем (сетка, свечение, зерно); false — прозрачный",
      "type": "boolean"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "kind": "code",
    "text": "",
    "icon": "claude",
    "focusSec": [],
    "focusDurSec": 0.45,
    "startSec": 0,
    "drift": true,
    "background": true,
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-backdrop.mp4",
    "poster": "previews/motion/glass-backdrop.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-avatar",
   "pack": "glass",
   "title": "Glass Avatar",
   "description": "Аватар ведущего поверх сцены: full — по пояс внизу кадра, pip — голова в HUD-боксе (LIVE, уголки, сканер). Входы scan / flash / rise, выходы glitch / drop, смена поз по секундам. Картинка src обязательна (без неё — нейтральный силуэт). Оверлей на часть ролика.",
   "category": "characters",
   "tags": [
    "avatar",
    "аватар",
    "ведущий",
    "host",
    "talking head",
    "говорящая голова",
    "pip",
    "picture in picture",
    "камера",
    "live",
    "scan",
    "glitch",
    "character",
    "персонаж",
    "overlay",
    "оверлей",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": true,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 5,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "src": {
      "default": "",
      "description": "Картинка аватара (PNG с прозрачным фоном по пояс/голова): URL, путь к файлу или имя из public. Пусто — нейтральный силуэт-плейсхолдер (фото людей в паке нет)",
      "type": "string"
     },
     "swaps": {
      "default": [],
      "description": "Смена позы: с момента atSec показывается другая картинка (короткий «подскок»)",
      "maxItems": 8,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "atSec": {
         "type": "number",
         "minimum": 0,
         "description": "Момент смены, сек"
        },
        "src": {
         "type": "string",
         "description": "Новая картинка (поза/эмоция), как src"
        }
       },
       "required": [
        "atSec",
        "src"
       ]
      }
     },
     "mode": {
      "default": "full",
      "description": "full — аватар по пояс внизу кадра; pip — голова в HUD-боксе (уголки, «LIVE», подпись, линия сканера) в левом нижнем углу",
      "type": "string",
      "enum": [
       "full",
       "pip"
      ]
     },
     "enter": {
      "default": "scan",
      "description": "Вход: scan — уголки защёлкиваются, срезы проявляются сверху вниз за лаймовой линией сканера с RGB-расслоением; flash — вспышка и пересвет ×1,04 → 1; rise — выезд из нижней линии пружиной",
      "type": "string",
      "enum": [
       "scan",
       "flash",
       "rise"
      ]
     },
     "exit": {
      "default": "glitch",
      "description": "Выход: glitch — срезы ±30 px и RGB-расслоение, гаснет; drop — уезжает вниз за линию",
      "type": "string",
      "enum": [
       "glitch",
       "drop"
      ]
     },
     "startSec": {
      "default": 0.3,
      "description": "Момент входа, сек",
      "type": "number",
      "minimum": 0
     },
     "endSec": {
      "default": 0,
      "description": "Момент ухода (выход заканчивается на нём), сек; 0 — держится до конца элемента",
      "type": "number",
      "minimum": 0
     },
     "height": {
      "default": 520,
      "description": "full: высота аватара, px при 1080p",
      "type": "number",
      "minimum": 200,
      "maximum": 1200
     },
     "pipSize": {
      "default": 220,
      "description": "pip: сторона бокса, px при 1080p",
      "type": "number",
      "minimum": 120,
      "maximum": 500
     },
     "label": {
      "default": "кам 02",
      "description": "pip: подпись под боксом, серая часть",
      "type": "string"
     },
     "name": {
      "default": "",
      "description": "pip: подпись под боксом, белая часть после «·» (имя), можно пусто",
      "type": "string"
     },
     "background": {
      "default": false,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "src": "",
    "swaps": [],
    "mode": "full",
    "enter": "scan",
    "exit": "glitch",
    "startSec": 0.3,
    "endSec": 0,
    "height": 520,
    "pipSize": 220,
    "label": "кам 02",
    "name": "",
    "background": false,
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-avatar.mp4",
    "poster": "previews/motion/glass-avatar.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-harness",
   "pack": "glass",
   "title": "Glass Harness",
   "description": "Схема «харнес агента»: ядро-модель и кольцо разъёмов, к которому модули (цикл, инструменты, контекст, права, субагенты) пристёгиваются ремнями с пряжкой. Режимы: split (одна модель → чат и Claude Code), rig (текст вход/выход, пустые разъёмы, кольцо-упряжь, панели деталей, банка «мозг в банке»), run (риг + терминал с логом агента), swap (разные харнесы вокруг одной модели), final (формула и пакеты во все модули). Для объяснений «что вокруг модели». Тяжёлая сцена, только рендер.",
   "category": "scenes",
   "tags": [
    "harness",
    "харнес",
    "agent",
    "агент",
    "модель",
    "model",
    "claude code",
    "codex",
    "cursor",
    "loop",
    "tools",
    "context",
    "permissions",
    "subagents",
    "diagram",
    "схема",
    "риг",
    "терминал",
    "explainer",
    "glass",
    "лайм"
   ],
   "tier": "cloud",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 23,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "mode": {
      "default": "rig",
      "description": "Режим: split — одна модель → чат и Claude Code рядом; rig — модель, текст вход/выход, пустые разъёмы, кольцо-упряжь и 5 панелей деталей; run — риг + терминал с логом агента; swap — разные харнесы вокруг одной модели; final — формула строками и пакеты во все модули",
      "type": "string",
      "enum": [
       "split",
       "rig",
       "run",
       "swap",
       "final"
      ]
     },
     "startSec": {
      "default": 0.2,
      "description": "Появление ядра/заголовка, сек",
      "type": "number",
      "minimum": 0
     },
     "staggerSec": {
      "default": 0.3,
      "description": "Пауза между словами headline (split) и lines (final), сек",
      "type": "number",
      "minimum": 0.02,
      "maximum": 2
     },
     "core": {
      "default": "модель",
      "description": "Подпись в ядре",
      "type": "string"
     },
     "coreIcon": {
      "default": "none",
      "description": "brain — мозг в ядре вместо пустого круга",
      "type": "string",
      "enum": [
       "none",
       "brain"
      ]
     },
     "ringLabel": {
      "default": "харнес",
      "description": "Надпись-пилюля на кольце-упряжи («харнес»); пусто — без надписи",
      "type": "string"
     },
     "rotDeg": {
      "default": 0,
      "description": "run/swap/final: начальный поворот кольца, градусы (чтобы модули стояли как в прошлой сцене)",
      "type": "number",
      "minimum": -720,
      "maximum": 720
     },
     "modules": {
      "default": [
       {
        "label": "цикл",
        "icon": "loop"
       },
       {
        "label": "инструменты",
        "icon": "tools"
       },
       {
        "label": "контекст",
        "icon": "context"
       },
       {
        "label": "права",
        "icon": "perms"
       },
       {
        "label": "субагенты",
        "icon": "agents"
       }
      ],
      "description": "Модули вокруг ядра (rig — по одному на фазу, run, final)",
      "minItems": 2,
      "maxItems": 7,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "label": {
         "type": "string",
         "description": "Подпись модуля у плитки (короткая, 1–2 слова)"
        },
        "icon": {
         "type": "string",
         "enum": [
          "loop",
          "tools",
          "context",
          "perms",
          "agents",
          "sandbox",
          "editor",
          "index",
          "rules",
          "file",
          "terminal",
          "globe",
          "chat",
          "cursor",
          "brain"
         ],
         "description": "Иконка плитки: loop, tools, context, perms, agents, sandbox, editor, index, rules, file, terminal, globe, chat, cursor, brain"
        }
       },
       "required": [
        "label",
        "icon"
       ]
      }
     },
     "headline": {
      "default": "одна и та же [модель]",
      "description": "split: заголовок. Слова через пробел; [слово] — рамка выделения, {слово} — акцентом",
      "type": "string"
     },
     "chat": {
      "default": {
       "title": "чат",
       "atSec": 1.4,
       "user": "почини тест",
       "reply": "Похоже, скидка считается дважды. Попробуйте поправить строку 42.",
       "replyAtSec": 2.2,
       "note": "ответил текстом"
      },
      "description": "split: левая панель — чат",
      "type": "object",
      "properties": {
       "title": {
        "default": "чат",
        "description": "Заголовок левой панели",
        "type": "string"
       },
       "atSec": {
        "default": 1.4,
        "description": "Панель и сообщение пользователя, сек",
        "type": "number",
        "minimum": 0
       },
       "user": {
        "default": "почини тест",
        "description": "Сообщение пользователя",
        "type": "string"
       },
       "reply": {
        "default": "Похоже, скидка считается дважды. Попробуйте поправить строку 42.",
        "description": "Ответ модели (набирается по словам за 1 с)",
        "type": "string"
       },
       "replyAtSec": {
        "default": 2.2,
        "description": "Ответ, сек",
        "type": "number",
        "minimum": 0
       },
       "note": {
        "default": "ответил текстом",
        "description": "Серая пометка внизу панели; пусто — без неё",
        "type": "string"
       }
      }
     },
     "work": {
      "default": {
       "title": "Claude Code",
       "icon": "claude",
       "atSec": 4,
       "items": [
        {
         "text": "пишет код",
         "sub": "Edit(cart.ts)",
         "atSec": 4.6
        },
        {
         "text": "гоняет тесты",
         "sub": "Bash(npm test)",
         "atSec": 5.6
        },
        {
         "text": "чинит ошибки",
         "sub": "24 passed",
         "atSec": 6.6
        }
       ]
      },
      "description": "split: правая панель — агент за работой",
      "type": "object",
      "properties": {
       "title": {
        "default": "Claude Code",
        "description": "Заголовок правой панели",
        "type": "string"
       },
       "icon": {
        "default": "claude",
        "description": "Иконка-логотип рядом с заголовком",
        "type": "string"
       },
       "atSec": {
        "default": 4,
        "description": "Панель, сек",
        "type": "number",
        "minimum": 0
       },
       "items": {
        "default": [
         {
          "text": "пишет код",
          "sub": "Edit(cart.ts)",
          "atSec": 4.6
         },
         {
          "text": "гоняет тесты",
          "sub": "Bash(npm test)",
          "atSec": 5.6
         },
         {
          "text": "чинит ошибки",
          "sub": "24 passed",
          "atSec": 6.6
         }
        ],
        "description": "Строки задач с крутилкой → галочкой (до 4)",
        "maxItems": 4,
        "type": "array",
        "items": {
         "type": "object",
         "properties": {
          "text": {
           "type": "string",
           "description": "Действие"
          },
          "sub": {
           "default": "",
           "description": "Моно-подпись («Edit(cart.ts)»)",
           "type": "string"
          },
          "atSec": {
           "type": "number",
           "minimum": 0,
           "description": "Строка, сек"
          }
         },
         "required": [
          "text",
          "atSec"
         ]
        }
       }
      }
     },
     "io": {
      "default": {
       "enabled": true,
       "text": "текст",
       "inSec": 0.9,
       "outSec": 2,
       "labels": true
      },
      "description": "rig: текст входит в модель и выходит",
      "type": "object",
      "properties": {
       "enabled": {
        "default": true,
        "description": "Показывать вход и выход текста",
        "type": "boolean"
       },
       "text": {
        "default": "текст",
        "description": "Надпись на летящем чипе",
        "type": "string"
       },
       "inSec": {
        "default": 0.9,
        "description": "Чип влетает в модель, сек",
        "type": "number",
        "minimum": 0
       },
       "outSec": {
        "default": 2,
        "description": "Чип вылетает, сек",
        "type": "number",
        "minimum": 0
       },
       "labels": {
        "default": true,
        "description": "Подписи «получает текст / возвращает текст» снизу (false — когда низ занят lacks)",
        "type": "boolean"
       }
      }
     },
     "jar": {
      "default": {
       "enabled": false,
       "atSec": 0.5
      },
      "description": "rig: банка с пузырьками вокруг ядра",
      "type": "object",
      "properties": {
       "enabled": {
        "default": false,
        "description": "Стеклянная банка вокруг ядра («мозг в банке»)",
        "type": "boolean"
       },
       "atSec": {
        "default": 0.5,
        "description": "Банка появляется, сек",
        "type": "number",
        "minimum": 0
       },
       "outSec": {
        "description": "Крышка слетает, сек (по умолчанию — ringSec)",
        "type": "number",
        "minimum": 0
       }
      }
     },
     "socketsSec": {
      "description": "rig: пустые разъёмы по кольцу (чего не хватает модели), сек; по умолчанию 3,3 с",
      "type": "number",
      "minimum": 0
     },
     "lacks": {
      "default": [
       {
        "text": "нет рук",
        "atSec": 3.6
       },
       {
        "text": "нет памяти",
        "atSec": 4.4
       },
       {
        "text": "нет доступа к компьютеру",
        "atSec": 5.2
       }
      ],
      "description": "rig: красные плашки «чего нет» (до 3), уходят на ringSec",
      "maxItems": 3,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "text": {
         "type": "string",
         "description": "«нет рук»"
        },
        "atSec": {
         "type": "number",
         "minimum": 0,
         "description": "Появление, сек"
        }
       },
       "required": [
        "text",
        "atSec"
       ]
      }
     },
     "ringSec": {
      "description": "rig: кольцо-упряжь замыкается, сек; по умолчанию 6 с",
      "type": "number",
      "minimum": 0
     },
     "phases": {
      "default": [
       {
        "turnSec": 6.6,
        "atSec": 7.4,
        "detail": "loop",
        "title": "цикл агента",
        "steps": [
         {
          "text": "думает",
          "atSec": 7.8,
          "sub": "",
          "icon": "file",
          "mode": "auto",
          "note": ""
         },
         {
          "text": "вызывает инструмент",
          "atSec": 8.5,
          "sub": "",
          "icon": "file",
          "mode": "auto",
          "note": ""
         },
         {
          "text": "смотрит результат",
          "atSec": 9.2,
          "sub": "",
          "icon": "file",
          "mode": "auto",
          "note": ""
         },
         {
          "text": "и снова думает",
          "atSec": 9.9,
          "sub": "",
          "icon": "file",
          "mode": "auto",
          "note": ""
         }
        ],
        "extraText": ""
       },
       {
        "turnSec": 10.6,
        "atSec": 11.2,
        "detail": "tools",
        "title": "инструменты",
        "steps": [
         {
          "text": "читать файлы",
          "atSec": 11.6,
          "sub": "Read",
          "icon": "file",
          "mode": "auto",
          "note": "src/cart.ts"
         },
         {
          "text": "запускать команды",
          "atSec": 12.2,
          "sub": "Bash",
          "icon": "terminal",
          "mode": "auto",
          "note": "npm test"
         },
         {
          "text": "искать в сети",
          "atSec": 12.8,
          "sub": "WebSearch",
          "icon": "globe",
          "mode": "auto",
          "note": "docs"
         }
        ],
        "extraText": ""
       },
       {
        "turnSec": 13.6,
        "atSec": 14.2,
        "detail": "context",
        "title": "контекст",
        "steps": [
         {
          "text": "инструкции проекта · CLAUDE.md",
          "atSec": 14.6,
          "sub": "",
          "icon": "file",
          "mode": "auto",
          "note": ""
         },
         {
          "text": "память между сессиями",
          "atSec": 15.2,
          "sub": "",
          "icon": "file",
          "mode": "auto",
          "note": ""
         },
         {
          "text": "длинная история → короткое резюме",
          "atSec": 15.8,
          "sub": "",
          "icon": "file",
          "mode": "auto",
          "note": ""
         }
        ],
        "extraSec": 16.2,
        "extraText": ""
       },
       {
        "turnSec": 16.9,
        "atSec": 17.5,
        "detail": "perms",
        "title": "права",
        "steps": [
         {
          "text": "читать, искать, тесты",
          "atSec": 17.9,
          "sub": "сам",
          "icon": "file",
          "mode": "auto",
          "note": "",
          "badgeSec": 18.3
         },
         {
          "text": "git push, удаление",
          "atSec": 18.5,
          "sub": "спросит",
          "icon": "file",
          "mode": "ask",
          "note": "",
          "badgeSec": 18.9
         }
        ],
        "extraSec": 19.5,
        "extraText": "Разрешить git push?"
       },
       {
        "turnSec": 20.4,
        "atSec": 21,
        "detail": "subagents",
        "title": "субагенты",
        "steps": [
         {
          "text": "поиск по коду",
          "atSec": 21.4,
          "sub": "explore",
          "icon": "file",
          "mode": "auto",
          "note": ""
         },
         {
          "text": "тесты",
          "atSec": 21.7,
          "sub": "test-runner",
          "icon": "file",
          "mode": "auto",
          "note": ""
         },
         {
          "text": "ревью",
          "atSec": 22,
          "sub": "reviewer",
          "icon": "file",
          "mode": "auto",
          "note": ""
         }
        ],
        "extraSec": 22.6,
        "extraText": ""
       }
      ],
      "description": "rig: фазы, по одной на модуль (порядок = порядок modules): модуль пристёгивается, снизу панель деталей",
      "maxItems": 7,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "turnSec": {
         "type": "number",
         "minimum": 0,
         "description": "Кольцо поворачивает пустой разъём вниз, предыдущая панель уходит (у первой фазы — риг уезжает вверх), сек"
        },
        "atSec": {
         "type": "number",
         "minimum": 0,
         "description": "Модуль пристёгивается ремнём, панель деталей въезжает, сек"
        },
        "detail": {
         "type": "string",
         "enum": [
          "loop",
          "tools",
          "context",
          "perms",
          "subagents"
         ],
         "description": "Панель: loop — цикл из 4 шагов, tools — строки инструментов, context — полоса контекста, perms — права + запрос, subagents — главный агент раздаёт подзадачи"
        },
        "title": {
         "type": "string",
         "description": "Заголовок панели"
        },
        "steps": {
         "minItems": 1,
         "maxItems": 5,
         "type": "array",
         "items": {
          "type": "object",
          "properties": {
           "text": {
            "type": "string",
            "description": "Текст шага/строки"
           },
           "atSec": {
            "type": "number",
            "minimum": 0,
            "description": "Появление, сек от начала элемента"
           },
           "sub": {
            "default": "",
            "description": "Вторая строка: tools — имя инструмента (Read, Bash), perms — текст бейджа («сам», «спросит»), subagents/split — подпись",
            "type": "string"
           },
           "icon": {
            "default": "file",
            "description": "tools: иконка строки",
            "type": "string",
            "enum": [
             "loop",
             "tools",
             "context",
             "perms",
             "agents",
             "sandbox",
             "editor",
             "index",
             "rules",
             "file",
             "terminal",
             "globe",
             "chat",
             "cursor",
             "brain"
            ]
           },
           "mode": {
            "default": "auto",
            "description": "perms: auto — лаймовый бейдж, ask — оранжевый «спросит»",
            "type": "string",
            "enum": [
             "auto",
             "ask"
            ]
           },
           "badgeSec": {
            "description": "perms: появление бейджа, сек (по умолчанию atSec + 0,13 с)",
            "type": "number",
            "minimum": 0
           },
           "note": {
            "default": "",
            "description": "tools: пример справа моно-шрифтом («src/cart.ts»)",
            "type": "string"
           }
          },
          "required": [
           "text",
           "atSec"
          ]
         },
         "description": "Шаги панели (loop — ровно 4, subagents — до 3)"
        },
        "extraSec": {
         "description": "context — сжатие истории; perms — всплывает запрос; subagents — пакеты разлетаются к помощникам, сек",
         "type": "number",
         "minimum": 0
        },
        "extraText": {
         "default": "",
         "description": "perms: текст всплывающего запроса",
         "type": "string"
        }
       },
       "required": [
        "turnSec",
        "atSec",
        "detail",
        "title",
        "steps"
       ]
      }
     },
     "log": {
      "default": [
       {
        "kind": "user",
        "text": "почини тест",
        "tool": "",
        "atSec": 1,
        "module": -1
       },
       {
        "kind": "tool",
        "text": "npm test",
        "tool": "Bash",
        "atSec": 2.3,
        "module": 1
       },
       {
        "kind": "err",
        "text": "✕ 1 failed · cart.test.ts",
        "tool": "",
        "atSec": 3.3,
        "module": -1
       },
       {
        "kind": "tool",
        "text": "src/cart.ts",
        "tool": "Read",
        "atSec": 4.2,
        "module": 1
       },
       {
        "kind": "think",
        "text": "скидка применяется дважды",
        "tool": "",
        "atSec": 5.1,
        "module": -1
       },
       {
        "kind": "tool",
        "text": "src/cart.ts:42",
        "tool": "Edit",
        "atSec": 6,
        "module": 3
       },
       {
        "kind": "tool",
        "text": "npm test",
        "tool": "Bash",
        "atSec": 6.9,
        "module": 1
       },
       {
        "kind": "ok",
        "text": "✓ 24 passed",
        "tool": "",
        "atSec": 7.9,
        "module": -1
       }
      ],
      "description": "run: лог агента в терминале; строки с module подсвечивают модуль и шлют пакет",
      "maxItems": 10,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "kind": {
         "type": "string",
         "enum": [
          "user",
          "tool",
          "think",
          "err",
          "ok"
         ],
         "description": "user — ввод пользователя (печатается), tool — вызов инструмента, think — мысль, err — ошибка (ядро краснеет), ok — успех (риг вспыхивает)"
        },
        "text": {
         "type": "string",
         "description": "Текст строки"
        },
        "tool": {
         "default": "",
         "description": "tool: имя инструмента (Bash, Read, Edit)",
         "type": "string"
        },
        "atSec": {
         "type": "number",
         "minimum": 0,
         "description": "Появление строки, сек"
        },
        "module": {
         "default": -1,
         "description": "Индекс модуля (с 0), который подсвечивается и получает пакет; -1 — никакой",
         "type": "integer",
         "minimum": -1,
         "maximum": 9007199254740991
        }
       },
       "required": [
        "kind",
        "text",
        "atSec"
       ]
      }
     },
     "badge": {
      "default": {
       "text": "0 вмешательств",
       "atSec": 8.8
      },
      "description": "run: лаймовый бейдж в шапке терминала",
      "type": "object",
      "properties": {
       "text": {
        "default": "0 вмешательств",
        "description": "Бейдж в шапке терминала; пусто — без бейджа",
        "type": "string"
       },
       "atSec": {
        "default": 8.8,
        "description": "Появление, сек",
        "type": "number",
        "minimum": 0
       }
      }
     },
     "shells": {
      "default": [
       {
        "name": "Claude Code",
        "icon": "claude",
        "atSec": 0.6,
        "modules": [
         {
          "label": "цикл",
          "icon": "loop"
         },
         {
          "label": "инструменты",
          "icon": "tools"
         },
         {
          "label": "контекст",
          "icon": "context"
         },
         {
          "label": "права",
          "icon": "perms"
         },
         {
          "label": "субагенты",
          "icon": "agents"
         }
        ]
       },
       {
        "name": "Codex",
        "icon": "openai",
        "atSec": 2.4,
        "modules": [
         {
          "label": "цикл",
          "icon": "loop"
         },
         {
          "label": "песочница",
          "icon": "sandbox"
         },
         {
          "label": "инструменты",
          "icon": "tools"
         },
         {
          "label": "AGENTS.md",
          "icon": "rules"
         }
        ]
       },
       {
        "name": "Cursor",
        "icon": "cursor",
        "atSec": 4.2,
        "modules": [
         {
          "label": "цикл",
          "icon": "loop"
         },
         {
          "label": "редактор",
          "icon": "editor"
         },
         {
          "label": "индекс кода",
          "icon": "index"
         },
         {
          "label": "правила",
          "icon": "rules"
         },
         {
          "label": "контекст",
          "icon": "context"
         }
        ]
       }
      ],
      "description": "swap: харнесы по очереди вокруг одной модели",
      "minItems": 1,
      "maxItems": 4,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "name": {
         "type": "string",
         "description": "Название харнеса («Claude Code», «Codex»)"
        },
        "icon": {
         "default": "claude",
         "description": "Имя иконки-логотипа (claude, openai, cursor, gemini …)",
         "type": "string"
        },
        "atSec": {
         "type": "number",
         "minimum": 0,
         "description": "Смена харнеса, сек"
        },
        "modules": {
         "minItems": 2,
         "maxItems": 7,
         "type": "array",
         "items": {
          "type": "object",
          "properties": {
           "label": {
            "type": "string",
            "description": "Подпись модуля у плитки (короткая, 1–2 слова)"
           },
           "icon": {
            "type": "string",
            "enum": [
             "loop",
             "tools",
             "context",
             "perms",
             "agents",
             "sandbox",
             "editor",
             "index",
             "rules",
             "file",
             "terminal",
             "globe",
             "chat",
             "cursor",
             "brain"
            ],
            "description": "Иконка плитки: loop, tools, context, perms, agents, sandbox, editor, index, rules, file, terminal, globe, chat, cursor, brain"
           }
          },
          "required": [
           "label",
           "icon"
          ]
         },
         "description": "Модули этого харнеса вокруг ядра"
        }
       },
       "required": [
        "name",
        "atSec",
        "modules"
       ]
      }
     },
     "notes": {
      "default": [
       {
        "text": "модель — одна",
        "atSec": 5.2,
        "accent": false
       },
       {
        "text": "результат — разный",
        "atSec": 6.2,
        "accent": true
       }
      ],
      "description": "swap: плашки-выводы снизу",
      "maxItems": 3,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "text": {
         "type": "string",
         "description": "Плашка снизу"
        },
        "atSec": {
         "type": "number",
         "minimum": 0,
         "description": "Появление, сек"
        },
        "accent": {
         "default": false,
         "description": "Лаймовая заливка",
         "type": "boolean"
        }
       },
       "required": [
        "text",
        "atSec"
       ]
      }
     },
     "lines": {
      "default": [
       "{агент} = модель + харнес",
       "модель думает",
       "харнес [действует]"
      ],
      "description": "final: формула строками; слова через пробел, [слово] — рамка выделения, {слово} — акцентом",
      "maxItems": 4,
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "pulsesSec": {
      "default": [
       1.6,
       2.4
      ],
      "description": "final: моменты, когда ядро пульсирует, сек",
      "maxItems": 6,
      "type": "array",
      "items": {
       "type": "number",
       "minimum": 0
      }
     },
     "fireSec": {
      "description": "final: пакеты улетают во все модули и кольцо вспыхивает, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "mode": "rig",
    "startSec": 0.2,
    "staggerSec": 0.3,
    "core": "модель",
    "coreIcon": "none",
    "ringLabel": "харнес",
    "rotDeg": 0,
    "modules": [
     {
      "label": "цикл",
      "icon": "loop"
     },
     {
      "label": "инструменты",
      "icon": "tools"
     },
     {
      "label": "контекст",
      "icon": "context"
     },
     {
      "label": "права",
      "icon": "perms"
     },
     {
      "label": "субагенты",
      "icon": "agents"
     }
    ],
    "headline": "одна и та же [модель]",
    "chat": {
     "title": "чат",
     "atSec": 1.4,
     "user": "почини тест",
     "reply": "Похоже, скидка считается дважды. Попробуйте поправить строку 42.",
     "replyAtSec": 2.2,
     "note": "ответил текстом"
    },
    "work": {
     "title": "Claude Code",
     "icon": "claude",
     "atSec": 4,
     "items": [
      {
       "text": "пишет код",
       "sub": "Edit(cart.ts)",
       "atSec": 4.6
      },
      {
       "text": "гоняет тесты",
       "sub": "Bash(npm test)",
       "atSec": 5.6
      },
      {
       "text": "чинит ошибки",
       "sub": "24 passed",
       "atSec": 6.6
      }
     ]
    },
    "io": {
     "enabled": true,
     "text": "текст",
     "inSec": 0.9,
     "outSec": 2,
     "labels": true
    },
    "jar": {
     "enabled": false,
     "atSec": 0.5
    },
    "lacks": [
     {
      "text": "нет рук",
      "atSec": 3.6
     },
     {
      "text": "нет памяти",
      "atSec": 4.4
     },
     {
      "text": "нет доступа к компьютеру",
      "atSec": 5.2
     }
    ],
    "phases": [
     {
      "turnSec": 6.6,
      "atSec": 7.4,
      "detail": "loop",
      "title": "цикл агента",
      "steps": [
       {
        "text": "думает",
        "atSec": 7.8,
        "sub": "",
        "icon": "file",
        "mode": "auto",
        "note": ""
       },
       {
        "text": "вызывает инструмент",
        "atSec": 8.5,
        "sub": "",
        "icon": "file",
        "mode": "auto",
        "note": ""
       },
       {
        "text": "смотрит результат",
        "atSec": 9.2,
        "sub": "",
        "icon": "file",
        "mode": "auto",
        "note": ""
       },
       {
        "text": "и снова думает",
        "atSec": 9.9,
        "sub": "",
        "icon": "file",
        "mode": "auto",
        "note": ""
       }
      ],
      "extraText": ""
     },
     {
      "turnSec": 10.6,
      "atSec": 11.2,
      "detail": "tools",
      "title": "инструменты",
      "steps": [
       {
        "text": "читать файлы",
        "atSec": 11.6,
        "sub": "Read",
        "icon": "file",
        "mode": "auto",
        "note": "src/cart.ts"
       },
       {
        "text": "запускать команды",
        "atSec": 12.2,
        "sub": "Bash",
        "icon": "terminal",
        "mode": "auto",
        "note": "npm test"
       },
       {
        "text": "искать в сети",
        "atSec": 12.8,
        "sub": "WebSearch",
        "icon": "globe",
        "mode": "auto",
        "note": "docs"
       }
      ],
      "extraText": ""
     },
     {
      "turnSec": 13.6,
      "atSec": 14.2,
      "detail": "context",
      "title": "контекст",
      "steps": [
       {
        "text": "инструкции проекта · CLAUDE.md",
        "atSec": 14.6,
        "sub": "",
        "icon": "file",
        "mode": "auto",
        "note": ""
       },
       {
        "text": "память между сессиями",
        "atSec": 15.2,
        "sub": "",
        "icon": "file",
        "mode": "auto",
        "note": ""
       },
       {
        "text": "длинная история → короткое резюме",
        "atSec": 15.8,
        "sub": "",
        "icon": "file",
        "mode": "auto",
        "note": ""
       }
      ],
      "extraSec": 16.2,
      "extraText": ""
     },
     {
      "turnSec": 16.9,
      "atSec": 17.5,
      "detail": "perms",
      "title": "права",
      "steps": [
       {
        "text": "читать, искать, тесты",
        "atSec": 17.9,
        "sub": "сам",
        "icon": "file",
        "mode": "auto",
        "note": "",
        "badgeSec": 18.3
       },
       {
        "text": "git push, удаление",
        "atSec": 18.5,
        "sub": "спросит",
        "icon": "file",
        "mode": "ask",
        "note": "",
        "badgeSec": 18.9
       }
      ],
      "extraSec": 19.5,
      "extraText": "Разрешить git push?"
     },
     {
      "turnSec": 20.4,
      "atSec": 21,
      "detail": "subagents",
      "title": "субагенты",
      "steps": [
       {
        "text": "поиск по коду",
        "atSec": 21.4,
        "sub": "explore",
        "icon": "file",
        "mode": "auto",
        "note": ""
       },
       {
        "text": "тесты",
        "atSec": 21.7,
        "sub": "test-runner",
        "icon": "file",
        "mode": "auto",
        "note": ""
       },
       {
        "text": "ревью",
        "atSec": 22,
        "sub": "reviewer",
        "icon": "file",
        "mode": "auto",
        "note": ""
       }
      ],
      "extraSec": 22.6,
      "extraText": ""
     }
    ],
    "log": [
     {
      "kind": "user",
      "text": "почини тест",
      "tool": "",
      "atSec": 1,
      "module": -1
     },
     {
      "kind": "tool",
      "text": "npm test",
      "tool": "Bash",
      "atSec": 2.3,
      "module": 1
     },
     {
      "kind": "err",
      "text": "✕ 1 failed · cart.test.ts",
      "tool": "",
      "atSec": 3.3,
      "module": -1
     },
     {
      "kind": "tool",
      "text": "src/cart.ts",
      "tool": "Read",
      "atSec": 4.2,
      "module": 1
     },
     {
      "kind": "think",
      "text": "скидка применяется дважды",
      "tool": "",
      "atSec": 5.1,
      "module": -1
     },
     {
      "kind": "tool",
      "text": "src/cart.ts:42",
      "tool": "Edit",
      "atSec": 6,
      "module": 3
     },
     {
      "kind": "tool",
      "text": "npm test",
      "tool": "Bash",
      "atSec": 6.9,
      "module": 1
     },
     {
      "kind": "ok",
      "text": "✓ 24 passed",
      "tool": "",
      "atSec": 7.9,
      "module": -1
     }
    ],
    "badge": {
     "text": "0 вмешательств",
     "atSec": 8.8
    },
    "shells": [
     {
      "name": "Claude Code",
      "icon": "claude",
      "atSec": 0.6,
      "modules": [
       {
        "label": "цикл",
        "icon": "loop"
       },
       {
        "label": "инструменты",
        "icon": "tools"
       },
       {
        "label": "контекст",
        "icon": "context"
       },
       {
        "label": "права",
        "icon": "perms"
       },
       {
        "label": "субагенты",
        "icon": "agents"
       }
      ]
     },
     {
      "name": "Codex",
      "icon": "openai",
      "atSec": 2.4,
      "modules": [
       {
        "label": "цикл",
        "icon": "loop"
       },
       {
        "label": "песочница",
        "icon": "sandbox"
       },
       {
        "label": "инструменты",
        "icon": "tools"
       },
       {
        "label": "AGENTS.md",
        "icon": "rules"
       }
      ]
     },
     {
      "name": "Cursor",
      "icon": "cursor",
      "atSec": 4.2,
      "modules": [
       {
        "label": "цикл",
        "icon": "loop"
       },
       {
        "label": "редактор",
        "icon": "editor"
       },
       {
        "label": "индекс кода",
        "icon": "index"
       },
       {
        "label": "правила",
        "icon": "rules"
       },
       {
        "label": "контекст",
        "icon": "context"
       }
      ]
     }
    ],
    "notes": [
     {
      "text": "модель — одна",
      "atSec": 5.2,
      "accent": false
     },
     {
      "text": "результат — разный",
      "atSec": 6.2,
      "accent": true
     }
    ],
    "lines": [
     "{агент} = модель + харнес",
     "модель думает",
     "харнес [действует]"
    ],
    "pulsesSec": [
     1.6,
     2.4
    ],
    "background": true,
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-harness.mp4",
    "poster": "previews/motion/glass-harness.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-hud-frame",
   "pack": "glass",
   "title": "Glass HUD Frame",
   "description": "HUD-рамка поверх всего ролика: уголки рабочего поля, «● ЗАП» с таймкодом, «КАДР N / M», телеметрия камеры, нижняя строка «NN / MM — СЦЕНА» с чипом и бегущим временем, линия прогресса, боковые боксы с иконками, мини-карта и прицел, опциональное кольцо-таймер «ОСТАЛОСЬ». Кадр никогда не стоит. Слой на всю длину ролика, фон прозрачный.",
   "category": "overlays",
   "tags": [
    "hud",
    "рамка",
    "frame",
    "overlay",
    "оверлей",
    "телеметрия",
    "telemetry",
    "rec",
    "запись",
    "таймкод",
    "timecode",
    "прогресс",
    "progress",
    "уголки",
    "sci-fi",
    "таймер",
    "scene counter",
    "сцены",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": true,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 12,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "scenes": {
      "default": [
       {
        "label": "Вход",
        "chip": "",
        "startSec": 0,
        "icons": []
       },
       {
        "label": "Виджет",
        "chip": "Claude",
        "startSec": 3,
        "icons": [
         {
          "icon": "claude",
          "label": "Claude"
         },
         {
          "icon": "{ }",
          "label": "Код"
         }
        ]
       },
       {
        "label": "Терминал",
        "chip": "Запуск",
        "startSec": 6,
        "icons": [
         {
          "icon": "terminal",
          "label": "Shell"
         }
        ]
       },
       {
        "label": "Финал",
        "chip": "Готово",
        "startSec": 9,
        "icons": []
       }
      ],
      "description": "Сцены ролика по времени: смена сцены меняет нижнюю строку и боковую колонку. Одна сцена — статичная рамка",
      "minItems": 1,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "label": {
         "default": "Сцена",
         "description": "Имя сцены в нижней строке («NN / MM — ВХОД»), капсом; скрамблом на смене. ≤ 10 знаков",
         "type": "string"
        },
        "chip": {
         "default": "",
         "description": "Чип сцены по центру нижней строки (лаймовый квадрат + текст), ≤ 10 знаков; пусто — без чипа",
         "type": "string"
        },
        "startSec": {
         "default": 0,
         "description": "Начало сцены, сек: тут меняются номер, имя, чип, боковая колонка; телеметрия скачет вокруг смены",
         "type": "number",
         "minimum": 0
        },
        "icons": {
         "default": [],
         "description": "Боковые боксы слева (до 3); вместе с ними справа мини-карта и прицел. Только если контент сцены не залезает на края",
         "maxItems": 3,
         "type": "array",
         "items": {
          "type": "object",
          "properties": {
           "icon": {
            "default": "{ }",
            "description": "Символ моно («{ }», «</>», «◆◆») или имя иконки: claude, openai, n8n, terminal, skill, palmier, instagram, calendar",
            "type": "string"
           },
           "label": {
            "default": "",
            "description": "Подпись под боксом, скрамблом",
            "type": "string"
           }
          }
         }
        }
       }
      }
     },
     "sceneCount": {
      "default": 0,
      "description": "Своё «MM» в «NN / MM» (0 — число сцен из списка)",
      "type": "integer",
      "minimum": 0,
      "maximum": 99
     },
     "rec": {
      "default": true,
      "description": "«● ЗАП ЧЧ:ММ:СС:КК» слева сверху (точка мигает 1 Гц)",
      "type": "boolean"
     },
     "frame": {
      "default": true,
      "description": "«КАДР N / M» справа сверху — реальный кадр и длительность",
      "type": "boolean"
     },
     "tele": {
      "default": true,
      "description": "Телеметрия «КАМ X Z ОБЛЁТ °» (шум каждый кадр, скачок на смене сцены)",
      "type": "boolean"
     },
     "progress": {
      "default": true,
      "description": "Линия прогресса снизу с делениями на сменах сцен",
      "type": "boolean"
     },
     "side": {
      "default": true,
      "description": "Боковая колонка (боксы, мини-карта, прицел) на сценах с icons",
      "type": "boolean"
     },
     "handle": {
      "default": "",
      "description": "Ник по центру верхней строки (с логотипом Instagram), например «@vigent»; пусто — без ника, телеметрия поднимается в верхнюю строку",
      "type": "string"
     },
     "res": {
      "default": "",
      "description": "Текст справа снизу; пусто — «ширина×высота · 60 к/с» по размеру кадра",
      "type": "string"
     },
     "compact": {
      "default": false,
      "description": "Низ рамки поднят на 160 px — для вставок поверх съёмки",
      "type": "boolean"
     },
     "timer": {
      "default": false,
      "description": "Кольцо «ОСТАЛОСЬ» справа сверху: дуга убывает от timerFrom к timerTo",
      "type": "boolean"
     },
     "timerFrom": {
      "default": "",
      "description": "Старт отсчёта «ММ:СС»; пусто — длина отрезка timerStartSec…timerEndSec (реальное время)",
      "type": "string"
     },
     "timerTo": {
      "default": "00:00",
      "description": "Конец отсчёта «ММ:СС»",
      "type": "string"
     },
     "timerStartSec": {
      "default": 0,
      "description": "Начало отсчёта, сек (кольцо появляется тут)",
      "type": "number",
      "minimum": 0
     },
     "timerEndSec": {
      "default": 0,
      "description": "Конец отсчёта, сек; 0 — конец ролика",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": false,
      "description": "Фон пака (сетка, свечение); false — прозрачный, рамка поверх видео",
      "type": "boolean"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "scenes": [
     {
      "label": "Вход",
      "chip": "",
      "startSec": 0,
      "icons": []
     },
     {
      "label": "Виджет",
      "chip": "Claude",
      "startSec": 3,
      "icons": [
       {
        "icon": "claude",
        "label": "Claude"
       },
       {
        "icon": "{ }",
        "label": "Код"
       }
      ]
     },
     {
      "label": "Терминал",
      "chip": "Запуск",
      "startSec": 6,
      "icons": [
       {
        "icon": "terminal",
        "label": "Shell"
       }
      ]
     },
     {
      "label": "Финал",
      "chip": "Готово",
      "startSec": 9,
      "icons": []
     }
    ],
    "sceneCount": 0,
    "rec": true,
    "frame": true,
    "tele": true,
    "progress": true,
    "side": true,
    "handle": "",
    "res": "",
    "compact": false,
    "timer": false,
    "timerFrom": "",
    "timerTo": "00:00",
    "timerStartSec": 0,
    "timerEndSec": 0,
    "background": false,
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-hud-frame.mp4",
    "poster": "previews/motion/glass-hud-frame.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-timer",
   "pack": "glass",
   "title": "Glass Timer",
   "description": "Сквозной таймер-обратный отсчёт: лаймовая плита с текстом уходит ребром и превращается в кольцо «ОСТАЛОСЬ», кольцо по дуге улетает в угол, там тикает, возвращается в центр, доходит до 00:00 со вспышкой и морфится в финальную плиту. Любая часть цепочки отключается. Слой поверх ролика, фон прозрачный.",
   "category": "overlays",
   "tags": [
    "timer",
    "таймер",
    "countdown",
    "обратный отсчёт",
    "отсчёт",
    "кольцо",
    "ring",
    "dock",
    "плита",
    "slab",
    "осталось",
    "hud",
    "morph",
    "морф",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": true,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 10,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "fromMmss": {
      "default": "00:07",
      "description": "Старт отсчёта «ММ:СС». С undockSec отсчёт идёт до 00:01 к возвращению в центр, дальше стоит на 00:01 и на конце — 00:00",
      "type": "string"
     },
     "toMmss": {
      "default": "00:00",
      "description": "Конец отсчёта «ММ:СС» (без undockSec: значение на endSec)",
      "type": "string"
     },
     "atSec": {
      "default": 1,
      "description": "Момент кольца, сек: на нём плита уходит ребром и контур становится кольцом; без плиты кольцо растёт из точки",
      "type": "number",
      "minimum": 0
     },
     "slabText": {
      "default": "Спорим?",
      "description": "Плита Benzin перед кольцом (короткое слово, ≤ 820 px шириной); пусто — кольцо без плиты",
      "type": "string"
     },
     "slabAtSec": {
      "default": 0.2,
      "description": "Появление плиты, сек (должно быть раньше atSec)",
      "type": "number",
      "minimum": 0
     },
     "slabSize": {
      "default": 104,
      "description": "Кегль плиты, px при 1080p",
      "type": "number",
      "minimum": 40,
      "maximum": 200
     },
     "dockSec": {
      "description": "Момент перелёта кольца в угол (за 0,47 с по дуге, уменьшается, с двумя эхо-копиями); без поля кольцо остаётся в центре",
      "type": "number",
      "minimum": 0
     },
     "undockSec": {
      "description": "Момент возврата из угла в центр; после прилёта 00:01 держится 0,6 с, потом 00:00 лаймом со вспышкой",
      "type": "number",
      "minimum": 0
     },
     "endSec": {
      "description": "Момент 00:00, сек; по умолчанию — прилёт + 0,6 с (с undockSec) или конец ролика",
      "type": "number",
      "minimum": 0
     },
     "finalText": {
      "default": "Готово",
      "description": "Плита после 00:00: круг морфится в её контур, буквы штампом (только с undockSec); пусто — без финала",
      "type": "string"
     },
     "finalSize": {
      "default": 104,
      "description": "Кегль финальной плиты, px при 1080p",
      "type": "number",
      "minimum": 40,
      "maximum": 200
     },
     "flash": {
      "default": true,
      "description": "Лаймовая вспышка на 00:00 (только с undockSec)",
      "type": "boolean"
     },
     "posX": {
      "description": "Центр кольца по X, доля ширины кадра; по умолчанию 0,5",
      "type": "number",
      "minimum": 0,
      "maximum": 1
     },
     "posY": {
      "description": "Центр кольца по Y, доля высоты кадра; по умолчанию 0,34 в вертикальном кадре и 0,5 в горизонтальном",
      "type": "number",
      "minimum": 0,
      "maximum": 1
     },
     "radius": {
      "default": 150,
      "description": "Радиус кольца в центре, px при 1080p; в углу — 48",
      "type": "number",
      "minimum": 60,
      "maximum": 300
     },
     "background": {
      "default": false,
      "description": "Фон пака (сетка, свечение); false — прозрачный, таймер поверх видео",
      "type": "boolean"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "fromMmss": "00:07",
    "toMmss": "00:00",
    "atSec": 1,
    "slabText": "Спорим?",
    "slabAtSec": 0.2,
    "slabSize": 104,
    "finalText": "Готово",
    "finalSize": 104,
    "flash": true,
    "radius": 150,
    "background": false,
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-timer.mp4",
    "poster": "previews/motion/glass-timer.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-orb",
   "pack": "glass",
   "title": "Glass Orb",
   "description": "Сквозной лаймовый стеклянный шар, который ведёт глаз по ролику: схлопывается из кнопки-пилюли, летит по дуге, набирает свечение, раскрывается кольцом-ирисом, растекается в фоновый ореол, в финале становится кнопкой; может улетать в угол (dock) и возвращаться. Действия задаются списком с временем в секундах. Слой поверх ролика, фон прозрачный.",
   "category": "overlays",
   "tags": [
    "orb",
    "шар",
    "сфера",
    "sphere",
    "ball",
    "кнопка",
    "button",
    "ореол",
    "halo",
    "iris",
    "ирис",
    "свечение",
    "glow",
    "charge",
    "dock",
    "cta",
    "пилюля",
    "pill",
    "переход",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": true,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 10,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "steps": {
      "default": [
       {
        "do": "collapse",
        "atSec": 1.4,
        "from": {
         "x": 0.5,
         "y": 0.45
        },
        "text": "Запустить",
        "keep": false,
        "pillAtSec": 0.3,
        "opacity": 0.3
       },
       {
        "do": "fly",
        "atSec": 2.4,
        "to": {
         "x": 0.75,
         "y": 0.3
        },
        "text": "",
        "keep": false,
        "opacity": 0.3
       },
       {
        "do": "charge",
        "atSec": 3.3,
        "text": "",
        "keep": false,
        "opacity": 0.3
       },
       {
        "do": "iris",
        "atSec": 4.2,
        "text": "",
        "keep": false,
        "opacity": 0.3
       },
       {
        "do": "halo",
        "atSec": 4.4,
        "to": {
         "x": 0.5,
         "y": 0.4
        },
        "text": "",
        "keep": false,
        "opacity": 0.3
       },
       {
        "do": "button",
        "atSec": 7,
        "to": {
         "x": 0.5,
         "y": 0.7
        },
        "text": "Попробовать",
        "keep": false,
        "opacity": 0.3
       }
      ],
      "description": "Последовательность действий шара по времени (сек). Типичная: collapse → fly → charge → iris → halo → button; в углу — dock/undock. Координаты — доли кадра",
      "minItems": 1,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "do": {
         "default": "show",
         "description": "Действие: show — шар появляется; collapse — пилюля с text схлопывается в шар (без text — шар вылетает из точки); fly — перелёт по дуге в to; charge — набор свечения, шар растёт и пульсирует; iris — раскрытие: белая вспышка, толчок и расходящееся кольцо; halo — шар растекается в фоновый ореол (keep — остаётся шаром); button — шар растягивается в кнопку с text; hide — гаснет; dock — уменьшается до 40 px и улетает в угол (to — слот); undock — обратно в to",
         "type": "string",
         "enum": [
          "show",
          "collapse",
          "fly",
          "charge",
          "iris",
          "halo",
          "button",
          "hide",
          "dock",
          "undock"
         ]
        },
        "atSec": {
         "default": 0,
         "description": "Момент действия, сек. Для collapse — схлопывание; пилюля проявляется заранее (pillAtSec)",
         "type": "number",
         "minimum": 0
        },
        "from": {
         "description": "Стартовая позиция (show/collapse/fly); без неё — где шар был",
         "type": "object",
         "properties": {
          "x": {
           "default": 0.5,
           "description": "X, доля ширины кадра (0 — левый край, 1 — правый)",
           "type": "number",
           "minimum": -0.2,
           "maximum": 1.2
          },
          "y": {
           "default": 0.5,
           "description": "Y, доля высоты кадра (0 — верх, 1 — низ)",
           "type": "number",
           "minimum": -0.2,
           "maximum": 1.2
          }
         }
        },
        "to": {
         "description": "Конечная точка: fly/undock — куда лететь, dock — слот (по умолчанию угол), button — позиция кнопки, halo — куда дрейфует ореол, iris+keep — куда переезжает шар",
         "type": "object",
         "properties": {
          "x": {
           "default": 0.5,
           "description": "X, доля ширины кадра (0 — левый край, 1 — правый)",
           "type": "number",
           "minimum": -0.2,
           "maximum": 1.2
          },
          "y": {
           "default": 0.5,
           "description": "Y, доля высоты кадра (0 — верх, 1 — низ)",
           "type": "number",
           "minimum": -0.2,
           "maximum": 1.2
          }
         }
        },
        "text": {
         "default": "",
         "description": "Текст пилюли (collapse) или кнопки (button), Benzin",
         "type": "string"
        },
        "size": {
         "description": "Кегль текста, px при 1080p (по умолчанию 30 у пилюли, 34 у кнопки)",
         "type": "number",
         "minimum": 12,
         "maximum": 80
        },
        "w": {
         "description": "Ширина пилюли/кнопки, px при 1080p; по умолчанию по длине текста",
         "type": "number",
         "minimum": 40,
         "maximum": 1000
        },
        "h": {
         "description": "Высота пилюли/кнопки, px при 1080p (по умолчанию 84 / 100)",
         "type": "number",
         "minimum": 40,
         "maximum": 300
        },
        "durSec": {
         "description": "Длительность перелёта fly/dock/undock, сек (fly 0,55; dock/undock 0,47)",
         "type": "number",
         "minimum": 0.1,
         "maximum": 5
        },
        "arc": {
         "description": "Изгиб траектории, px при 1080p (по умолчанию 22 % длины пути, горкой вверх)",
         "type": "number",
         "minimum": -600,
         "maximum": 600
        },
        "scale": {
         "description": "Размер шара после действия (1 — исходный 56 px), меняется плавно за 0,27 с",
         "type": "number",
         "minimum": 0.2,
         "maximum": 4
        },
        "keep": {
         "default": false,
         "description": "iris/halo: шар остаётся на сцене — уменьшается до ~40 px и переезжает в to",
         "type": "boolean"
        },
        "pillAtSec": {
         "description": "collapse с text: появление пилюли, сек; по умолчанию за 0,9 с до atSec",
         "type": "number",
         "minimum": 0
        },
        "opacity": {
         "default": 0.3,
         "description": "halo: прозрачность фонового ореола после раздувания",
         "type": "number",
         "minimum": 0,
         "maximum": 1
        }
       }
      }
     },
     "background": {
      "default": false,
      "description": "Фон пака (сетка, свечение); false — прозрачный, шар поверх сцен и видео",
      "type": "boolean"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "steps": [
     {
      "do": "collapse",
      "atSec": 1.4,
      "from": {
       "x": 0.5,
       "y": 0.45
      },
      "text": "Запустить",
      "keep": false,
      "pillAtSec": 0.3,
      "opacity": 0.3
     },
     {
      "do": "fly",
      "atSec": 2.4,
      "to": {
       "x": 0.75,
       "y": 0.3
      },
      "text": "",
      "keep": false,
      "opacity": 0.3
     },
     {
      "do": "charge",
      "atSec": 3.3,
      "text": "",
      "keep": false,
      "opacity": 0.3
     },
     {
      "do": "iris",
      "atSec": 4.2,
      "text": "",
      "keep": false,
      "opacity": 0.3
     },
     {
      "do": "halo",
      "atSec": 4.4,
      "to": {
       "x": 0.5,
       "y": 0.4
      },
      "text": "",
      "keep": false,
      "opacity": 0.3
     },
     {
      "do": "button",
      "atSec": 7,
      "to": {
       "x": 0.5,
       "y": 0.7
      },
      "text": "Попробовать",
      "keep": false,
      "opacity": 0.3
     }
    ],
    "background": false,
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-orb.mp4",
    "poster": "previews/motion/glass-orb.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-line-chart",
   "pack": "glass",
   "title": "Glass Line Chart",
   "description": "Линейный график: линия рисуется, под ней лаймовая заливка, на конце светящаяся точка. Рост, динамика, тренд, «выросло с … до …».",
   "category": "data",
   "tags": [
    "line",
    "график",
    "линия",
    "рост",
    "тренд",
    "chart",
    "динамика",
    "метрика",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "title": {
      "default": "",
      "description": "Заголовок над панелью (Benzin, лайм); пусто — без него",
      "type": "string"
     },
     "chips": {
      "default": [],
      "description": "Чипы-вкладки над панелью («Было», «Стало», категории); пусто — без них",
      "maxItems": 5,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "text": {
         "type": "string",
         "description": "Текст чипа-вкладки"
        },
        "atSec": {
         "description": "Появление, сек (по умолчанию — со сдвигом 0,8 с на чип)",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "text"
       ]
      }
     },
     "values": {
      "default": [
       12,
       18,
       15,
       28,
       34,
       31,
       46
      ],
      "description": "Точки графика по порядку",
      "minItems": 2,
      "maxItems": 24,
      "type": "array",
      "items": {
       "type": "number"
      }
     },
     "labels": {
      "default": [],
      "description": "Подписи по оси X (по числу точек или меньше)",
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "color": {
      "default": "accent",
      "description": "Цвет линии: accent — лайм, warn — оранжевый, good — зелёный, muted — серый",
      "type": "string",
      "enum": [
       "accent",
       "warn",
       "good",
       "muted"
      ]
     },
     "big": {
      "default": false,
      "description": "Крупный вариант: высота 640 вместо 420, быстрее рисуется",
      "type": "boolean"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "title": "",
    "chips": [],
    "values": [
     12,
     18,
     15,
     28,
     34,
     31,
     46
    ],
    "labels": [],
    "color": "accent",
    "big": false,
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-line-chart.mp4",
    "poster": "previews/motion/glass-line-chart.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-bar-chart",
   "pack": "glass",
   "title": "Glass Bar Chart",
   "description": "Столбчатая диаграмма со стаггером: столбики растут по очереди, один подсвечен лаймом. Сравнение значений, рейтинг, «было / стало» по категориям.",
   "category": "data",
   "tags": [
    "bar",
    "столбцы",
    "диаграмма",
    "сравнение",
    "chart",
    "рейтинг",
    "категории",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "title": {
      "default": "",
      "description": "Заголовок над панелью (Benzin, лайм); пусто — без него",
      "type": "string"
     },
     "chips": {
      "default": [],
      "description": "Чипы-вкладки над панелью («Было», «Стало», категории); пусто — без них",
      "maxItems": 5,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "text": {
         "type": "string",
         "description": "Текст чипа-вкладки"
        },
        "atSec": {
         "description": "Появление, сек (по умолчанию — со сдвигом 0,8 с на чип)",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "text"
       ]
      }
     },
     "items": {
      "default": [
       {
        "label": "Пн",
        "value": 30,
        "highlight": false
       },
       {
        "label": "Вт",
        "value": 45,
        "highlight": false
       },
       {
        "label": "Ср",
        "value": 38,
        "highlight": false
       },
       {
        "label": "Чт",
        "value": 62,
        "highlight": false
       },
       {
        "label": "Пт",
        "value": 90,
        "highlight": true
       }
      ],
      "description": "Столбики слева направо; подсвечен первый с highlight, иначе последний",
      "minItems": 2,
      "maxItems": 10,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "label": {
         "type": "string",
         "description": "Подпись под столбиком"
        },
        "value": {
         "type": "number",
         "description": "Высота (относительная)"
        },
        "highlight": {
         "default": false,
         "description": "Подсветить лаймом",
         "type": "boolean"
        }
       },
       "required": [
        "label",
        "value"
       ]
      }
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "title": "",
    "chips": [],
    "items": [
     {
      "label": "Пн",
      "value": 30,
      "highlight": false
     },
     {
      "label": "Вт",
      "value": 45,
      "highlight": false
     },
     {
      "label": "Ср",
      "value": 38,
      "highlight": false
     },
     {
      "label": "Чт",
      "value": 62,
      "highlight": false
     },
     {
      "label": "Пт",
      "value": 90,
      "highlight": true
     }
    ],
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-bar-chart.mp4",
    "poster": "previews/motion/glass-bar-chart.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-donut-rings",
   "pack": "glass",
   "title": "Glass Donut Rings",
   "description": "Концентрические кольца-прогрессы с легендой: доли, загрузка, «сколько из ста», распределение по категориям.",
   "category": "data",
   "tags": [
    "donut",
    "кольца",
    "доли",
    "проценты",
    "круговая",
    "распределение",
    "progress ring",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "title": {
      "default": "",
      "description": "Заголовок над панелью (Benzin, лайм); пусто — без него",
      "type": "string"
     },
     "chips": {
      "default": [],
      "description": "Чипы-вкладки над панелью («Было», «Стало», категории); пусто — без них",
      "maxItems": 5,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "text": {
         "type": "string",
         "description": "Текст чипа-вкладки"
        },
        "atSec": {
         "description": "Появление, сек (по умолчанию — со сдвигом 0,8 с на чип)",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "text"
       ]
      }
     },
     "items": {
      "default": [
       {
        "label": "Готово",
        "value": 82
       },
       {
        "label": "В работе",
        "value": 55
       },
       {
        "label": "Ожидает",
        "value": 30
       }
      ],
      "description": "Кольца снаружи внутрь",
      "minItems": 1,
      "maxItems": 4,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "label": {
         "type": "string",
         "description": "Название в легенде"
        },
        "value": {
         "type": "number",
         "minimum": 0,
         "maximum": 100,
         "description": "Заполнение кольца, %"
        },
        "color": {
         "description": "Цвет кольца; по умолчанию чередуются",
         "type": "string",
         "enum": [
          "accent",
          "warn",
          "good",
          "muted"
         ]
        }
       },
       "required": [
        "label",
        "value"
       ]
      }
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "title": "",
    "chips": [],
    "items": [
     {
      "label": "Готово",
      "value": 82
     },
     {
      "label": "В работе",
      "value": 55
     },
     {
      "label": "Ожидает",
      "value": 30
     }
    ],
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-donut-rings.mp4",
    "poster": "previews/motion/glass-donut-rings.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-funnel",
   "pack": "glass",
   "title": "Glass Funnel",
   "description": "Воронка со ступенями и процентами: этапы конверсии, отсев, «из 1000 дошли до 40».",
   "category": "data",
   "tags": [
    "funnel",
    "воронка",
    "конверсия",
    "этапы",
    "ступени",
    "продажи",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "title": {
      "default": "",
      "description": "Заголовок над панелью (Benzin, лайм); пусто — без него",
      "type": "string"
     },
     "chips": {
      "default": [],
      "description": "Чипы-вкладки над панелью («Было», «Стало», категории); пусто — без них",
      "maxItems": 5,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "text": {
         "type": "string",
         "description": "Текст чипа-вкладки"
        },
        "atSec": {
         "description": "Появление, сек (по умолчанию — со сдвигом 0,8 с на чип)",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "text"
       ]
      }
     },
     "items": {
      "default": [
       {
        "label": "Показы",
        "value": 1000
       },
       {
        "label": "Клики",
        "value": 420
       },
       {
        "label": "Заявки",
        "value": 130
       },
       {
        "label": "Оплаты",
        "value": 40
       }
      ],
      "description": "Ступени сверху вниз",
      "minItems": 2,
      "maxItems": 6,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "label": {
         "type": "string",
         "description": "Название ступени"
        },
        "value": {
         "type": "number",
         "description": "Значение (первая — 100 %, остальные в долях от неё)"
        }
       },
       "required": [
        "label",
        "value"
       ]
      }
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "title": "",
    "chips": [],
    "items": [
     {
      "label": "Показы",
      "value": 1000
     },
     {
      "label": "Клики",
      "value": 420
     },
     {
      "label": "Заявки",
      "value": 130
     },
     {
      "label": "Оплаты",
      "value": 40
     }
    ],
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-funnel.mp4",
    "poster": "previews/motion/glass-funnel.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-dot-matrix",
   "pack": "glass",
   "title": "Glass Dot Matrix",
   "description": "Матрица точек: часть заполнена лаймом, часть — красным (сбой). Масштаб, «из N …», много однотипных единиц, успехи и ошибки.",
   "category": "data",
   "tags": [
    "dots",
    "точки",
    "матрица",
    "масштаб",
    "успех",
    "ошибки",
    "сетка",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "title": {
      "default": "",
      "description": "Заголовок над панелью (Benzin, лайм); пусто — без него",
      "type": "string"
     },
     "chips": {
      "default": [],
      "description": "Чипы-вкладки над панелью («Было», «Стало», категории); пусто — без них",
      "maxItems": 5,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "text": {
         "type": "string",
         "description": "Текст чипа-вкладки"
        },
        "atSec": {
         "description": "Появление, сек (по умолчанию — со сдвигом 0,8 с на чип)",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "text"
       ]
      }
     },
     "cols": {
      "default": 12,
      "description": "Колонок",
      "type": "integer",
      "minimum": 2,
      "maximum": 24
     },
     "rows": {
      "default": 8,
      "description": "Строк",
      "type": "integer",
      "minimum": 1,
      "maximum": 14
     },
     "ok": {
      "default": 40,
      "description": "Сколько точек загорается лаймом (остальные остаются тусклыми)",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
     },
     "fail": {
      "default": 0,
      "description": "Сколько точек помечается как сбой",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "title": "",
    "chips": [],
    "cols": 12,
    "rows": 8,
    "ok": 40,
    "fail": 0,
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-dot-matrix.mp4",
    "poster": "previews/motion/glass-dot-matrix.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-sparkline",
   "pack": "glass",
   "title": "Glass Sparkline",
   "description": "Спарклайн в стеклянной панели: тонкая линия тренда с подписью и значением. Компактный «пульс» метрики.",
   "category": "data",
   "tags": [
    "sparkline",
    "спарклайн",
    "тренд",
    "пульс",
    "мини-график",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "title": {
      "default": "",
      "description": "Заголовок над панелью (Benzin, лайм); пусто — без него",
      "type": "string"
     },
     "chips": {
      "default": [],
      "description": "Чипы-вкладки над панелью («Было», «Стало», категории); пусто — без них",
      "maxItems": 5,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "text": {
         "type": "string",
         "description": "Текст чипа-вкладки"
        },
        "atSec": {
         "description": "Появление, сек (по умолчанию — со сдвигом 0,8 с на чип)",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "text"
       ]
      }
     },
     "values": {
      "default": [
       5,
       8,
       6,
       11,
       9,
       14,
       13,
       19,
       17,
       24
      ],
      "description": "Точки линии",
      "minItems": 2,
      "maxItems": 40,
      "type": "array",
      "items": {
       "type": "number"
      }
     },
     "label": {
      "default": "Активность",
      "description": "Подпись метрики",
      "type": "string"
     },
     "value": {
      "default": "+24%",
      "description": "Крупное значение справа",
      "type": "string"
     },
     "color": {
      "default": "accent",
      "description": "Цвет линии",
      "type": "string",
      "enum": [
       "accent",
       "warn",
       "good",
       "muted"
      ]
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "title": "",
    "chips": [],
    "values": [
     5,
     8,
     6,
     11,
     9,
     14,
     13,
     19,
     17,
     24
    ],
    "label": "Активность",
    "value": "+24%",
    "color": "accent",
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-sparkline.mp4",
    "poster": "previews/motion/glass-sparkline.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-metric-tile",
   "pack": "glass",
   "title": "Glass Metric Tile",
   "description": "Плитки метрик: крупное число, подпись, дельта и мини-график. KPI, итоги, «показатель вырос на …». Одна плитка или две в ряд.",
   "category": "data",
   "tags": [
    "metric",
    "метрика",
    "kpi",
    "число",
    "плитка",
    "дельта",
    "статистика",
    "dashboard",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "title": {
      "default": "",
      "description": "Заголовок над панелью (Benzin, лайм); пусто — без него",
      "type": "string"
     },
     "chips": {
      "default": [],
      "description": "Чипы-вкладки над панелью («Было», «Стало», категории); пусто — без них",
      "maxItems": 5,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "text": {
         "type": "string",
         "description": "Текст чипа-вкладки"
        },
        "atSec": {
         "description": "Появление, сек (по умолчанию — со сдвигом 0,8 с на чип)",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "text"
       ]
      }
     },
     "tiles": {
      "default": [
       {
        "value": "87%",
        "label": "Готовность",
        "delta": "+12%",
        "spark": [
         3,
         5,
         4,
         7,
         9,
         12
        ],
        "up": true
       },
       {
        "value": "2,4 ч",
        "label": "Среднее время",
        "delta": "−18%",
        "spark": [
         12,
         10,
         11,
         8,
         7,
         6
        ],
        "up": true
       }
      ],
      "description": "Плитки (при ≥ 2 — в два столбца)",
      "minItems": 1,
      "maxItems": 4,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "value": {
         "type": "string",
         "description": "Крупное число или текст («2,4 ч», «87%»)"
        },
        "label": {
         "default": "",
         "description": "Подпись под числом",
         "type": "string"
        },
        "delta": {
         "description": "Дельта («+12%», «−3 мин»)",
         "type": "string"
        },
        "spark": {
         "description": "Точки мини-графика",
         "type": "array",
         "items": {
          "type": "number"
         }
        },
        "up": {
         "default": true,
         "description": "Дельта — рост (лайм) или падение (оранжевый)",
         "type": "boolean"
        },
        "atSec": {
         "description": "Появление, сек от начала (по умолчанию — по очереди с шагом ~0,17 с)",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "value"
       ]
      }
     },
     "big": {
      "default": false,
      "description": "Крупный вариант: одна плитка на всю ширину, крупнее",
      "type": "boolean"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "title": "",
    "chips": [],
    "tiles": [
     {
      "value": "87%",
      "label": "Готовность",
      "delta": "+12%",
      "spark": [
       3,
       5,
       4,
       7,
       9,
       12
      ],
      "up": true
     },
     {
      "value": "2,4 ч",
      "label": "Среднее время",
      "delta": "−18%",
      "spark": [
       12,
       10,
       11,
       8,
       7,
       6
      ],
      "up": true
     }
    ],
    "big": false,
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-metric-tile.mp4",
    "poster": "previews/motion/glass-metric-tile.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-status-table",
   "pack": "glass",
   "title": "Glass Status Table",
   "description": "Таблица задач со статусами «готово / ждёт / сбой»: список шагов, чеклист работы агента, ход процесса.",
   "category": "data",
   "tags": [
    "status",
    "таблица",
    "статус",
    "задачи",
    "чеклист",
    "готово",
    "список",
    "пайплайн",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "title": {
      "default": "Задачи",
      "description": "Заголовок внутри панели",
      "type": "string"
     },
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "rows": {
      "default": [
       {
        "label": "Сбор данных",
        "time": "0:12",
        "status": "ok"
       },
       {
        "label": "Анализ",
        "time": "0:41",
        "status": "ok"
       },
       {
        "label": "Отчёт",
        "time": "—",
        "status": "wait"
       }
      ],
      "description": "Строки сверху вниз",
      "minItems": 1,
      "maxItems": 8,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "label": {
         "type": "string",
         "description": "Название задачи"
        },
        "time": {
         "description": "Время («0:12»)",
         "type": "string"
        },
        "status": {
         "default": "ok",
         "description": "ok — готово, wait — ждёт, fail — сбой",
         "type": "string",
         "enum": [
          "ok",
          "wait",
          "fail"
         ]
        },
        "atSec": {
         "description": "Появление, сек от начала (по умолчанию — по очереди с шагом ~0,17 с)",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "label"
       ]
      }
     },
     "big": {
      "default": false,
      "description": "Крупный вариант: строки и кегль ×1,4",
      "type": "boolean"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "title": "Задачи",
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "rows": [
     {
      "label": "Сбор данных",
      "time": "0:12",
      "status": "ok"
     },
     {
      "label": "Анализ",
      "time": "0:41",
      "status": "ok"
     },
     {
      "label": "Отчёт",
      "time": "—",
      "status": "wait"
     }
    ],
    "big": false,
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-status-table.mp4",
    "poster": "previews/motion/glass-status-table.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-progress-list",
   "pack": "glass",
   "title": "Glass Progress List",
   "description": "Список строк с процентом и полосой прогресса: загрузка по навыкам, выполнение по пунктам, «на сколько готово».",
   "category": "data",
   "tags": [
    "progress",
    "прогресс",
    "полоса",
    "проценты",
    "загрузка",
    "навыки",
    "список",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "title": {
      "default": "Прогресс",
      "description": "Заголовок внутри панели",
      "type": "string"
     },
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "rows": {
      "default": [
       {
        "label": "Тексты",
        "value": 92,
        "color": "accent"
       },
       {
        "label": "Видео",
        "value": 64,
        "color": "accent"
       },
       {
        "label": "Звук",
        "value": 35,
        "color": "warn"
       }
      ],
      "description": "Строки сверху вниз",
      "minItems": 1,
      "maxItems": 7,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "label": {
         "type": "string",
         "description": "Название"
        },
        "value": {
         "type": "number",
         "minimum": 0,
         "maximum": 100,
         "description": "Процент"
        },
        "color": {
         "default": "accent",
         "description": "Цвет полосы",
         "type": "string",
         "enum": [
          "accent",
          "warn",
          "good"
         ]
        },
        "atSec": {
         "description": "Появление, сек от начала (по умолчанию — по очереди с шагом ~0,17 с)",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "label",
        "value"
       ]
      }
     },
     "big": {
      "default": false,
      "description": "Крупный вариант: строки крупнее",
      "type": "boolean"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "title": "Прогресс",
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "rows": [
     {
      "label": "Тексты",
      "value": 92,
      "color": "accent"
     },
     {
      "label": "Видео",
      "value": 64,
      "color": "accent"
     },
     {
      "label": "Звук",
      "value": 35,
      "color": "warn"
     }
    ],
    "big": false,
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-progress-list.mp4",
    "poster": "previews/motion/glass-progress-list.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-tab-chips",
   "pack": "glass",
   "title": "Glass Tab Chips",
   "description": "Ряд чипов-вкладок в стеклянной капсуле, активный подсвечивается лаймом по очереди. Категории, переключатели режимов, «варианты».",
   "category": "data",
   "tags": [
    "tabs",
    "чипы",
    "вкладки",
    "категории",
    "переключатель",
    "chips",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 4,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "title": {
      "default": "",
      "description": "Заголовок над панелью (Benzin, лайм); пусто — без него",
      "type": "string"
     },
     "items": {
      "default": [
       {
        "text": "Все"
       },
       {
        "text": "Видео"
       },
       {
        "text": "Тексты"
       },
       {
        "text": "Звук"
       }
      ],
      "description": "Чипы слева направо",
      "minItems": 2,
      "maxItems": 5,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "text": {
         "type": "string",
         "description": "Текст чипа"
        },
        "atSec": {
         "description": "Когда чип становится активным, сек (по умолчанию — по очереди каждые 0,83 с)",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "text"
       ]
      }
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "title": "",
    "items": [
     {
      "text": "Все"
     },
     {
      "text": "Видео"
     },
     {
      "text": "Тексты"
     },
     {
      "text": "Звук"
     }
    ],
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-tab-chips.mp4",
    "poster": "previews/motion/glass-tab-chips.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 4
   }
  },
  {
   "kind": "motion",
   "id": "glass-chat-mock",
   "pack": "glass",
   "title": "Glass Chat Mock",
   "description": "Мок чата: пузыри входящих и исходящих сообщений, вложения-файлы. Диалог с ботом/агентом, переписка, «написал — ответил».",
   "category": "data",
   "tags": [
    "chat",
    "чат",
    "диалог",
    "сообщения",
    "переписка",
    "бот",
    "telegram",
    "пузыри",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "title": {
      "default": "Чат",
      "description": "Заголовок чата в шапке панели",
      "type": "string"
     },
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "msgs": {
      "default": [
       {
        "text": "Собери отчёт за неделю",
        "side": "out"
       },
       {
        "text": "Готово, файл во вложении",
        "side": "in",
        "file": "report.pdf"
       },
       {
        "text": "Спасибо!",
        "side": "out"
       }
      ],
      "description": "Сообщения сверху вниз",
      "minItems": 1,
      "maxItems": 7,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "text": {
         "type": "string",
         "description": "Текст сообщения"
        },
        "side": {
         "default": "in",
         "description": "in — входящее (слева), out — исходящее (лайм, справа)",
         "type": "string",
         "enum": [
          "in",
          "out"
         ]
        },
        "file": {
         "description": "Имя вложенного файла",
         "type": "string"
        },
        "atSec": {
         "description": "Появление, сек от начала (по умолчанию — по очереди с шагом ~0,17 с)",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "text"
       ]
      }
     },
     "big": {
      "default": false,
      "description": "Крупный вариант: крупнее",
      "type": "boolean"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "title": "Чат",
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "msgs": [
     {
      "text": "Собери отчёт за неделю",
      "side": "out"
     },
     {
      "text": "Готово, файл во вложении",
      "side": "in",
      "file": "report.pdf"
     },
     {
      "text": "Спасибо!",
      "side": "out"
     }
    ],
    "big": false,
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-chat-mock.mp4",
    "poster": "previews/motion/glass-chat-mock.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-notif-stack",
   "pack": "glass",
   "title": "Glass Notification Stack",
   "description": "Стопка push-уведомлений с иконками приложений: приходят одно за другим. Сигналы, события, «пришло уведомление», оповещения агента.",
   "category": "data",
   "tags": [
    "notification",
    "уведомления",
    "push",
    "стопка",
    "сообщения",
    "оповещение",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "title": {
      "default": "",
      "description": "Заголовок над панелью (Benzin, лайм); пусто — без него",
      "type": "string"
     },
     "chips": {
      "default": [],
      "description": "Чипы-вкладки над панелью («Было», «Стало», категории); пусто — без них",
      "maxItems": 5,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "text": {
         "type": "string",
         "description": "Текст чипа-вкладки"
        },
        "atSec": {
         "description": "Появление, сек (по умолчанию — со сдвигом 0,8 с на чип)",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "text"
       ]
      }
     },
     "items": {
      "default": [
       {
        "title": "Telegram",
        "text": "Новая заявка на сайте",
        "icon": "telegram",
        "value": "сейчас"
       },
       {
        "title": "Почта",
        "text": "Отчёт готов",
        "icon": "mail",
        "value": "1 мин"
       },
       {
        "title": "Notion",
        "text": "Задача перенесена",
        "icon": "notion",
        "value": "5 мин"
       }
      ],
      "description": "Уведомления сверху вниз",
      "minItems": 1,
      "maxItems": 5,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "title": {
         "type": "string",
         "description": "Заголовок уведомления"
        },
        "text": {
         "default": "",
         "description": "Текст",
         "type": "string"
        },
        "icon": {
         "default": "telegram",
         "description": "Имя иконки: claude, openai, gemini, n8n, telegram, terminal, notion, figma, mail, sheet, brain, lock, user, file…",
         "type": "string"
        },
        "value": {
         "description": "Время/значение справа («сейчас»)",
         "type": "string"
        },
        "atSec": {
         "description": "Появление, сек от начала (по умолчанию — по очереди с шагом ~0,17 с)",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "title"
       ]
      }
     },
     "big": {
      "default": false,
      "description": "Крупный вариант: крупные карточки",
      "type": "boolean"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "title": "",
    "chips": [],
    "items": [
     {
      "title": "Telegram",
      "text": "Новая заявка на сайте",
      "icon": "telegram",
      "value": "сейчас"
     },
     {
      "title": "Почта",
      "text": "Отчёт готов",
      "icon": "mail",
      "value": "1 мин"
     },
     {
      "title": "Notion",
      "text": "Задача перенесена",
      "icon": "notion",
      "value": "5 мин"
     }
    ],
    "big": false,
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-notif-stack.mp4",
    "poster": "previews/motion/glass-notif-stack.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-node-graph",
   "pack": "glass",
   "title": "Glass Node Graph",
   "description": "Граф: центральный узел и лучи к узлам с иконками по кругу, по связям бегут пакеты. Экосистема, интеграции, «всё связано», агент и его инструменты.",
   "category": "data",
   "tags": [
    "graph",
    "граф",
    "узлы",
    "связи",
    "интеграции",
    "экосистема",
    "схема",
    "hub",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 7,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "center": {
      "default": {
       "text": "Агент",
       "icon": "brain"
      },
      "description": "Центр графа",
      "type": "object",
      "properties": {
       "text": {
        "default": "Агент",
        "description": "Подпись центрального узла",
        "type": "string"
       },
       "icon": {
        "default": "brain",
        "description": "Имя иконки: claude, openai, gemini, n8n, telegram, terminal, notion, figma, mail, sheet, brain, lock, user, file…",
        "type": "string"
       }
      }
     },
     "nodes": {
      "default": [
       {
        "text": "Почта",
        "icon": "mail"
       },
       {
        "text": "Таблицы",
        "icon": "sheet"
       },
       {
        "text": "Telegram",
        "icon": "telegram"
       },
       {
        "text": "Notion",
        "icon": "notion"
       }
      ],
      "description": "Узлы по кругу, начиная сверху",
      "minItems": 2,
      "maxItems": 8,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "text": {
         "type": "string",
         "description": "Подпись узла"
        },
        "icon": {
         "default": "file",
         "description": "Имя иконки: claude, openai, gemini, n8n, telegram, terminal, notion, figma, mail, sheet, brain, lock, user, file…",
         "type": "string"
        },
        "atSec": {
         "description": "Появление, сек от начала (по умолчанию — по очереди с шагом ~0,17 с)",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "text"
       ]
      }
     },
     "packets": {
      "default": "out",
      "description": "Пакеты на связях: out — от центра, in — к центру, off — без них",
      "type": "string",
      "enum": [
       "off",
       "out",
       "in"
      ]
     },
     "big": {
      "default": false,
      "description": "Крупный вариант: крупнее, меньше воздуха",
      "type": "boolean"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "center": {
     "text": "Агент",
     "icon": "brain"
    },
    "nodes": [
     {
      "text": "Почта",
      "icon": "mail"
     },
     {
      "text": "Таблицы",
      "icon": "sheet"
     },
     {
      "text": "Telegram",
      "icon": "telegram"
     },
     {
      "text": "Notion",
      "icon": "notion"
     }
    ],
    "packets": "out",
    "big": false,
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-node-graph.mp4",
    "poster": "previews/motion/glass-node-graph.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-tree-chart",
   "pack": "glass",
   "title": "Glass Tree Chart",
   "description": "Дерево: родитель сверху и дети в ряд на ответвлениях. Иерархия, «один → много», разветвление задачи на подзадачи.",
   "category": "data",
   "tags": [
    "tree",
    "дерево",
    "иерархия",
    "ветки",
    "структура",
    "разветвление",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "root": {
      "default": {
       "text": "Задача",
       "icon": "user"
      },
      "description": "Корень дерева",
      "type": "object",
      "properties": {
       "text": {
        "default": "Задача",
        "description": "Подпись корня",
        "type": "string"
       },
       "icon": {
        "default": "user",
        "description": "Имя иконки: claude, openai, gemini, n8n, telegram, terminal, notion, figma, mail, sheet, brain, lock, user, file…",
        "type": "string"
       }
      }
     },
     "children": {
      "default": [
       {
        "text": "Текст",
        "icon": "notion"
       },
       {
        "text": "Видео",
        "icon": "figma"
       },
       {
        "text": "Рассылка",
        "icon": "mail"
       }
      ],
      "description": "Дети слева направо",
      "minItems": 1,
      "maxItems": 5,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "text": {
         "type": "string",
         "description": "Подпись"
        },
        "icon": {
         "default": "file",
         "description": "Имя иконки: claude, openai, gemini, n8n, telegram, terminal, notion, figma, mail, sheet, brain, lock, user, file…",
         "type": "string"
        },
        "atSec": {
         "description": "Появление, сек от начала (по умолчанию — по очереди с шагом ~0,17 с)",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "text"
       ]
      }
     },
     "big": {
      "default": false,
      "description": "Крупный вариант: крупнее",
      "type": "boolean"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "root": {
     "text": "Задача",
     "icon": "user"
    },
    "children": [
     {
      "text": "Текст",
      "icon": "notion"
     },
     {
      "text": "Видео",
      "icon": "figma"
     },
     {
      "text": "Рассылка",
      "icon": "mail"
     }
    ],
    "big": false,
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-tree-chart.mp4",
    "poster": "previews/motion/glass-tree-chart.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-phone-mock",
   "pack": "glass",
   "title": "Glass Phone Mock",
   "description": "Мокап телефона с карточками, которые падают на экран. Приложение, «в телефоне», мобильный результат.",
   "category": "data",
   "tags": [
    "phone",
    "телефон",
    "мокап",
    "приложение",
    "mobile",
    "экран",
    "смартфон",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "title": {
      "default": "",
      "description": "Заголовок над панелью (Benzin, лайм); пусто — без него",
      "type": "string"
     },
     "chips": {
      "default": [],
      "description": "Чипы-вкладки над панелью («Было», «Стало», категории); пусто — без них",
      "maxItems": 5,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "text": {
         "type": "string",
         "description": "Текст чипа-вкладки"
        },
        "atSec": {
         "description": "Появление, сек (по умолчанию — со сдвигом 0,8 с на чип)",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "text"
       ]
      }
     },
     "cards": {
      "default": [
       {
        "label": "Заказ принят",
        "text": "Курьер выехал"
       },
       {
        "label": "Платёж",
        "text": "Успешно"
       },
       {
        "label": "Отзыв",
        "text": "5 из 5"
       }
      ],
      "description": "Карточки сверху вниз",
      "minItems": 1,
      "maxItems": 5,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "label": {
         "type": "string",
         "description": "Заголовок карточки"
        },
        "text": {
         "default": "",
         "description": "Подпись",
         "type": "string"
        },
        "atSec": {
         "description": "Появление, сек от начала (по умолчанию — по очереди с шагом ~0,17 с)",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "label"
       ]
      }
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "title": "",
    "chips": [],
    "cards": [
     {
      "label": "Заказ принят",
      "text": "Курьер выехал"
     },
     {
      "label": "Платёж",
      "text": "Успешно"
     },
     {
      "label": "Отзыв",
      "text": "5 из 5"
     }
    ],
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-phone-mock.mp4",
    "poster": "previews/motion/glass-phone-mock.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-card-grid",
   "pack": "glass",
   "title": "Glass Card Grid",
   "description": "Сетка карточек 2×N с иконкой, названием и подписью. Набор возможностей, каталог, «вот что внутри».",
   "category": "data",
   "tags": [
    "grid",
    "сетка",
    "карточки",
    "каталог",
    "возможности",
    "набор",
    "cards",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "title": {
      "default": "",
      "description": "Заголовок над панелью (Benzin, лайм); пусто — без него",
      "type": "string"
     },
     "chips": {
      "default": [],
      "description": "Чипы-вкладки над панелью («Было», «Стало», категории); пусто — без них",
      "maxItems": 5,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "text": {
         "type": "string",
         "description": "Текст чипа-вкладки"
        },
        "atSec": {
         "description": "Появление, сек (по умолчанию — со сдвигом 0,8 с на чип)",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "text"
       ]
      }
     },
     "items": {
      "default": [
       {
        "text": "Тексты",
        "sub": "посты и письма",
        "icon": "notion"
       },
       {
        "text": "Таблицы",
        "sub": "отчёты",
        "icon": "sheet"
       },
       {
        "text": "Почта",
        "sub": "рассылки",
        "icon": "mail"
       },
       {
        "text": "Дизайн",
        "sub": "макеты",
        "icon": "figma"
       }
      ],
      "description": "Карточки по две в ряд",
      "minItems": 2,
      "maxItems": 8,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "text": {
         "type": "string",
         "description": "Название"
        },
        "sub": {
         "description": "Подпись",
         "type": "string"
        },
        "icon": {
         "default": "file",
         "description": "Имя иконки: claude, openai, gemini, n8n, telegram, terminal, notion, figma, mail, sheet, brain, lock, user, file…",
         "type": "string"
        },
        "atSec": {
         "description": "Появление, сек от начала (по умолчанию — по очереди с шагом ~0,17 с)",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "text"
       ]
      }
     },
     "big": {
      "default": false,
      "description": "Крупный вариант: крупные карточки",
      "type": "boolean"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "title": "",
    "chips": [],
    "items": [
     {
      "text": "Тексты",
      "sub": "посты и письма",
      "icon": "notion"
     },
     {
      "text": "Таблицы",
      "sub": "отчёты",
      "icon": "sheet"
     },
     {
      "text": "Почта",
      "sub": "рассылки",
      "icon": "mail"
     },
     {
      "text": "Дизайн",
      "sub": "макеты",
      "icon": "figma"
     }
    ],
    "big": false,
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-card-grid.mp4",
    "poster": "previews/motion/glass-card-grid.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-link-chips",
   "pack": "glass",
   "title": "Glass Link Chips",
   "description": "Чипы-ссылки «название → домен» со стаггером. Источники, ресурсы, сервисы, «вот откуда взято».",
   "category": "data",
   "tags": [
    "links",
    "ссылки",
    "чипы",
    "источники",
    "сервисы",
    "домены",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "title": {
      "default": "",
      "description": "Заголовок над панелью (Benzin, лайм); пусто — без него",
      "type": "string"
     },
     "chips": {
      "default": [],
      "description": "Чипы-вкладки над панелью («Было», «Стало», категории); пусто — без них",
      "maxItems": 5,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "text": {
         "type": "string",
         "description": "Текст чипа-вкладки"
        },
        "atSec": {
         "description": "Появление, сек (по умолчанию — со сдвигом 0,8 с на чип)",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "text"
       ]
      }
     },
     "items": {
      "default": [
       {
        "text": "Документация",
        "sub": "docs.example.com",
        "icon": "notion"
       },
       {
        "text": "Таблица",
        "sub": "sheets.example.com",
        "icon": "sheet"
       },
       {
        "text": "Блог",
        "sub": "blog.example.com",
        "icon": "file"
       }
      ],
      "description": "Чипы сверху вниз",
      "minItems": 1,
      "maxItems": 8,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "text": {
         "type": "string",
         "description": "Название"
        },
        "sub": {
         "description": "Домен или подпись («example.com»)",
         "type": "string"
        },
        "icon": {
         "default": "file",
         "description": "Имя иконки: claude, openai, gemini, n8n, telegram, terminal, notion, figma, mail, sheet, brain, lock, user, file…",
         "type": "string"
        },
        "atSec": {
         "description": "Появление, сек от начала (по умолчанию — по очереди с шагом ~0,17 с)",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "text"
       ]
      }
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "title": "",
    "chips": [],
    "items": [
     {
      "text": "Документация",
      "sub": "docs.example.com",
      "icon": "notion"
     },
     {
      "text": "Таблица",
      "sub": "sheets.example.com",
      "icon": "sheet"
     },
     {
      "text": "Блог",
      "sub": "blog.example.com",
      "icon": "file"
     }
    ],
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-link-chips.mp4",
    "poster": "previews/motion/glass-link-chips.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-rating",
   "pack": "glass",
   "title": "Glass Rating",
   "description": "Рейтинг сегментами X из 10 по нескольким критериям. Оценки, «насколько хорошо», сравнение по параметрам.",
   "category": "data",
   "tags": [
    "rating",
    "рейтинг",
    "оценка",
    "сегменты",
    "баллы",
    "из 10",
    "критерии",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "title": {
      "default": "",
      "description": "Заголовок над панелью (Benzin, лайм); пусто — без него",
      "type": "string"
     },
     "chips": {
      "default": [],
      "description": "Чипы-вкладки над панелью («Было», «Стало», категории); пусто — без них",
      "maxItems": 5,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "text": {
         "type": "string",
         "description": "Текст чипа-вкладки"
        },
        "atSec": {
         "description": "Появление, сек (по умолчанию — со сдвигом 0,8 с на чип)",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "text"
       ]
      }
     },
     "rows": {
      "default": [
       {
        "label": "Скорость",
        "value": 9,
        "max": 10,
        "color": "accent"
       },
       {
        "label": "Качество",
        "value": 8,
        "max": 10,
        "color": "accent"
       },
       {
        "label": "Цена",
        "value": 5,
        "max": 10,
        "color": "warn"
       }
      ],
      "description": "Критерии сверху вниз",
      "minItems": 1,
      "maxItems": 5,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "label": {
         "type": "string",
         "description": "Критерий"
        },
        "value": {
         "type": "number",
         "minimum": 0,
         "description": "Оценка"
        },
        "max": {
         "default": 10,
         "description": "Максимум (число сегментов)",
         "type": "number",
         "minimum": 1,
         "maximum": 12
        },
        "color": {
         "default": "accent",
         "description": "Цвет сегментов",
         "type": "string",
         "enum": [
          "accent",
          "warn"
         ]
        },
        "atSec": {
         "description": "Появление, сек от начала (по умолчанию — по очереди с шагом ~0,17 с)",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "label",
        "value"
       ]
      }
     },
     "big": {
      "default": false,
      "description": "Крупный вариант: сегменты ×2",
      "type": "boolean"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "title": "",
    "chips": [],
    "rows": [
     {
      "label": "Скорость",
      "value": 9,
      "max": 10,
      "color": "accent"
     },
     {
      "label": "Качество",
      "value": 8,
      "max": 10,
      "color": "accent"
     },
     {
      "label": "Цена",
      "value": 5,
      "max": 10,
      "color": "warn"
     }
    ],
    "big": false,
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-rating.mp4",
    "poster": "previews/motion/glass-rating.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-code-card",
   "pack": "glass",
   "title": "Glass Code Card",
   "description": "Карточка кода с номерами строк: строки печатаются, ошибочные краснеют, исправление заменяет строку. Код, промпт, конфиг, «вот так выглядит».",
   "category": "data",
   "tags": [
    "code",
    "код",
    "карточка кода",
    "ошибка",
    "фикс",
    "terminal",
    "конфиг",
    "промпт",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "title": {
      "default": "main.py",
      "description": "Заголовок карточки (имя файла)",
      "type": "string"
     },
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "lines": {
      "default": [
       {
        "text": "def total(items):",
        "fail": false
       },
       {
        "text": "  return sum(items)",
        "fail": true,
        "fix": "  return sum(i.price for i in items)",
        "fixAtSec": 2.2
       },
       {
        "text": "print(total(cart))",
        "fail": false
       }
      ],
      "description": "Строки кода сверху вниз",
      "minItems": 1,
      "maxItems": 9,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "text": {
         "type": "string",
         "description": "Строка кода"
        },
        "fail": {
         "default": false,
         "description": "Строка с ошибкой (красная)",
         "type": "boolean"
        },
        "fix": {
         "description": "Чем заменить ошибочную строку",
         "type": "string"
        },
        "fixAtSec": {
         "description": "Когда заменить строку, сек",
         "type": "number",
         "minimum": 0
        },
        "atSec": {
         "description": "Появление, сек от начала (по умолчанию — по очереди с шагом ~0,17 с)",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "text"
       ]
      }
     },
     "shakeAtSec": {
      "description": "Момент тряски карточки (ошибка), сек",
      "type": "number",
      "minimum": 0
     },
     "lineNumbers": {
      "default": true,
      "description": "Номера строк",
      "type": "boolean"
     },
     "zoom": {
      "description": "Увеличение кегля (1–3); без него — обычный",
      "type": "number",
      "minimum": 1,
      "maximum": 3
     },
     "big": {
      "default": false,
      "description": "Крупный вариант: крупнее",
      "type": "boolean"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "title": "main.py",
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "lines": [
     {
      "text": "def total(items):",
      "fail": false
     },
     {
      "text": "  return sum(items)",
      "fail": true,
      "fix": "  return sum(i.price for i in items)",
      "fixAtSec": 2.2
     },
     {
      "text": "print(total(cart))",
      "fail": false
     }
    ],
    "lineNumbers": true,
    "big": false,
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-code-card.mp4",
    "poster": "previews/motion/glass-code-card.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-trash-bin",
   "pack": "glass",
   "title": "Glass Trash Bin",
   "description": "Корзина: элементы-плашки улетают в неё один за другим. Выбросить, убрать лишнее, «больше не нужно».",
   "category": "data",
   "tags": [
    "trash",
    "корзина",
    "удалить",
    "выбросить",
    "лишнее",
    "убрать",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "title": {
      "default": "",
      "description": "Заголовок над панелью (Benzin, лайм); пусто — без него",
      "type": "string"
     },
     "chips": {
      "default": [],
      "description": "Чипы-вкладки над панелью («Было», «Стало», категории); пусто — без них",
      "maxItems": 5,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "text": {
         "type": "string",
         "description": "Текст чипа-вкладки"
        },
        "atSec": {
         "description": "Появление, сек (по умолчанию — со сдвигом 0,8 с на чип)",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "text"
       ]
      }
     },
     "items": {
      "default": [
       {
        "text": "Рутина"
       },
       {
        "text": "Дубли"
       },
       {
        "text": "Ручной ввод"
       }
      ],
      "description": "Что выбрасываем",
      "minItems": 1,
      "maxItems": 6,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "text": {
         "type": "string",
         "description": "Текст плашки"
        },
        "atSec": {
         "description": "Когда улетает, сек (по умолчанию — по очереди каждые ~0,5 с)",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "text"
       ]
      }
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "title": "",
    "chips": [],
    "items": [
     {
      "text": "Рутина"
     },
     {
      "text": "Дубли"
     },
     {
      "text": "Ручной ввод"
     }
    ],
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-trash-bin.mp4",
    "poster": "previews/motion/glass-trash-bin.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-carousel-deck",
   "pack": "glass",
   "title": "Glass Carousel Deck",
   "description": "Колода слайдов карусели: листаются стопкой, нужные индексы подсвечиваются. Карусель, презентация, «ряд слайдов».",
   "category": "data",
   "tags": [
    "carousel",
    "карусель",
    "слайды",
    "колода",
    "презентация",
    "slides",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "highlights": {
      "default": [
       {
        "index": 2,
        "atSec": 2.5
       }
      ],
      "description": "Какие слайды подсветить лаймом и когда",
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "index": {
         "type": "integer",
         "minimum": 0,
         "maximum": 8,
         "description": "Номер слайда (с 0)"
        },
        "atSec": {
         "type": "number",
         "minimum": 0,
         "description": "Когда подсветить, сек"
        }
       },
       "required": [
        "index",
        "atSec"
       ]
      }
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "highlights": [
     {
      "index": 2,
      "atSec": 2.5
     }
    ],
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-carousel-deck.mp4",
    "poster": "previews/motion/glass-carousel-deck.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-layer-stack",
   "pack": "glass",
   "title": "Glass Layer Stack",
   "description": "Стопка слоёв архитектуры: плашки с названием, иконкой и чипами. Слои системы, стек технологий, «из чего состоит».",
   "category": "data",
   "tags": [
    "layers",
    "слои",
    "стек",
    "архитектура",
    "уровни",
    "stack",
    "уровень",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "layers": {
      "default": [
       {
        "label": "Интерфейс",
        "text": "где пользователь",
        "chips": [
         "Чат",
         "Сайт"
        ]
       },
       {
        "label": "Агент",
        "text": "думает и решает",
        "chips": [
         "Планы",
         "Память"
        ]
       },
       {
        "label": "Инструменты",
        "text": "что умеет делать",
        "chips": [
         "Почта",
         "Таблицы",
         "API"
        ]
       }
      ],
      "description": "Слои сверху вниз",
      "minItems": 2,
      "maxItems": 5,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "label": {
         "type": "string",
         "description": "Название слоя"
        },
        "text": {
         "description": "Подпись",
         "type": "string"
        },
        "icon": {
         "description": "Имя иконки: claude, openai, gemini, n8n, telegram, terminal, notion, figma, mail, sheet, brain, lock, user, file…",
         "type": "string"
        },
        "chips": {
         "default": [],
         "description": "Чипы внутри слоя",
         "type": "array",
         "items": {
          "type": "string"
         }
        },
        "atSec": {
         "description": "Появление, сек от начала (по умолчанию — по очереди с шагом ~0,17 с)",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "label"
       ]
      }
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "layers": [
     {
      "label": "Интерфейс",
      "text": "где пользователь",
      "chips": [
       "Чат",
       "Сайт"
      ]
     },
     {
      "label": "Агент",
      "text": "думает и решает",
      "chips": [
       "Планы",
       "Память"
      ]
     },
     {
      "label": "Инструменты",
      "text": "что умеет делать",
      "chips": [
       "Почта",
       "Таблицы",
       "API"
      ]
     }
    ],
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-layer-stack.mp4",
    "poster": "previews/motion/glass-layer-stack.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-compare",
   "pack": "glass",
   "title": "Glass Compare",
   "description": "Две колонки «плохо / хорошо»: слева серые минусы, справа лаймовые плюсы. Сравнение подходов, «раньше / теперь», мифы и правда.",
   "category": "data",
   "tags": [
    "compare",
    "сравнение",
    "плохо хорошо",
    "колонки",
    "до после",
    "versus",
    "vs",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "bad": {
      "default": {
       "title": "Раньше",
       "items": [
        {
         "text": "Вручную"
        },
        {
         "text": "Долго"
        },
        {
         "text": "Ошибки"
        }
       ]
      },
      "description": "Левая колонка (минусы)",
      "type": "object",
      "properties": {
       "title": {
        "default": "Раньше",
        "type": "string"
       },
       "items": {
        "default": [],
        "type": "array",
        "items": {
         "type": "object",
         "properties": {
          "text": {
           "type": "string"
          },
          "atSec": {
           "description": "Появление пункта, сек",
           "type": "number",
           "minimum": 0
          }
         },
         "required": [
          "text"
         ]
        }
       }
      }
     },
     "good": {
      "default": {
       "title": "Теперь",
       "items": [
        {
         "text": "Автоматически"
        },
        {
         "text": "Быстро"
        },
        {
         "text": "Без ошибок"
        }
       ]
      },
      "description": "Правая колонка (плюсы)",
      "type": "object",
      "properties": {
       "title": {
        "default": "Теперь",
        "type": "string"
       },
       "items": {
        "default": [],
        "type": "array",
        "items": {
         "type": "object",
         "properties": {
          "text": {
           "type": "string"
          },
          "atSec": {
           "description": "Появление пункта, сек",
           "type": "number",
           "minimum": 0
          }
         },
         "required": [
          "text"
         ]
        }
       }
      }
     },
     "shakeAtSec": {
      "description": "Момент тряски левой колонки, сек",
      "type": "number",
      "minimum": 0
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "bad": {
     "title": "Раньше",
     "items": [
      {
       "text": "Вручную"
      },
      {
       "text": "Долго"
      },
      {
       "text": "Ошибки"
      }
     ]
    },
    "good": {
     "title": "Теперь",
     "items": [
      {
       "text": "Автоматически"
      },
      {
       "text": "Быстро"
      },
      {
       "text": "Без ошибок"
      }
     ]
    },
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-compare.mp4",
    "poster": "previews/motion/glass-compare.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-clock",
   "pack": "glass",
   "title": "Glass Clock",
   "description": "Часы-таймлапс: цифры бегут от одного времени к другому, секундная стрелка крутится, задачи выпадают с галочками. «Пашет, пока спишь», «всю ночь», «за 8 часов».",
   "category": "data",
   "tags": [
    "clock",
    "часы",
    "время",
    "ночь",
    "таймлапс",
    "пока спишь",
    "пашет",
    "метафора",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 7,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "title": {
      "default": "",
      "description": "Заголовок над панелью (Benzin, лайм); пусто — без него",
      "type": "string"
     },
     "timeFrom": {
      "default": "23:00",
      "description": "Время в начале («23:00»)",
      "type": "string"
     },
     "timeTo": {
      "default": "07:00",
      "description": "Время в конце («07:00»)",
      "type": "string"
     },
     "label": {
      "default": "",
      "description": "Подпись под цифрами",
      "type": "string"
     },
     "tasks": {
      "default": [
       {
        "text": "Собрал отчёт"
       },
       {
        "text": "Ответил на письма"
       },
       {
        "text": "Обновил таблицу"
       }
      ],
      "description": "Задачи, которые выпадают под часами; стек перецентровывается",
      "maxItems": 5,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "text": {
         "type": "string",
         "description": "Задача"
        },
        "atSec": {
         "description": "Когда выпадает с галочкой, сек (по умолчанию — по очереди каждые ~0,67 с)",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "text"
       ]
      }
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "title": "",
    "timeFrom": "23:00",
    "timeTo": "07:00",
    "label": "",
    "tasks": [
     {
      "text": "Собрал отчёт"
     },
     {
      "text": "Ответил на письма"
     },
     {
      "text": "Обновил таблицу"
     }
    ],
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-clock.mp4",
    "poster": "previews/motion/glass-clock.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-scan",
   "pack": "glass",
   "title": "Glass Scan",
   "description": "Панель кода/строк, по ней ходит лаймовая скан-линия с glow: пройденная строка превращается из точки в галочку. «Проверяет», «сканирует», «прогоняет по списку».",
   "category": "data",
   "tags": [
    "scan",
    "сканирование",
    "проверка",
    "скан-линия",
    "аудит",
    "чек",
    "метафора",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "title": {
      "default": "",
      "description": "Заголовок над панелью (Benzin, лайм); пусто — без него",
      "type": "string"
     },
     "lines": {
      "default": [
       "Заголовки на месте",
       "Ссылки работают",
       "Картинки сжаты",
       "Тексты без ошибок",
       "Метаданные заполнены"
      ],
      "description": "Строки панели (≤ ~34 символов)",
      "minItems": 3,
      "maxItems": 8,
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "side": {
      "default": "проверено",
      "description": "Подпись справа под счётчиком «N/M»",
      "type": "string"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "title": "",
    "lines": [
     "Заголовки на месте",
     "Ссылки работают",
     "Картинки сжаты",
     "Тексты без ошибок",
     "Метаданные заполнены"
    ],
    "side": "проверено",
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-scan.mp4",
    "poster": "previews/motion/glass-scan.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-wave",
   "pack": "glass",
   "title": "Glass Wave",
   "description": "Волна-эквалайзер: столбики «звучат», сыгранная часть лаймовая. Голос, звук, музыка, озвучка, подкаст; с phone — внутри мокапа телефона.",
   "category": "data",
   "tags": [
    "wave",
    "волна",
    "звук",
    "голос",
    "эквалайзер",
    "аудио",
    "озвучка",
    "музыка",
    "метафора",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "title": {
      "default": "",
      "description": "Заголовок над панелью (Benzin, лайм); пусто — без него",
      "type": "string"
     },
     "bars": {
      "default": 32,
      "description": "Число столбиков (с phone — до 24)",
      "type": "integer",
      "minimum": 12,
      "maximum": 40
     },
     "chip": {
      "default": "",
      "description": "Чип-подпись под волной",
      "type": "string"
     },
     "phone": {
      "default": false,
      "description": "Внутри мокапа телефона",
      "type": "boolean"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "title": "",
    "bars": 32,
    "chip": "",
    "phone": false,
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-wave.mp4",
    "poster": "previews/motion/glass-wave.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-speed",
   "pack": "glass",
   "title": "Glass Speed",
   "description": "Две полосы: серая медленная и лаймовая быстрая, рядом крупное значение, за панелью летят полосы скорости. «В N раз быстрее», ускорение.",
   "category": "data",
   "tags": [
    "speed",
    "скорость",
    "быстрее",
    "ускорение",
    "в раз",
    "сравнение",
    "метафора",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "title": {
      "default": "",
      "description": "Заголовок над панелью (Benzin, лайм); пусто — без него",
      "type": "string"
     },
     "value": {
      "default": "8×",
      "description": "Крупное значение («8×»)",
      "type": "string"
     },
     "factor": {
      "default": 8,
      "description": "Во сколько раз медленная полоса дольше быстрой",
      "type": "number",
      "minimum": 1.5,
      "maximum": 50
     },
     "slow": {
      "default": {
       "label": "Вручную"
      },
      "description": "Медленная полоса",
      "type": "object",
      "properties": {
       "label": {
        "default": "Вручную",
        "type": "string"
       },
       "atSec": {
        "description": "Появление медленной полосы, сек",
        "type": "number",
        "minimum": 0
       }
      }
     },
     "fast": {
      "default": {
       "label": "С агентом"
      },
      "description": "Быстрая полоса",
      "type": "object",
      "properties": {
       "label": {
        "default": "С агентом",
        "type": "string"
       },
       "atSec": {
        "description": "Появление быстрой полосы, сек",
        "type": "number",
        "minimum": 0
       }
      }
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "title": "",
    "value": "8×",
    "factor": 8,
    "slow": {
     "label": "Вручную"
    },
    "fast": {
     "label": "С агентом"
    },
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-speed.mp4",
    "poster": "previews/motion/glass-speed.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-stack",
   "pack": "glass",
   "title": "Glass Stack Grow",
   "description": "Слева «1×», справа стопка плашек растёт вверх, сверху «N×», затем дышит бегущей волной. «В N раз больше», масштабирование, множитель.",
   "category": "data",
   "tags": [
    "stack",
    "стопка",
    "множитель",
    "больше",
    "масштаб",
    "в раз",
    "рост",
    "метафора",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "title": {
      "default": "",
      "description": "Заголовок над панелью (Benzin, лайм); пусто — без него",
      "type": "string"
     },
     "count": {
      "default": 8,
      "description": "Сколько плашек в стопке (и множитель N×)",
      "type": "integer",
      "minimum": 2,
      "maximum": 20
     },
     "label": {
      "default": "",
      "description": "Подпись под числом",
      "type": "string"
     },
     "growAtSec": {
      "description": "Когда стопка начинает расти, сек (по умолчанию ~0,4 с)",
      "type": "number",
      "minimum": 0
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "title": "",
    "count": 8,
    "label": "",
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-stack.mp4",
    "poster": "previews/motion/glass-stack.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-lens",
   "pack": "glass",
   "title": "Glass Lens",
   "description": "Сетка одинаковых карточек-шаблонов в 3D, по ней ползает линза с лаймовой кромкой, внутри — «живая» версия; в нужный момент линза раздувается в окно. «Шаблонно», «как под копирку», «присмотреться».",
   "category": "data",
   "tags": [
    "lens",
    "линза",
    "шаблон",
    "копирка",
    "увеличение",
    "присмотреться",
    "метафора",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 7,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "head": {
      "default": "AI-Powered Magic",
      "description": "Заголовок на карточках-шаблонах",
      "type": "string"
     },
     "texts": {
      "default": [
       "Мощное решение",
       "Новые возможности",
       "Всё в одном",
       "Быстрый старт",
       "Умный помощник",
       "Без забот"
      ],
      "description": "Тексты карточек (по кругу)",
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "altTexts": {
      "default": [
       "Ваш текст",
       "Свои слова",
       "Как есть"
      ],
      "description": "Тексты внутри линзы",
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "winAtSec": {
      "description": "Когда линза раздувается в окно, сек (по умолчанию ~3,3 с)",
      "type": "number",
      "minimum": 0
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "head": "AI-Powered Magic",
    "texts": [
     "Мощное решение",
     "Новые возможности",
     "Всё в одном",
     "Быстрый старт",
     "Умный помощник",
     "Без забот"
    ],
    "altTexts": [
     "Ваш текст",
     "Свои слова",
     "Как есть"
    ],
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-lens.mp4",
    "poster": "previews/motion/glass-lens.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-before-after",
   "pack": "glass",
   "title": "Glass Before/After",
   "description": "До/после: серый кривой макет и чистый с лаймом; лаймовая ручка едет слева направо и открывает «после». «Было → стало», «отшлифовать», «до и после».",
   "category": "data",
   "tags": [
    "before after",
    "до после",
    "было стало",
    "шлифовка",
    "улучшение",
    "слайдер",
    "метафора",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "heading": {
      "default": "Карточка товара",
      "description": "Заголовок макета",
      "type": "string"
     },
     "rows": {
      "default": [
       {
        "before": "ТОВАР!!! ДЕШЕВО",
        "after": "Беговые кроссовки"
       },
       {
        "before": "лучшая цена звоните",
        "after": "от 4 900 ₽"
       },
       {
        "before": "купить купить",
        "after": "В корзину"
       }
      ],
      "description": "Строки макета",
      "minItems": 2,
      "maxItems": 5,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "before": {
         "type": "string",
         "description": "Строка в кривой версии"
        },
        "after": {
         "type": "string",
         "description": "Строка в чистой версии"
        }
       },
       "required": [
        "before",
        "after"
       ]
      }
     },
     "labels": {
      "default": [
       "до",
       "после"
      ],
      "description": "Подписи [до, после]",
      "minItems": 2,
      "maxItems": 2,
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "atSec": {
      "description": "Когда ручка едет слева направо, сек (по умолчанию ~1,3 с)",
      "type": "number",
      "minimum": 0
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "heading": "Карточка товара",
    "rows": [
     {
      "before": "ТОВАР!!! ДЕШЕВО",
      "after": "Беговые кроссовки"
     },
     {
      "before": "лучшая цена звоните",
      "after": "от 4 900 ₽"
     },
     {
      "before": "купить купить",
      "after": "В корзину"
     }
    ],
    "labels": [
     "до",
     "после"
    ],
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-before-after.mp4",
    "poster": "previews/motion/glass-before-after.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-easing",
   "pack": "glass",
   "title": "Glass Easing",
   "description": "Две дорожки: ступеньки/линейно и ease-in-out с едущей иконкой; затем рисуется кривая easing против пунктирной прямой. «Плавно», «анимация», «не рывком», «ощущение».",
   "category": "data",
   "tags": [
    "easing",
    "плавно",
    "анимация",
    "кривая",
    "рывком",
    "движение",
    "метафора",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "icon": {
      "description": "Имя иконки: claude, openai, gemini, n8n, telegram, terminal, notion, figma, mail, sheet, brain, lock, user, file…",
      "type": "string"
     },
     "labels": {
      "default": [
       "рывком",
       "плавно"
      ],
      "description": "Подписи дорожек",
      "minItems": 2,
      "maxItems": 2,
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "curveAtSec": {
      "description": "Когда рисуется кривая, сек (по умолчанию ~2 с)",
      "type": "number",
      "minimum": 0
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "labels": [
     "рывком",
     "плавно"
    ],
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-easing.mp4",
    "poster": "previews/motion/glass-easing.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-pendulum",
   "pack": "glass",
   "title": "Glass Pendulum",
   "description": "Бирка на нитке качается и затихает, на ударе — лаймовая вспышка кромки; на ней крупное значение (цена). «Цена», «вишенка», «ценник», «акцент на числе».",
   "category": "data",
   "tags": [
    "pendulum",
    "маятник",
    "цена",
    "ценник",
    "бирка",
    "вишенка",
    "качается",
    "метафора",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "chips": {
      "default": [],
      "description": "Чипы-вкладки над панелью («Было», «Стало», категории); пусто — без них",
      "maxItems": 5,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "text": {
         "type": "string",
         "description": "Текст чипа-вкладки"
        },
        "atSec": {
         "description": "Появление, сек (по умолчанию — со сдвигом 0,8 с на чип)",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "text"
       ]
      }
     },
     "value": {
      "default": "990 ₽",
      "description": "Крупное значение на бирке (Benzin)",
      "type": "string"
     },
     "caption": {
      "default": "",
      "description": "Подпись над значением",
      "type": "string"
     },
     "sub": {
      "default": "",
      "description": "Лаймовый чип под значением",
      "type": "string"
     },
     "hitAtSec": {
      "description": "Момент удара (начало качания), сек (по умолчанию ~1,3 с)",
      "type": "number",
      "minimum": 0
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "chips": [],
    "value": "990 ₽",
    "caption": "",
    "sub": "",
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-pendulum.mp4",
    "poster": "previews/motion/glass-pendulum.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-film",
   "pack": "glass",
   "title": "Glass Film",
   "description": "Плёнка в перспективе едет влево, снизу вейвформа, на нужном моменте падает лаймовый плейхед с таймкодом. «Покадрово», «ролик», «монтаж», «таймлайн видео».",
   "category": "data",
   "tags": [
    "film",
    "плёнка",
    "монтаж",
    "ролик",
    "покадрово",
    "видео",
    "плейхед",
    "метафора",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "frames": {
      "default": [
       {
        "text": "кадр 1"
       },
       {
        "text": "кадр 2"
       },
       {
        "text": "кадр 3"
       }
      ],
      "description": "Кадры плёнки (по кругу)",
      "minItems": 1,
      "maxItems": 8,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "icon": {
         "description": "Имя иконки: claude, openai, gemini, n8n, telegram, terminal, notion, figma, mail, sheet, brain, lock, user, file…",
         "type": "string"
        },
        "text": {
         "description": "Подпись кадра",
         "type": "string"
        }
       }
      }
     },
     "src": {
      "description": "Картинка-подложка кадров: файл из public/ или http(s)-URL",
      "type": "string"
     },
     "mark": {
      "description": "Текст на плашке плейхеда вместо таймкода и номеров кадров (если цифр быть не должно); без него — таймкод. Плейхед падает через ~0,8 с",
      "type": "string"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "frames": [
     {
      "text": "кадр 1"
     },
     {
      "text": "кадр 2"
     },
     {
      "text": "кадр 3"
     }
    ],
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-film.mp4",
    "poster": "previews/motion/glass-film.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-browser",
   "pack": "glass",
   "title": "Glass Browser",
   "description": "Окно браузера: вкладки с иконками, URL, медленный скролл страницы, курсор летит к лаймовой кнопке и кликает. Сайт, сервис, «зайти на», регистрация.",
   "category": "data",
   "tags": [
    "browser",
    "браузер",
    "сайт",
    "сервис",
    "вкладки",
    "курсор",
    "клик",
    "веб",
    "метафора",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "tabs": {
      "default": [
       {
        "label": "Главная"
       },
       {
        "label": "Тарифы"
       }
      ],
      "description": "Вкладки",
      "minItems": 1,
      "maxItems": 3,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "icon": {
         "description": "Имя иконки: claude, openai, gemini, n8n, telegram, terminal, notion, figma, mail, sheet, brain, lock, user, file…",
         "type": "string"
        },
        "label": {
         "type": "string",
         "description": "Название вкладки"
        }
       },
       "required": [
        "label"
       ]
      }
     },
     "url": {
      "default": "app.example.com",
      "description": "Адрес в строке",
      "type": "string"
     },
     "src": {
      "description": "Скриншот страницы: файл из public/ или http(s)-URL; без него — заглушка из блоков",
      "type": "string"
     },
     "cta": {
      "default": "Попробовать",
      "description": "Текст лаймовой кнопки",
      "type": "string"
     },
     "clickAtSec": {
      "description": "Момент клика, сек (по умолчанию ~2,3 с)",
      "type": "number",
      "minimum": 0
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "tabs": [
     {
      "label": "Главная"
     },
     {
      "label": "Тарифы"
     }
    ],
    "url": "app.example.com",
    "cta": "Попробовать",
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-browser.mp4",
    "poster": "previews/motion/glass-browser.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-score",
   "pack": "glass",
   "title": "Glass Score",
   "description": "Партитура: дорожки с ромбами-событиями, плейхед идёт по кругу и зажигает ромбы; в нужный момент ромбы летят на камеру. «Ключевые кадры», «по дорожкам», «всё по нотам», многослойная синхронизация.",
   "category": "data",
   "tags": [
    "score",
    "партитура",
    "ключевые кадры",
    "дорожки",
    "ноты",
    "таймлайн",
    "синхронизация",
    "техно",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 7,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "labels": {
      "default": [
       "Текст",
       "Звук",
       "Камера",
       "Свет",
       "Эффекты"
      ],
      "description": "Названия дорожек сверху вниз",
      "minItems": 2,
      "maxItems": 6,
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "keys": {
      "default": [
       {
        "track": 0,
        "t": 0.3,
        "hollow": false
       },
       {
        "track": 1,
        "t": 0.9,
        "hollow": false
       },
       {
        "track": 2,
        "t": 1.5,
        "hollow": true
       },
       {
        "track": 3,
        "t": 2.2,
        "hollow": false
       },
       {
        "track": 4,
        "t": 2.9,
        "hollow": false
       },
       {
        "track": 0,
        "t": 3.5,
        "hollow": true
       },
       {
        "track": 2,
        "t": 4.1,
        "hollow": false
       }
      ],
      "description": "Ромбы-события: дорожка и позиция по оси",
      "minItems": 1,
      "maxItems": 24,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "track": {
         "type": "integer",
         "minimum": 0,
         "maximum": 5,
         "description": "Номер дорожки (с 0)"
        },
        "t": {
         "type": "number",
         "minimum": 0,
         "maximum": 5,
         "description": "Позиция на оси, 0–5 с"
        },
        "hollow": {
         "default": false,
         "description": "Пустой ромб (контур)",
         "type": "boolean"
        }
       },
       "required": [
        "track",
        "t"
       ]
      }
     },
     "hitAtSec": {
      "description": "Когда ромбы летят на камеру, сек (по умолчанию 5 с)",
      "type": "number",
      "minimum": 0
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "labels": [
     "Текст",
     "Звук",
     "Камера",
     "Свет",
     "Эффекты"
    ],
    "keys": [
     {
      "track": 0,
      "t": 0.3,
      "hollow": false
     },
     {
      "track": 1,
      "t": 0.9,
      "hollow": false
     },
     {
      "track": 2,
      "t": 1.5,
      "hollow": true
     },
     {
      "track": 3,
      "t": 2.2,
      "hollow": false
     },
     {
      "track": 4,
      "t": 2.9,
      "hollow": false
     },
     {
      "track": 0,
      "t": 3.5,
      "hollow": true
     },
     {
      "track": 2,
      "t": 4.1,
      "hollow": false
     }
    ],
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-score.mp4",
    "poster": "previews/motion/glass-score.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-frames",
   "pack": "glass",
   "title": "Glass Frames",
   "description": "Лента лаймовых кругов-кадров в перспективе и счётчик «КАДР N / M»; на финише появляется карточка готового файла с эхо-копиями. «Покадрово», «60 кадров в секунду», «готовый файл», рендер.",
   "category": "data",
   "tags": [
    "frames",
    "кадры",
    "покадрово",
    "рендер",
    "готовый файл",
    "fps",
    "видео",
    "техно",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "total": {
      "default": 3600,
      "description": "Всего кадров M (счётчик добегает к моменту карточки)",
      "type": "integer",
      "minimum": 10,
      "maximum": 99999
     },
     "file": {
      "default": "output.mp4",
      "description": "Имя файла на карточке",
      "type": "string"
     },
     "meta": {
      "default": "2:00 · 60 к/с · готово",
      "description": "Мета-строка карточки",
      "type": "string"
     },
     "fps": {
      "default": "60",
      "description": "Число «КАДР/С» на карточке",
      "type": "string"
     },
     "cardAtSec": {
      "description": "Когда появляется карточка файла, сек (по умолчанию ~3,3 с)",
      "type": "number",
      "minimum": 0
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "total": 3600,
    "file": "output.mp4",
    "meta": "2:00 · 60 к/с · готово",
    "fps": "60",
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-frames.mp4",
    "poster": "previews/motion/glass-frames.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-editor",
   "pack": "glass",
   "title": "Glass Editor",
   "description": "Мок таймлайна After Effects: слои с цветными барами и ключами, плейхед, панель свойств; в нужный момент всё зачёркивается пятью рукописными лаймовыми штрихами. «Таймлайн», «слои», «руками в редакторе», «зачеркнул».",
   "category": "data",
   "tags": [
    "editor",
    "редактор",
    "after effects",
    "таймлайн",
    "слои",
    "ключи",
    "зачёркивание",
    "монтаж",
    "техно",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "layers": {
      "default": [
       {
        "label": "Заголовок",
        "values": [
         10,
         40,
         75
        ]
       },
       {
        "label": "Фон",
        "values": [
         0,
         55
        ]
       },
       {
        "label": "Музыка",
        "values": [
         20,
         60,
         90
        ]
       },
       {
        "label": "Титры",
        "values": [
         30,
         85
        ]
       }
      ],
      "description": "Слои сверху вниз",
      "minItems": 2,
      "maxItems": 6,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "label": {
         "type": "string",
         "description": "Название слоя"
        },
        "values": {
         "description": "Ключи, % по бару",
         "type": "array",
         "items": {
          "type": "number",
          "minimum": 0,
          "maximum": 100
         }
        },
        "atSec": {
         "description": "Появление слоя, сек",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "label"
       ]
      }
     },
     "prop": {
      "default": "ПОЗИЦИЯ",
      "description": "Название свойства в панели свойств",
      "type": "string"
     },
     "strikeAtSec": {
      "description": "Когда рисуется зачёркивание, сек (по умолчанию 4 с)",
      "type": "number",
      "minimum": 0
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "layers": [
     {
      "label": "Заголовок",
      "values": [
       10,
       40,
       75
      ]
     },
     {
      "label": "Фон",
      "values": [
       0,
       55
      ]
     },
     {
      "label": "Музыка",
      "values": [
       20,
       60,
       90
      ]
     },
     {
      "label": "Титры",
      "values": [
       30,
       85
      ]
     }
    ],
    "prop": "ПОЗИЦИЯ",
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-editor.mp4",
    "poster": "previews/motion/glass-editor.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-prompt",
   "pack": "glass",
   "title": "Glass Prompt",
   "description": "Поле ввода чата: текст печатается, выделенные подстроки вылетают чипами #NN в полосу над полем, счётчик символов, кнопка «отправить». «Пишешь промпт», «говоришь модели», «ставишь задачу».",
   "category": "data",
   "tags": [
    "prompt",
    "промпт",
    "чат",
    "ввод",
    "печать",
    "задача модели",
    "чипы",
    "ai",
    "техно",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "title": {
      "default": "НОВЫЙ ЧАТ",
      "description": "Заголовок поля ввода (капсом, моно)",
      "type": "string"
     },
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "segs": {
      "default": [
       {
        "text": "Сделай обзор рынка "
       },
       {
        "text": "по трём конкурентам",
        "chip": "трём конкурентам"
       },
       {
        "text": " и собери выводы в таблицу"
       }
      ],
      "description": "Сегменты промпта подряд",
      "minItems": 1,
      "maxItems": 5,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "text": {
         "type": "string",
         "description": "Сегмент текста, который печатается"
        },
        "chip": {
         "description": "Подстрока сегмента: подсвечивается лаймом и вылетает чипом",
         "type": "string"
        },
        "atSec": {
         "description": "Когда начинается печать сегмента, сек (по умолчанию — сразу за предыдущим)",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "text"
       ]
      }
     },
     "max": {
      "description": "Максимум в счётчике «символов: N / M»",
      "type": "integer",
      "minimum": 10,
      "maximum": 9007199254740991
     },
     "sendAtSec": {
      "description": "Момент нажатия «отправить», сек",
      "type": "number",
      "minimum": 0
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "title": "НОВЫЙ ЧАТ",
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "segs": [
     {
      "text": "Сделай обзор рынка "
     },
     {
      "text": "по трём конкурентам",
      "chip": "трём конкурентам"
     },
     {
      "text": " и собери выводы в таблицу"
     }
    ],
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-prompt.mp4",
    "poster": "previews/motion/glass-prompt.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-lineart",
   "pack": "glass",
   "title": "Glass Lineart",
   "description": "Штриховые иллюстрации (1–4): линия рисуется, лаймовые акценты. Бытовые образы: стул, миска, часы, кружка, микрофон, ноутбук. «Бытовая метафора», «как стул», «чашка кофе».",
   "category": "data",
   "tags": [
    "lineart",
    "штрих",
    "иллюстрация",
    "стул",
    "лапша",
    "часы",
    "кружка",
    "микрофон",
    "ноутбук",
    "рисунок",
    "техно",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "items": {
      "default": [
       {
        "icon": "chair",
        "label": "Стул"
       },
       {
        "icon": "mug",
        "label": "Кружка"
       }
      ],
      "description": "Рисунки",
      "minItems": 1,
      "maxItems": 4,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "icon": {
         "default": "chair",
         "description": "Рисунок",
         "type": "string",
         "enum": [
          "chair",
          "bowl",
          "clock",
          "mug",
          "mic",
          "laptop"
         ]
        },
        "label": {
         "description": "Подпись под рисунком",
         "type": "string"
        },
        "atSec": {
         "description": "Когда рисуется, сек (по умолчанию — по очереди каждые 0,8 с)",
         "type": "number",
         "minimum": 0
        }
       }
      }
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "items": [
     {
      "icon": "chair",
      "label": "Стул"
     },
     {
      "icon": "mug",
      "label": "Кружка"
     }
    ],
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-lineart.mp4",
    "poster": "previews/motion/glass-lineart.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-shards",
   "pack": "glass",
   "title": "Glass Shards",
   "description": "Каркасные карточки в 3D-наклоне (2 колонки): слетаются из разброса и садятся, в заданный момент «взрыв» — разлетаются и садятся снова. «Карточки», «из частей», «собирается», «распадается».",
   "category": "data",
   "tags": [
    "shards",
    "осколки",
    "карточки",
    "собирается",
    "взрыв",
    "части",
    "3d",
    "техно",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "items": {
      "default": [
       {
        "label": "Идея",
        "sub": "черновик"
       },
       {
        "label": "Сценарий"
       },
       {
        "label": "Съёмка",
        "sub": "материал"
       },
       {
        "label": "Монтаж"
       }
      ],
      "description": "Карточки по две в ряд",
      "minItems": 2,
      "maxItems": 6,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "label": {
         "type": "string",
         "description": "Заголовок карточки"
        },
        "sub": {
         "description": "Подпись",
         "type": "string"
        },
        "atSec": {
         "description": "Когда слетается, сек (по умолчанию — по очереди каждые ~0,3 с)",
         "type": "number",
         "minimum": 0
        }
       },
       "required": [
        "label"
       ]
      }
     },
     "burstAtSec": {
      "description": "Момент «взрыва», сек; без него карточки просто садятся",
      "type": "number",
      "minimum": 0
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "items": [
     {
      "label": "Идея",
      "sub": "черновик"
     },
     {
      "label": "Сценарий"
     },
     {
      "label": "Съёмка",
      "sub": "материал"
     },
     {
      "label": "Монтаж"
     }
    ],
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-shards.mp4",
    "poster": "previews/motion/glass-shards.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "glass-logo-cubes",
   "pack": "glass",
   "title": "Glass Logo Cubes",
   "description": "Ряд кубиков с кодовыми символами, каждый переворачивается на 90° и показывает букву Benzin: название/бренд собирается из кода. До 7 букв.",
   "category": "data",
   "tags": [
    "logo",
    "кубики",
    "логотип",
    "бренд",
    "название",
    "из кода",
    "буквы",
    "техно",
    "виджет",
    "widget",
    "glass",
    "лайм"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 5,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "plane": {
      "default": "none",
      "description": "3D-плоскость: tilt — наклон, iso — изометрия со стопкой листов, floor — «лежит на полу», fan — веер. Лучше всего в 9:16; в горизонтальном кадре вписывается по высоте",
      "type": "string",
      "enum": [
       "none",
       "tilt",
       "iso",
       "floor",
       "fan"
      ]
     },
     "planeAtSec": {
      "default": 0.4,
      "description": "Когда панель ложится на плоскость, сек",
      "type": "number",
      "minimum": 0
     },
     "background": {
      "default": true,
      "description": "Фон пака (сетка, свечение, зерно); false — прозрачный, поверх видео",
      "type": "boolean"
     },
     "text": {
      "default": "VIGENT",
      "description": "Слово из кубиков (≤ 7 букв, переводится в капс)",
      "type": "string",
      "minLength": 1,
      "maxLength": 7
     },
     "caption": {
      "default": "",
      "description": "Подпись под кубиками",
      "type": "string"
     },
     "startSec": {
      "description": "Когда начинается переворот, сек (по умолчанию ~0,5 с)",
      "type": "number",
      "minimum": 0
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "plane": "none",
    "planeAtSec": 0.4,
    "background": true,
    "text": "VIGENT",
    "caption": "",
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/glass-logo-cubes.mp4",
    "poster": "previews/motion/glass-logo-cubes.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "cam-panel",
   "pack": "cam",
   "title": "Cam Panel",
   "description": "Стеклянная панель над говорящей головой со сменяющимися шагами: заголовок, счётчик, иконки, терминал, картинка, таблица статусов, граф, стопка из 2–3 блоков. Пояснение к речи в стиле cam-card; хорошо над карточкой cam-card.",
   "category": "cards",
   "tags": [
    "panel",
    "панель",
    "шаги",
    "steps",
    "title",
    "counter",
    "terminal",
    "graph",
    "status",
    "icons",
    "image",
    "stack",
    "talking head",
    "стекло",
    "cam",
    "overlay"
   ],
   "tier": "premium",
   "overlay": true,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 9,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "steps": {
      "default": [
       {
        "kind": "title",
        "atSec": 0,
        "text": "Агент собирает\nролик сам",
        "sub": "из сценария JSON",
        "icon": "claude"
       },
       {
        "kind": "counter",
        "atSec": 1.6,
        "value": 48,
        "decimals": 0,
        "suffix": "%",
        "label": "быстрее монтаж"
       },
       {
        "kind": "terminal",
        "atSec": 3.2,
        "title": "claude code",
        "lines": [
         {
          "kind": "cmd",
          "text": "vigent render timeline.json"
         },
         {
          "kind": "out",
          "text": "рендер 15 с…"
         },
         {
          "kind": "ok",
          "text": "готово: out/reel.mp4"
         }
        ]
       }
      ],
      "description": "Шаги панели по порядку; шаг сменяет предыдущий на своём atSec (секунды от начала элемента)",
      "minItems": 1,
      "type": "array",
      "items": {
       "anyOf": [
        {
         "oneOf": [
          {
           "type": "object",
           "properties": {
            "kind": {
             "type": "string",
             "const": "title"
            },
            "atSec": {
             "default": 0,
             "description": "Секунда входа шага от начала элемента",
             "type": "number",
             "minimum": 0
            },
            "text": {
             "type": "string",
             "description": "Заголовок капсом (Benzin); \\n — перенос"
            },
            "sub": {
             "description": "Подзаголовок",
             "type": "string"
            },
            "icon": {
             "description": "Иконка по имени: claude, openai, n8n, telegram, terminal, file, folder, brain, user, shield…",
             "type": "string"
            }
           },
           "required": [
            "kind",
            "text"
           ]
          },
          {
           "type": "object",
           "properties": {
            "kind": {
             "type": "string",
             "const": "counter"
            },
            "atSec": {
             "default": 0,
             "description": "Секунда входа шага",
             "type": "number",
             "minimum": 0
            },
            "value": {
             "type": "number",
             "description": "Конечное значение (докручивается за 0,9 с)"
            },
            "from": {
             "description": "Начальное значение, по умолчанию 0",
             "type": "number"
            },
            "decimals": {
             "default": 0,
             "description": "Знаков после запятой",
             "type": "integer",
             "minimum": 0,
             "maximum": 4
            },
            "prefix": {
             "description": "Перед числом: «$», «~»",
             "type": "string"
            },
            "suffix": {
             "description": "После числа лаймом: «%», «×», «k»",
             "type": "string"
            },
            "label": {
             "description": "Подпись под числом",
             "type": "string"
            },
            "icon": {
             "description": "Иконка по имени: claude, openai, n8n, telegram, terminal, file, folder, brain, user, shield…",
             "type": "string"
            }
           },
           "required": [
            "kind",
            "value"
           ]
          },
          {
           "type": "object",
           "properties": {
            "kind": {
             "type": "string",
             "const": "graph"
            },
            "atSec": {
             "default": 0,
             "description": "Секунда входа шага",
             "type": "number",
             "minimum": 0
            },
            "center": {
             "type": "object",
             "properties": {
              "text": {
               "type": "string"
              },
              "icon": {
               "description": "Иконка по имени: claude, openai, n8n, telegram, terminal, file, folder, brain, user, shield…",
               "type": "string"
              }
             },
             "required": [
              "text"
             ],
             "description": "Центральный узел"
            },
            "nodes": {
             "minItems": 1,
             "maxItems": 6,
             "type": "array",
             "items": {
              "type": "object",
              "properties": {
               "text": {
                "type": "string",
                "description": "Подпись"
               },
               "icon": {
                "description": "Иконка по имени: claude, openai, n8n, telegram, terminal, file, folder, brain, user, shield…",
                "type": "string"
               },
               "atSec": {
                "description": "Секунда появления элемента от начала элемента; пусто — по порядку с интервалом",
                "type": "number",
                "minimum": 0
               }
              },
              "required": [
               "text"
              ]
             },
             "description": "Узлы по кругу, появляются по очереди"
            }
           },
           "required": [
            "kind",
            "center",
            "nodes"
           ]
          },
          {
           "type": "object",
           "properties": {
            "kind": {
             "type": "string",
             "const": "status"
            },
            "atSec": {
             "default": 0,
             "description": "Секунда входа шага",
             "type": "number",
             "minimum": 0
            },
            "title": {
             "description": "Заголовок таблицы",
             "type": "string"
            },
            "rows": {
             "minItems": 1,
             "maxItems": 6,
             "type": "array",
             "items": {
              "type": "object",
              "properties": {
               "text": {
                "type": "string"
               },
               "status": {
                "default": "ok",
                "description": "ok — готово, wait — ждёт, fail — сбой",
                "type": "string",
                "enum": [
                 "ok",
                 "wait",
                 "fail"
                ]
               },
               "atSec": {
                "description": "Секунда появления элемента от начала элемента; пусто — по порядку с интервалом",
                "type": "number",
                "minimum": 0
               }
              },
              "required": [
               "text"
              ]
             },
             "description": "Строки"
            }
           },
           "required": [
            "kind",
            "rows"
           ]
          },
          {
           "type": "object",
           "properties": {
            "kind": {
             "type": "string",
             "const": "icons"
            },
            "atSec": {
             "default": 0,
             "description": "Секунда входа шага",
             "type": "number",
             "minimum": 0
            },
            "items": {
             "minItems": 1,
             "maxItems": 5,
             "type": "array",
             "items": {
              "type": "object",
              "properties": {
               "text": {
                "type": "string",
                "description": "Подпись"
               },
               "icon": {
                "description": "Иконка по имени: claude, openai, n8n, telegram, terminal, file, folder, brain, user, shield…",
                "type": "string"
               },
               "atSec": {
                "description": "Секунда появления элемента от начала элемента; пусто — по порядку с интервалом",
                "type": "number",
                "minimum": 0
               }
              },
              "required": [
               "text"
              ]
             },
             "description": "Плитки в ряд"
            },
            "size": {
             "description": "Размер плитки, px (по умолчанию до 210)",
             "type": "number",
             "minimum": 60,
             "maximum": 260
            }
           },
           "required": [
            "kind",
            "items"
           ]
          },
          {
           "type": "object",
           "properties": {
            "kind": {
             "type": "string",
             "const": "terminal"
            },
            "atSec": {
             "default": 0,
             "description": "Секунда входа шага",
             "type": "number",
             "minimum": 0
            },
            "title": {
             "description": "Заголовок окна",
             "type": "string"
            },
            "lines": {
             "minItems": 1,
             "maxItems": 8,
             "type": "array",
             "items": {
              "type": "object",
              "properties": {
               "text": {
                "type": "string"
               },
               "kind": {
                "default": "out",
                "description": "cmd — команда (печатается), out — вывод, ok — успех ✓",
                "type": "string",
                "enum": [
                 "cmd",
                 "out",
                 "ok"
                ]
               },
               "atSec": {
                "description": "Секунда появления элемента от начала элемента; пусто — по порядку с интервалом",
                "type": "number",
                "minimum": 0
               }
              },
              "required": [
               "text"
              ]
             },
             "description": "Строки терминала"
            }
           },
           "required": [
            "kind",
            "lines"
           ]
          },
          {
           "type": "object",
           "properties": {
            "kind": {
             "type": "string",
             "const": "image"
            },
            "atSec": {
             "default": 0,
             "description": "Секунда входа шага",
             "type": "number",
             "minimum": 0
            },
            "src": {
             "type": "string",
             "description": "Картинка: абсолютный локальный путь, http(s)-URL или файл из public/"
            },
            "aspect": {
             "default": 1.6,
             "description": "Пропорции окна (ширина/высота)",
             "type": "number",
             "minimum": 0.4,
             "maximum": 3
            },
            "title": {
             "description": "Подпись над картинкой",
             "type": "string"
            }
           },
           "required": [
            "kind",
            "src"
           ]
          }
         ]
        },
        {
         "type": "object",
         "properties": {
          "kind": {
           "type": "string",
           "const": "stack"
          },
          "atSec": {
           "default": 0,
           "description": "Секунда входа шага",
           "type": "number",
           "minimum": 0
          },
          "rows": {
           "minItems": 2,
           "maxItems": 3,
           "type": "array",
           "items": {
            "oneOf": [
             {
              "type": "object",
              "properties": {
               "kind": {
                "type": "string",
                "const": "title"
               },
               "atSec": {
                "default": 0,
                "description": "Секунда входа шага от начала элемента",
                "type": "number",
                "minimum": 0
               },
               "text": {
                "type": "string",
                "description": "Заголовок капсом (Benzin); \\n — перенос"
               },
               "sub": {
                "description": "Подзаголовок",
                "type": "string"
               },
               "icon": {
                "description": "Иконка по имени: claude, openai, n8n, telegram, terminal, file, folder, brain, user, shield…",
                "type": "string"
               }
              },
              "required": [
               "kind",
               "text"
              ]
             },
             {
              "type": "object",
              "properties": {
               "kind": {
                "type": "string",
                "const": "counter"
               },
               "atSec": {
                "default": 0,
                "description": "Секунда входа шага",
                "type": "number",
                "minimum": 0
               },
               "value": {
                "type": "number",
                "description": "Конечное значение (докручивается за 0,9 с)"
               },
               "from": {
                "description": "Начальное значение, по умолчанию 0",
                "type": "number"
               },
               "decimals": {
                "default": 0,
                "description": "Знаков после запятой",
                "type": "integer",
                "minimum": 0,
                "maximum": 4
               },
               "prefix": {
                "description": "Перед числом: «$», «~»",
                "type": "string"
               },
               "suffix": {
                "description": "После числа лаймом: «%», «×», «k»",
                "type": "string"
               },
               "label": {
                "description": "Подпись под числом",
                "type": "string"
               },
               "icon": {
                "description": "Иконка по имени: claude, openai, n8n, telegram, terminal, file, folder, brain, user, shield…",
                "type": "string"
               }
              },
              "required": [
               "kind",
               "value"
              ]
             },
             {
              "type": "object",
              "properties": {
               "kind": {
                "type": "string",
                "const": "graph"
               },
               "atSec": {
                "default": 0,
                "description": "Секунда входа шага",
                "type": "number",
                "minimum": 0
               },
               "center": {
                "type": "object",
                "properties": {
                 "text": {
                  "type": "string"
                 },
                 "icon": {
                  "description": "Иконка по имени: claude, openai, n8n, telegram, terminal, file, folder, brain, user, shield…",
                  "type": "string"
                 }
                },
                "required": [
                 "text"
                ],
                "description": "Центральный узел"
               },
               "nodes": {
                "minItems": 1,
                "maxItems": 6,
                "type": "array",
                "items": {
                 "type": "object",
                 "properties": {
                  "text": {
                   "type": "string",
                   "description": "Подпись"
                  },
                  "icon": {
                   "description": "Иконка по имени: claude, openai, n8n, telegram, terminal, file, folder, brain, user, shield…",
                   "type": "string"
                  },
                  "atSec": {
                   "description": "Секунда появления элемента от начала элемента; пусто — по порядку с интервалом",
                   "type": "number",
                   "minimum": 0
                  }
                 },
                 "required": [
                  "text"
                 ]
                },
                "description": "Узлы по кругу, появляются по очереди"
               }
              },
              "required": [
               "kind",
               "center",
               "nodes"
              ]
             },
             {
              "type": "object",
              "properties": {
               "kind": {
                "type": "string",
                "const": "status"
               },
               "atSec": {
                "default": 0,
                "description": "Секунда входа шага",
                "type": "number",
                "minimum": 0
               },
               "title": {
                "description": "Заголовок таблицы",
                "type": "string"
               },
               "rows": {
                "minItems": 1,
                "maxItems": 6,
                "type": "array",
                "items": {
                 "type": "object",
                 "properties": {
                  "text": {
                   "type": "string"
                  },
                  "status": {
                   "default": "ok",
                   "description": "ok — готово, wait — ждёт, fail — сбой",
                   "type": "string",
                   "enum": [
                    "ok",
                    "wait",
                    "fail"
                   ]
                  },
                  "atSec": {
                   "description": "Секунда появления элемента от начала элемента; пусто — по порядку с интервалом",
                   "type": "number",
                   "minimum": 0
                  }
                 },
                 "required": [
                  "text"
                 ]
                },
                "description": "Строки"
               }
              },
              "required": [
               "kind",
               "rows"
              ]
             },
             {
              "type": "object",
              "properties": {
               "kind": {
                "type": "string",
                "const": "icons"
               },
               "atSec": {
                "default": 0,
                "description": "Секунда входа шага",
                "type": "number",
                "minimum": 0
               },
               "items": {
                "minItems": 1,
                "maxItems": 5,
                "type": "array",
                "items": {
                 "type": "object",
                 "properties": {
                  "text": {
                   "type": "string",
                   "description": "Подпись"
                  },
                  "icon": {
                   "description": "Иконка по имени: claude, openai, n8n, telegram, terminal, file, folder, brain, user, shield…",
                   "type": "string"
                  },
                  "atSec": {
                   "description": "Секунда появления элемента от начала элемента; пусто — по порядку с интервалом",
                   "type": "number",
                   "minimum": 0
                  }
                 },
                 "required": [
                  "text"
                 ]
                },
                "description": "Плитки в ряд"
               },
               "size": {
                "description": "Размер плитки, px (по умолчанию до 210)",
                "type": "number",
                "minimum": 60,
                "maximum": 260
               }
              },
              "required": [
               "kind",
               "items"
              ]
             },
             {
              "type": "object",
              "properties": {
               "kind": {
                "type": "string",
                "const": "terminal"
               },
               "atSec": {
                "default": 0,
                "description": "Секунда входа шага",
                "type": "number",
                "minimum": 0
               },
               "title": {
                "description": "Заголовок окна",
                "type": "string"
               },
               "lines": {
                "minItems": 1,
                "maxItems": 8,
                "type": "array",
                "items": {
                 "type": "object",
                 "properties": {
                  "text": {
                   "type": "string"
                  },
                  "kind": {
                   "default": "out",
                   "description": "cmd — команда (печатается), out — вывод, ok — успех ✓",
                   "type": "string",
                   "enum": [
                    "cmd",
                    "out",
                    "ok"
                   ]
                  },
                  "atSec": {
                   "description": "Секунда появления элемента от начала элемента; пусто — по порядку с интервалом",
                   "type": "number",
                   "minimum": 0
                  }
                 },
                 "required": [
                  "text"
                 ]
                },
                "description": "Строки терминала"
               }
              },
              "required": [
               "kind",
               "lines"
              ]
             },
             {
              "type": "object",
              "properties": {
               "kind": {
                "type": "string",
                "const": "image"
               },
               "atSec": {
                "default": 0,
                "description": "Секунда входа шага",
                "type": "number",
                "minimum": 0
               },
               "src": {
                "type": "string",
                "description": "Картинка: абсолютный локальный путь, http(s)-URL или файл из public/"
               },
               "aspect": {
                "default": 1.6,
                "description": "Пропорции окна (ширина/высота)",
                "type": "number",
                "minimum": 0.4,
                "maximum": 3
               },
               "title": {
                "description": "Подпись над картинкой",
                "type": "string"
               }
              },
              "required": [
               "kind",
               "src"
              ]
             }
            ]
           },
           "description": "2–3 блока друг под другом, каждый входит на своём atSec (первый — с начала шага)"
          }
         },
         "required": [
          "kind",
          "rows"
         ]
        }
       ]
      }
     },
     "position": {
      "default": "top",
      "description": "Где панель: top — верх safe zone (над карточкой с лицом), center — по центру кадра",
      "type": "string",
      "enum": [
       "top",
       "center"
      ]
     },
     "maxHeight": {
      "default": 750,
      "description": "Максимальная высота панели, px при 1080p; шаг уменьшается, если не влезает",
      "type": "number",
      "minimum": 300,
      "maximum": 1200
     },
     "outAtSec": {
      "default": 0,
      "description": "С какой секунды панель уходит; 0 — держится до конца элемента",
      "type": "number",
      "minimum": 0
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "steps": [
     {
      "kind": "title",
      "atSec": 0,
      "text": "Агент собирает\nролик сам",
      "sub": "из сценария JSON",
      "icon": "claude"
     },
     {
      "kind": "counter",
      "atSec": 1.6,
      "value": 48,
      "decimals": 0,
      "suffix": "%",
      "label": "быстрее монтаж"
     },
     {
      "kind": "terminal",
      "atSec": 3.2,
      "title": "claude code",
      "lines": [
       {
        "kind": "cmd",
        "text": "vigent render timeline.json"
       },
       {
        "kind": "out",
        "text": "рендер 15 с…"
       },
       {
        "kind": "ok",
        "text": "готово: out/reel.mp4"
       }
      ]
     }
    ],
    "position": "top",
    "maxHeight": 750,
    "outAtSec": 0,
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/cam-panel.mp4",
    "poster": "previews/motion/cam-panel.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "cam-captions",
   "pack": "cam",
   "title": "Cam Captions",
   "description": "Субтитры по одному слову капсом (Benzin Bold): белые с тенью, акцентные слова лаймом, pop-появление, центр на 75% высоты. Вшитые субтитры для говорящей головы; тайминги слов — из транскрипции.",
   "category": "captions",
   "tags": [
    "captions",
    "субтитры",
    "по одному слову",
    "word by word",
    "караоке",
    "caps",
    "капс",
    "talking head",
    "cam",
    "overlay",
    "whisper"
   ],
   "tier": "premium",
   "overlay": true,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 5,
   "version": "1.0.0",
   "themeMap": {
    "text": [
     "color"
    ],
    "accent": [
     "accent"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "words": {
      "default": [
       {
        "text": "Агент",
        "startSec": 0.2,
        "endSec": 0.6
       },
       {
        "text": "собирает",
        "startSec": 0.6,
        "endSec": 1.1
       },
       {
        "text": "ролик",
        "startSec": 1.1,
        "endSec": 1.6
       },
       {
        "text": "сам",
        "startSec": 1.7,
        "endSec": 2.1
       }
      ],
      "description": "Слова с таймингом (из транскрипции): показывается одно слово до следующего",
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "text": {
         "type": "string",
         "description": "Слово"
        },
        "startSec": {
         "type": "number",
         "minimum": 0,
         "description": "Начало слова, сек от начала элемента"
        },
        "endSec": {
         "type": "number",
         "minimum": 0,
         "description": "Конец слова, сек"
        }
       },
       "required": [
        "text",
        "startSec",
        "endSec"
       ]
      }
     },
     "accentWords": {
      "default": [
       "ролик"
      ],
      "description": "Слова-акценты (без регистра и знаков): красятся лаймом",
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "y": {
      "default": 0.753,
      "description": "Центр строки по высоте кадра, доля (0.753 — под лицом, над низом интерфейса)",
      "type": "number",
      "minimum": 0,
      "maximum": 1
     },
     "size": {
      "default": 76,
      "description": "Кегль, px при 1080p",
      "type": "number",
      "minimum": 30,
      "maximum": 160
     },
     "holdAfterSec": {
      "default": 1,
      "description": "Сколько слово висит после своего конца, если следующее не началось (пауза → пусто)",
      "type": "number",
      "minimum": 0,
      "maximum": 5
     },
     "color": {
      "default": "#FAFAFA",
      "description": "Цвет обычных слов (hex)",
      "type": "string"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Цвет акцентных слов (hex)",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "words": [
     {
      "text": "Агент",
      "startSec": 0.2,
      "endSec": 0.6
     },
     {
      "text": "собирает",
      "startSec": 0.6,
      "endSec": 1.1
     },
     {
      "text": "ролик",
      "startSec": 1.1,
      "endSec": 1.6
     },
     {
      "text": "сам",
      "startSec": 1.7,
      "endSec": 2.1
     }
    ],
    "accentWords": [
     "ролик"
    ],
    "y": 0.753,
    "size": 76,
    "holdAfterSec": 1,
    "color": "#FAFAFA",
    "accent": "#C6FF3D",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/cam-captions.mp4",
    "poster": "previews/motion/cam-captions.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "cam-hook-plate",
   "pack": "cam",
   "title": "Cam Hook Plate",
   "description": "Стеклянная плашка хука сверху кадра с текстом капсом, видна с первого кадра (первый элемент ≤0,3 с) и мягко уходит к заданной секунде. Простой хук над говорящей головой.",
   "category": "overlays",
   "tags": [
    "hook",
    "хук",
    "плашка",
    "plate",
    "заголовок",
    "caps",
    "капс",
    "talking head",
    "стекло",
    "cam",
    "overlay"
   ],
   "tier": "premium",
   "overlay": true,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 4,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "text": {
      "default": "ЭТОТ АГЕНТ\nСОБИРАЕТ РОЛИКИ",
      "description": "Текст хука; \\n — перенос строки; выводится капсом (Benzin)",
      "type": "string"
     },
     "untilSec": {
      "default": 0,
      "description": "До какой секунды держится плашка; 0 — до конца элемента",
      "type": "number",
      "minimum": 0
     },
     "size": {
      "default": 72,
      "description": "Кегль, px при 1080p",
      "type": "number",
      "minimum": 30,
      "maximum": 140
     },
     "position": {
      "default": "top",
      "description": "Где плашка: top — верх safe zone, center, bottom",
      "type": "string",
      "enum": [
       "top",
       "center",
       "bottom"
      ]
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "text": "ЭТОТ АГЕНТ\nСОБИРАЕТ РОЛИКИ",
    "untilSec": 0,
    "size": 72,
    "position": "top",
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/cam-hook-plate.mp4",
    "poster": "previews/motion/cam-hook-plate.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 4
   }
  },
  {
   "kind": "motion",
   "id": "cam-browser-window",
   "pack": "cam",
   "title": "Cam Browser Window",
   "description": "Стеклянное окно браузера с шапкой-источником над размытым фоном: внутри картинка (опционально с плавным скроллом длинной страницы) или видео. Показать сайт, статью, скриншот, чужой ролик как «источник».",
   "category": "cards",
   "tags": [
    "browser",
    "window",
    "окно",
    "браузер",
    "сайт",
    "screenshot",
    "скриншот",
    "scroll",
    "скролл",
    "b-roll",
    "источник",
    "cam"
   ],
   "tier": "premium",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 5,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ],
    "background": [
     "backgroundColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "src": {
      "default": "",
      "description": "Картинка или видео внутри окна: абсолютный локальный путь, http(s)-URL (mp4/mov/webm — видео, иначе картинка). Пусто — заглушка",
      "type": "string"
     },
     "title": {
      "default": "example.com",
      "description": "Источник в шапке окна: домен, имя файла",
      "type": "string"
     },
     "aspect": {
      "default": 1.778,
      "description": "Пропорции окна без скролла (ширина/высота)",
      "type": "number",
      "minimum": 0.4,
      "maximum": 3
     },
     "scroll": {
      "default": false,
      "description": "Длинная картинка-страница прокручивается вниз (окно фиксированной высоты)",
      "type": "boolean"
     },
     "scrollFromSec": {
      "default": 0.4,
      "description": "Начало прокрутки, сек от начала элемента",
      "type": "number",
      "minimum": 0
     },
     "scrollToSec": {
      "default": 0,
      "description": "Конец прокрутки, сек; 0 — за 0,4 с до конца",
      "type": "number",
      "minimum": 0
     },
     "scrollAmount": {
      "default": 1,
      "description": "Какую долю прокручиваемой высоты проехать (0 — на месте, 1 — до низа страницы, но не больше 1,6 высоты окна)",
      "type": "number",
      "minimum": 0,
      "maximum": 1
     },
     "trimStartSec": {
      "default": 0,
      "description": "Для видео: с какой секунды исходника",
      "type": "number",
      "minimum": 0
     },
     "slideInSec": {
      "default": 0.3,
      "description": "Длительность въезда окна снизу, сек",
      "type": "number",
      "minimum": 0,
      "maximum": 1
     },
     "blurBackground": {
      "default": true,
      "description": "Фон — размытая тёмная копия того же медиа; false — сетка",
      "type": "boolean"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     },
     "backgroundColor": {
      "default": "#0A0A0B",
      "description": "Цвет фона и стеклянных подложек (CSS, #RRGGBB); берётся из timeline.theme.background",
      "type": "string"
     }
    }
   },
   "defaults": {
    "src": "",
    "title": "example.com",
    "aspect": 1.778,
    "scroll": false,
    "scrollFromSec": 0.4,
    "scrollToSec": 0,
    "scrollAmount": 1,
    "trimStartSec": 0,
    "slideInSec": 0.3,
    "blurBackground": true,
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA",
    "backgroundColor": "#0A0A0B"
   },
   "preview": {
    "video": "previews/motion/cam-browser-window.mp4",
    "poster": "previews/motion/cam-browser-window.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  },
  {
   "kind": "motion",
   "id": "cam-screen-bg",
   "pack": "cam",
   "title": "Cam Screen BG",
   "description": "Тёмный фон с сеткой 108 px и радиальной виньеткой — подложка под скринкасты, окна и карточки (как ScreenBg в cam-engine). Статичный, без движения.",
   "category": "backgrounds",
   "tags": [
    "background",
    "фон",
    "сетка",
    "grid",
    "vignette",
    "виньетка",
    "screencast",
    "скринкаст",
    "dark",
    "cam"
   ],
   "tier": "open",
   "overlay": false,
   "gl": null,
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 3,
   "version": "1.0.0",
   "themeMap": {
    "background": [
     "background"
    ],
    "accent": [
     "accent"
    ],
    "text": [
     "textColor"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "background": {
      "default": "#0A0A0B",
      "description": "Цвет фона (hex)",
      "type": "string"
     },
     "grid": {
      "default": true,
      "description": "Сетка",
      "type": "boolean"
     },
     "cell": {
      "default": 108,
      "description": "Шаг сетки, px при 1080p",
      "type": "number",
      "minimum": 24,
      "maximum": 400
     },
     "vignette": {
      "default": true,
      "description": "Виньетка: края темнее",
      "type": "boolean"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцентный цвет пака (CSS, #RRGGBB): подсветки, свечение, активные элементы; по умолчанию лайм. Берётся из timeline.theme.accent",
      "type": "string"
     },
     "textColor": {
      "default": "#FAFAFA",
      "description": "Цвет основного текста и линий (CSS, #RRGGBB); берётся из timeline.theme.text",
      "type": "string"
     }
    }
   },
   "defaults": {
    "background": "#0A0A0B",
    "grid": true,
    "cell": 108,
    "vignette": true,
    "accent": "#C6FF3D",
    "textColor": "#FAFAFA"
   },
   "preview": {
    "video": "previews/motion/cam-screen-bg.mp4",
    "poster": "previews/motion/cam-screen-bg.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 3
   }
  },
  {
   "kind": "motion",
   "id": "toon-clawd",
   "pack": "toon",
   "title": "Toon: Clawd",
   "description": "3D-маскот Clawd (Claude Code) — терракотовый блок на ножках — на подставке: машет, прыгает, радуется, думает. Для рилсов про ИИ-агентов и Claude Code.",
   "category": "characters",
   "tags": [
    "3d",
    "toon",
    "персонаж",
    "маскот",
    "clawd",
    "claude",
    "claude code",
    "character",
    "mascot",
    "low-poly",
    "анимация персонажа"
   ],
   "tier": "cloud",
   "overlay": false,
   "gl": "angle",
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 4,
   "version": "1.0.0",
   "themeMap": null,
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "action": {
      "default": "wave",
      "description": "Действие: idle — дышит и осматривается; wave — машет рукой; jump — прыгает с приседанием; happy — радостно подпрыгивает на ножках; think — думает (глаза-индикатор загрузки)",
      "type": "string",
      "enum": [
       "idle",
       "wave",
       "jump",
       "happy",
       "think"
      ]
     },
     "emotion": {
      "default": "happy",
      "description": "Эмоция (глаза, брови, наклон головы): neutral, happy, think, proud, suspicious, tired, flat, blank, deadpan, tender",
      "type": "string",
      "enum": [
       "neutral",
       "tired",
       "flat",
       "blank",
       "proud",
       "suspicious",
       "happy",
       "deadpan",
       "think",
       "tender"
      ]
     },
     "glow": {
      "default": 1,
      "description": "Самосвечение корпуса (терракотовый #D97757): 1 — как в оригинале, 0 — только освещение сцены",
      "type": "number",
      "minimum": 0,
      "maximum": 2
     },
     "background": {
      "default": "room",
      "description": "room — ночная комната с монитором и гирляндами; transparent — прозрачный фон, персонаж на подставке (для наложения, рендер в .webm/.mov)",
      "type": "string",
      "enum": [
       "room",
       "transparent"
      ]
     },
     "light": {
      "default": "all",
      "description": "Какой свет ведёт кадр: all — монитор, лампа и гирлянды; monitor — холодный от экрана; lamp — тёплая лампа; garland — гирлянды",
      "type": "string",
      "enum": [
       "all",
       "monitor",
       "lamp",
       "garland"
      ]
     },
     "zoom": {
      "default": 1,
      "description": "Крупность: 1 — персонаж целиком с полями, 1.6 — по пояс/крупно",
      "type": "number",
      "minimum": 0.5,
      "maximum": 2.5
     },
     "quality": {
      "default": "full",
      "description": "full — с ambient occlusion и глубиной резкости; lite — без них, быстрее (для черновых превью)",
      "type": "string",
      "enum": [
       "full",
       "lite"
      ]
     }
    }
   },
   "defaults": {
    "action": "wave",
    "emotion": "happy",
    "glow": 1,
    "background": "room",
    "light": "all",
    "zoom": 1,
    "quality": "full"
   },
   "preview": {
    "video": "previews/motion/toon-clawd.mp4",
    "poster": "previews/motion/toon-clawd.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 4
   }
  },
  {
   "kind": "motion",
   "id": "toon-robot",
   "pack": "toon",
   "title": "Toon: робот GPT",
   "description": "3D-робот GPT с лицом-экраном: говорит (рот-эквалайзер), думает, ждёт; логотип OpenAI на груди. Для сравнений ИИ и диалогов в рилсах.",
   "category": "characters",
   "tags": [
    "3d",
    "toon",
    "персонаж",
    "робот",
    "gpt",
    "chatgpt",
    "openai",
    "robot",
    "character",
    "low-poly",
    "говорит"
   ],
   "tier": "cloud",
   "overlay": false,
   "gl": "angle",
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 4,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "action": {
      "default": "talk",
      "description": "Действие: talk — говорит (рот-эквалайзер на лице-экране); idle — дышит и осматривается; think — думает",
      "type": "string",
      "enum": [
       "talk",
       "idle",
       "think"
      ]
     },
     "emotion": {
      "default": "neutral",
      "description": "Эмоция (глаза, брови, наклон головы): neutral, happy, think, proud, suspicious, tired, flat, blank, deadpan, tender",
      "type": "string",
      "enum": [
       "neutral",
       "tired",
       "flat",
       "blank",
       "proud",
       "suspicious",
       "happy",
       "deadpan",
       "think",
       "tender"
      ]
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Цвет глаз и эквалайзера на лице-экране: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "background": {
      "default": "room",
      "description": "room — ночная комната с монитором и гирляндами; transparent — прозрачный фон, персонаж на подставке (для наложения, рендер в .webm/.mov)",
      "type": "string",
      "enum": [
       "room",
       "transparent"
      ]
     },
     "light": {
      "default": "all",
      "description": "Какой свет ведёт кадр: all — монитор, лампа и гирлянды; monitor — холодный от экрана; lamp — тёплая лампа; garland — гирлянды",
      "type": "string",
      "enum": [
       "all",
       "monitor",
       "lamp",
       "garland"
      ]
     },
     "zoom": {
      "default": 1,
      "description": "Крупность: 1 — персонаж целиком с полями, 1.6 — по пояс/крупно",
      "type": "number",
      "minimum": 0.5,
      "maximum": 2.5
     },
     "quality": {
      "default": "full",
      "description": "full — с ambient occlusion и глубиной резкости; lite — без них, быстрее (для черновых превью)",
      "type": "string",
      "enum": [
       "full",
       "lite"
      ]
     }
    }
   },
   "defaults": {
    "action": "talk",
    "emotion": "neutral",
    "accent": "#C6FF3D",
    "background": "room",
    "light": "all",
    "zoom": 1,
    "quality": "full"
   },
   "preview": {
    "video": "previews/motion/toon-robot.mp4",
    "poster": "previews/motion/toon-robot.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 4
   }
  },
  {
   "kind": "motion",
   "id": "toon-hero",
   "pack": "toon",
   "title": "Toon: вайбкодер",
   "description": "3D-персонаж-вайбкодер в худи (стилизованный low-poly, не фото): печатает на клавиатуре, кивает, машет, думает. Сидит на краю стола перед монитором.",
   "category": "characters",
   "tags": [
    "3d",
    "toon",
    "персонаж",
    "вайбкодер",
    "программист",
    "developer",
    "coder",
    "character",
    "low-poly",
    "печатает"
   ],
   "tier": "cloud",
   "overlay": false,
   "gl": "angle",
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 4,
   "version": "1.0.0",
   "themeMap": null,
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "action": {
      "default": "type",
      "description": "Действие: type — печатает на клавиатуре на коленях; nod — кивает; wave — машет рукой; think — думает, глаза вверх",
      "type": "string",
      "enum": [
       "type",
       "nod",
       "wave",
       "think"
      ]
     },
     "emotion": {
      "default": "neutral",
      "description": "Эмоция (глаза, брови, наклон головы): neutral, happy, think, proud, suspicious, tired, flat, blank, deadpan, tender",
      "type": "string",
      "enum": [
       "neutral",
       "tired",
       "flat",
       "blank",
       "proud",
       "suspicious",
       "happy",
       "deadpan",
       "think",
       "tender"
      ]
     },
     "background": {
      "default": "room",
      "description": "room — ночная комната с монитором и гирляндами; transparent — прозрачный фон, персонаж на подставке (для наложения, рендер в .webm/.mov)",
      "type": "string",
      "enum": [
       "room",
       "transparent"
      ]
     },
     "light": {
      "default": "all",
      "description": "Какой свет ведёт кадр: all — монитор, лампа и гирлянды; monitor — холодный от экрана; lamp — тёплая лампа; garland — гирлянды",
      "type": "string",
      "enum": [
       "all",
       "monitor",
       "lamp",
       "garland"
      ]
     },
     "zoom": {
      "default": 1,
      "description": "Крупность: 1 — персонаж целиком с полями, 1.6 — по пояс/крупно",
      "type": "number",
      "minimum": 0.5,
      "maximum": 2.5
     },
     "quality": {
      "default": "full",
      "description": "full — с ambient occlusion и глубиной резкости; lite — без них, быстрее (для черновых превью)",
      "type": "string",
      "enum": [
       "full",
       "lite"
      ]
     }
    }
   },
   "defaults": {
    "action": "type",
    "emotion": "neutral",
    "background": "room",
    "light": "all",
    "zoom": 1,
    "quality": "full"
   },
   "preview": {
    "video": "previews/motion/toon-hero.mp4",
    "poster": "previews/motion/toon-hero.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 4
   }
  },
  {
   "kind": "motion",
   "id": "toon-night-desk",
   "pack": "toon",
   "title": "Toon: ночной стол с монитором",
   "description": "Ночная 3D-сцена: 1–3 персонажа (вайбкодер, Clawd, робот GPT) на краю стола перед огромным монитором; на экране печатается ваш текст — терминал, диалог с ИИ или произвольные строки. Пресеты камеры и света.",
   "category": "scenes",
   "tags": [
    "3d",
    "toon",
    "сцена",
    "монитор",
    "терминал",
    "ночь",
    "агенты",
    "claude",
    "gpt",
    "scene",
    "terminal",
    "night",
    "desk",
    "ситком"
   ],
   "tier": "cloud",
   "overlay": false,
   "gl": "angle",
   "width": 1080,
   "height": 1920,
   "fps": 30,
   "durationSec": 6,
   "version": "1.0.0",
   "themeMap": {
    "accent": [
     "accent"
    ]
   },
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "cast": {
      "default": [
       {
        "who": "hero",
        "action": "type",
        "emotion": "neutral"
       },
       {
        "who": "clawd",
        "action": "happy",
        "emotion": "happy"
       }
      ],
      "description": "1–3 разных персонажа на краю подставки перед монитором; трое — Clawd слева, герой в центре, робот справа",
      "minItems": 1,
      "maxItems": 3,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "who": {
         "type": "string",
         "enum": [
          "hero",
          "clawd",
          "robot"
         ],
         "description": "Персонаж: hero — вайбкодер, clawd — маскот Claude Code, robot — робот GPT"
        },
        "action": {
         "default": "idle",
         "description": "Действие (персонаж показывает то, что умеет: печать — герой, эквалайзер talk — робот, прыжки — Clawd)",
         "type": "string",
         "enum": [
          "idle",
          "talk",
          "type",
          "nod",
          "wave",
          "think",
          "happy",
          "jump"
         ]
        },
        "emotion": {
         "default": "neutral",
         "description": "Эмоция (глаза, брови, наклон головы): neutral, happy, think, proud, suspicious, tired, flat, blank, deadpan, tender",
         "type": "string",
         "enum": [
          "neutral",
          "tired",
          "flat",
          "blank",
          "proud",
          "suspicious",
          "happy",
          "deadpan",
          "think",
          "tender"
         ]
        }
       },
       "required": [
        "who"
       ]
      }
     },
     "screenMode": {
      "default": "terminal",
      "description": "Экран: terminal — строки с «$» печатаются как команды, остальные — вывод; dialog — строки с «>» — запросы человека, остальные — ответы ИИ; text — произвольный крупный текст по строкам",
      "type": "string",
      "enum": [
       "terminal",
       "dialog",
       "text"
      ]
     },
     "screenLines": {
      "default": [
       "$ claude",
       "Читаю репозиторий…",
       "✓ контекст загружен",
       "$ npm run build",
       "✓ build: 41.2s",
       "$ npm test",
       "✓ 212 тестов прошли"
      ],
      "description": "Строки экрана, печатаются по очереди с начала элемента",
      "maxItems": 40,
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "screenTitle": {
      "default": "agent-1 · ~/projects/app",
      "description": "Заголовок окна на мониторе",
      "type": "string"
     },
     "aiName": {
      "default": "claude",
      "description": "Имя ИИ в режиме dialog (подпись ответов)",
      "type": "string"
     },
     "typeSpeed": {
      "default": 24,
      "description": "Скорость печати на экране, символов в секунду",
      "type": "number",
      "minimum": 4,
      "maximum": 120
     },
     "screenStartSec": {
      "default": 0.3,
      "description": "С какой секунды от начала элемента начинается печать",
      "type": "number",
      "minimum": 0
     },
     "sideWindows": {
      "default": true,
      "description": "Окна других агентов по бокам монитора (видны на общих планах и в 16:9)",
      "type": "boolean"
     },
     "camera": {
      "default": "wide",
      "description": "Камера: wide — общий снизу от подставки с наездом; three — фронтальный средний, все в кадре; screen — сверху на монитор (текст читается); dutch — крупно и с креном на ИИ",
      "type": "string",
      "enum": [
       "wide",
       "three",
       "screen",
       "dutch"
      ]
     },
     "light": {
      "default": "all",
      "description": "Какой свет ведёт кадр: all — монитор, лампа и гирлянды; monitor — холодный от экрана; lamp — тёплая лампа; garland — гирлянды",
      "type": "string",
      "enum": [
       "all",
       "monitor",
       "lamp",
       "garland"
      ]
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Акцент: курсор, галочки и рамка окна на мониторе, глаза робота: CSS-цвет (#hex, rgb(), rgba())",
      "type": "string"
     },
     "quality": {
      "default": "full",
      "description": "full — с ambient occlusion и глубиной резкости; lite — без них, быстрее (для черновых превью)",
      "type": "string",
      "enum": [
       "full",
       "lite"
      ]
     }
    }
   },
   "defaults": {
    "cast": [
     {
      "who": "hero",
      "action": "type",
      "emotion": "neutral"
     },
     {
      "who": "clawd",
      "action": "happy",
      "emotion": "happy"
     }
    ],
    "screenMode": "terminal",
    "screenLines": [
     "$ claude",
     "Читаю репозиторий…",
     "✓ контекст загружен",
     "$ npm run build",
     "✓ build: 41.2s",
     "$ npm test",
     "✓ 212 тестов прошли"
    ],
    "screenTitle": "agent-1 · ~/projects/app",
    "aiName": "claude",
    "typeSpeed": 24,
    "screenStartSec": 0.3,
    "sideWindows": true,
    "camera": "wide",
    "light": "all",
    "accent": "#C6FF3D",
    "quality": "full"
   },
   "preview": {
    "video": "previews/motion/toon-night-desk.mp4",
    "poster": "previews/motion/toon-night-desk.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 5
   }
  }
 ],
 "transitions": [
  {
   "kind": "transition",
   "id": "fade",
   "pack": "core",
   "title": "Fade",
   "description": "Мягкое растворение одной сцены в другую. Универсальный нейтральный переход.",
   "tags": [
    "fade",
    "dissolve",
    "растворение",
    "crossfade",
    "мягкий"
   ],
   "tier": "open",
   "defaultDurationSec": 0.6,
   "version": "1.0.0",
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "fadeOutPrevious": {
      "default": false,
      "description": "Гасить и предыдущую сцену (провал через фон), а не только проявлять новую",
      "type": "boolean"
     }
    }
   },
   "defaults": {
    "fadeOutPrevious": false
   },
   "preview": {
    "video": "previews/transition/fade.mp4",
    "poster": "previews/transition/fade.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 2.6
   }
  },
  {
   "kind": "transition",
   "id": "slide",
   "pack": "core",
   "title": "Slide",
   "description": "Новая сцена въезжает и выталкивает предыдущую. Для смены пунктов, списков, «следующий слайд».",
   "tags": [
    "slide",
    "push",
    "сдвиг",
    "выталкивание"
   ],
   "tier": "open",
   "defaultDurationSec": 0.6,
   "version": "1.0.0",
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "direction": {
      "default": "from-right",
      "description": "Откуда входит новая сцена",
      "type": "string",
      "enum": [
       "from-left",
       "from-right",
       "from-top",
       "from-bottom"
      ]
     }
    }
   },
   "defaults": {
    "direction": "from-right"
   },
   "preview": {
    "video": "previews/transition/slide.mp4",
    "poster": "previews/transition/slide.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 2.6
   }
  },
  {
   "kind": "transition",
   "id": "wipe",
   "pack": "core",
   "title": "Wipe",
   "description": "Новая сцена открывается шторкой поверх старой. Классический монтажный вайп.",
   "tags": [
    "wipe",
    "шторка",
    "вайп"
   ],
   "tier": "open",
   "defaultDurationSec": 0.6,
   "version": "1.0.0",
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "direction": {
      "default": "from-left",
      "description": "Откуда идёт шторка",
      "type": "string",
      "enum": [
       "from-left",
       "from-top-left",
       "from-top",
       "from-top-right",
       "from-right",
       "from-bottom-right",
       "from-bottom",
       "from-bottom-left"
      ]
     }
    }
   },
   "defaults": {
    "direction": "from-left"
   },
   "preview": {
    "video": "previews/transition/wipe.mp4",
    "poster": "previews/transition/wipe.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 2.6
   }
  },
  {
   "kind": "transition",
   "id": "flip",
   "pack": "core",
   "title": "Flip",
   "description": "3D-переворот кадра как карточки. Для смены «до/после», вопросов-ответов.",
   "tags": [
    "flip",
    "3d",
    "переворот",
    "карточка"
   ],
   "tier": "open",
   "defaultDurationSec": 0.8,
   "version": "1.0.0",
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "direction": {
      "default": "from-right",
      "description": "Откуда входит новая сцена",
      "type": "string",
      "enum": [
       "from-left",
       "from-right",
       "from-top",
       "from-bottom"
      ]
     },
     "perspective": {
      "default": 1000,
      "description": "Перспектива 3D, px: меньше — сильнее искажение",
      "type": "number",
      "minimum": 200,
      "maximum": 5000
     }
    }
   },
   "defaults": {
    "direction": "from-right",
    "perspective": 1000
   },
   "preview": {
    "video": "previews/transition/flip.mp4",
    "poster": "previews/transition/flip.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 2.4
   }
  },
  {
   "kind": "transition",
   "id": "clock-wipe",
   "pack": "core",
   "title": "Clock Wipe",
   "description": "Новая сцена открывается по кругу, как стрелка часов. Для таймеров, «прошло время».",
   "tags": [
    "clock",
    "radial",
    "часы",
    "радиальный"
   ],
   "tier": "open",
   "defaultDurationSec": 0.8,
   "version": "1.0.0",
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {}
   },
   "defaults": {},
   "preview": {
    "video": "previews/transition/clock-wipe.mp4",
    "poster": "previews/transition/clock-wipe.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 2.4
   }
  },
  {
   "kind": "transition",
   "id": "iris",
   "pack": "core",
   "title": "Iris",
   "description": "Новая сцена раскрывается кругом из центра кадра. Для фокуса на детали, финала.",
   "tags": [
    "iris",
    "circle",
    "круг",
    "диафрагма",
    "reveal"
   ],
   "tier": "open",
   "defaultDurationSec": 0.7,
   "version": "1.0.0",
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {}
   },
   "defaults": {},
   "preview": {
    "video": "previews/transition/iris.mp4",
    "poster": "previews/transition/iris.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 2.5
   }
  },
  {
   "kind": "transition",
   "id": "zoom-through",
   "pack": "core",
   "title": "Zoom Through",
   "description": "Камера пролетает сквозь кадр: старая сцена резко увеличивается с размытием, новая выплывает из глубины. Динамичный переход для рилсов.",
   "tags": [
    "zoom",
    "зум",
    "пролёт",
    "blur",
    "динамика",
    "reels"
   ],
   "tier": "open",
   "defaultDurationSec": 0.5,
   "version": "1.0.0",
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "strength": {
      "default": 1,
      "description": "Сила зума: 1 — стандарт, 2 — агрессивно",
      "type": "number",
      "minimum": 0.2,
      "maximum": 3
     },
     "blur": {
      "default": 24,
      "description": "Максимальное размытие в пике, px при 1080p",
      "type": "number",
      "minimum": 0,
      "maximum": 60
     }
    }
   },
   "defaults": {
    "strength": 1,
    "blur": 24
   },
   "preview": {
    "video": "previews/transition/zoom-through.mp4",
    "poster": "previews/transition/zoom-through.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 2.7
   }
  },
  {
   "kind": "transition",
   "id": "blur-dissolve",
   "pack": "core",
   "title": "Blur Dissolve",
   "description": "Растворение через размытие: старая сцена расплывается, новая проявляется из расфокуса. Мягко, кинематографично.",
   "tags": [
    "blur",
    "dissolve",
    "размытие",
    "расфокус",
    "мягкий"
   ],
   "tier": "open",
   "defaultDurationSec": 0.8,
   "version": "1.0.0",
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "blur": {
      "default": 30,
      "description": "Максимальное размытие, px при 1080p",
      "type": "number",
      "minimum": 2,
      "maximum": 80
     }
    }
   },
   "defaults": {
    "blur": 30
   },
   "preview": {
    "video": "previews/transition/blur-dissolve.mp4",
    "poster": "previews/transition/blur-dissolve.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 2.4
   }
  },
  {
   "kind": "transition",
   "id": "glitch",
   "pack": "core",
   "title": "Glitch",
   "description": "Цифровой сбой: RGB-расслоение, горизонтальные срезы со сдвигом, мерцание. Для техно-тем, резкой смены настроения.",
   "tags": [
    "glitch",
    "глитч",
    "сбой",
    "rgb",
    "digital",
    "tech"
   ],
   "tier": "open",
   "defaultDurationSec": 0.4,
   "version": "1.0.0",
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "intensity": {
      "default": 1,
      "description": "Сила сбоя: сдвиг срезов и RGB-расслоения",
      "type": "number",
      "minimum": 0.1,
      "maximum": 3
     },
     "seed": {
      "default": 7,
      "description": "Зерно случайности — другой рисунок срезов",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
     }
    }
   },
   "defaults": {
    "intensity": 1,
    "seed": 7
   },
   "preview": {
    "video": "previews/transition/glitch.mp4",
    "poster": "previews/transition/glitch.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 2.8
   }
  },
  {
   "kind": "transition",
   "id": "whip-pan",
   "pack": "core",
   "title": "Whip Pan",
   "description": "Резкий панорамный бросок камеры с горизонтальным смазом. Энергичная склейка для влогов и рилсов.",
   "tags": [
    "whip",
    "pan",
    "свайп",
    "смаз",
    "motion blur",
    "reels"
   ],
   "tier": "open",
   "defaultDurationSec": 0.4,
   "version": "1.0.0",
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "direction": {
      "default": "left",
      "description": "Куда «бросают» камеру: left — кадр уезжает влево",
      "type": "string",
      "enum": [
       "left",
       "right"
      ]
     },
     "blur": {
      "default": 80,
      "description": "Сила горизонтального смаза, px при 1080p",
      "type": "number",
      "minimum": 0,
      "maximum": 200
     }
    }
   },
   "defaults": {
    "direction": "left",
    "blur": 80
   },
   "preview": {
    "video": "previews/transition/whip-pan.mp4",
    "poster": "previews/transition/whip-pan.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 2.8
   }
  },
  {
   "kind": "transition",
   "id": "light-leak",
   "pack": "core",
   "title": "Light Leak / Flash",
   "description": "Склейка через засветку: тёплый блик плёнки (leak) или белая вспышка (flash). Для ностальгии, эмоциональных моментов, ударных склеек.",
   "tags": [
    "light leak",
    "flash",
    "засветка",
    "вспышка",
    "блик",
    "плёнка"
   ],
   "tier": "open",
   "defaultDurationSec": 0.8,
   "version": "1.0.0",
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "style": {
      "default": "leak",
      "description": "leak — цветной блик сбоку; flash — равномерная вспышка",
      "type": "string",
      "enum": [
       "leak",
       "flash"
      ]
     },
     "color": {
      "default": "#FF9A3C",
      "description": "Цвет засветки (для leak): CSS-цвет",
      "type": "string"
     }
    }
   },
   "defaults": {
    "style": "leak",
    "color": "#FF9A3C"
   },
   "preview": {
    "video": "previews/transition/light-leak.mp4",
    "poster": "previews/transition/light-leak.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 2.4
   }
  },
  {
   "kind": "transition",
   "id": "glass-blur",
   "pack": "glass",
   "title": "Glass Blur",
   "description": "Стандартный шов пака glass: уходящая сцена размывается до 20 px и гаснет, новая проявляется из размытия. Нейтральный, для большинства смен мысли.",
   "tags": [
    "blur",
    "crossfade",
    "размытие",
    "растворение",
    "glass",
    "v2",
    "мягкий"
   ],
   "tier": "premium",
   "defaultDurationSec": 0.3333333333333333,
   "version": "1.0.0",
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "blur": {
      "default": 20,
      "description": "Максимальное размытие, px при 1080p",
      "type": "number",
      "minimum": 0,
      "maximum": 80
     }
    }
   },
   "defaults": {
    "blur": 20
   },
   "preview": {
    "video": "previews/transition/glass-blur.mp4",
    "poster": "previews/transition/glass-blur.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 2.87
   }
  },
  {
   "kind": "transition",
   "id": "glass-iris",
   "pack": "glass",
   "title": "Glass Iris",
   "description": "Акцентная точка набирает свечение, из неё раскрывается круг с новой сценой, по кромке бежит светящееся кольцо. Раскрывать из объекта в кадре (иконка, кнопка, цифра).",
   "tags": [
    "iris",
    "circle",
    "reveal",
    "круг",
    "раскрытие",
    "кольцо",
    "glass"
   ],
   "tier": "premium",
   "defaultDurationSec": 0.26666666666666666,
   "version": "1.0.0",
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "x": {
      "default": 50,
      "description": "Центр круга, % ширины",
      "type": "number",
      "minimum": 0,
      "maximum": 100
     },
     "y": {
      "default": 45,
      "description": "Центр круга, % высоты",
      "type": "number",
      "minimum": 0,
      "maximum": 100
     },
     "seed": {
      "default": true,
      "description": "Светящаяся точка-затравка перед раскрытием",
      "type": "boolean"
     },
     "color": {
      "default": "#C6FF3D",
      "description": "Акцент перехода (hex #RRGGBB)",
      "type": "string"
     }
    }
   },
   "defaults": {
    "x": 50,
    "y": 45,
    "seed": true,
    "color": "#C6FF3D"
   },
   "preview": {
    "video": "previews/transition/glass-iris.mp4",
    "poster": "previews/transition/glass-iris.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 2.93
   }
  },
  {
   "kind": "transition",
   "id": "glass-discs",
   "pack": "glass",
   "title": "Glass Discs",
   "description": "Три диска из угла один за другим: акцентный, тёмное стекло и фон, сквозь который видна новая сцена. Энергичная смена блока.",
   "tags": [
    "discs",
    "circles",
    "wipe",
    "диски",
    "круги",
    "угол",
    "glass"
   ],
   "tier": "premium",
   "defaultDurationSec": 0.3,
   "version": "1.0.0",
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "x": {
      "default": 100,
      "description": "Откуда растут диски, % ширины (100 — правый край)",
      "type": "number",
      "minimum": 0,
      "maximum": 100
     },
     "y": {
      "default": 100,
      "description": "Откуда растут диски, % высоты (100 — низ)",
      "type": "number",
      "minimum": 0,
      "maximum": 100
     },
     "color": {
      "default": "#C6FF3D",
      "description": "Акцент перехода (hex #RRGGBB)",
      "type": "string"
     }
    }
   },
   "defaults": {
    "x": 100,
    "y": 100,
    "color": "#C6FF3D"
   },
   "preview": {
    "video": "previews/transition/glass-discs.mp4",
    "poster": "previews/transition/glass-discs.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 2.9
   }
  },
  {
   "kind": "transition",
   "id": "glass-zoom",
   "pack": "glass",
   "title": "Glass Zoom",
   "description": "Уходящая сцена наезжает на камеру и размывается, белая вспышка 12 %, новая — резкая, лёгким наездом из той же точки. Для «углубимся», «а внутри».",
   "tags": [
    "zoom",
    "zoom-through",
    "наезд",
    "вспышка",
    "glass"
   ],
   "tier": "premium",
   "defaultDurationSec": 0.5,
   "version": "1.0.0",
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "x": {
      "default": 50,
      "description": "Точка наезда, % ширины",
      "type": "number",
      "minimum": 0,
      "maximum": 100
     },
     "y": {
      "default": 45,
      "description": "Точка наезда, % высоты",
      "type": "number",
      "minimum": 0,
      "maximum": 100
     }
    }
   },
   "defaults": {
    "x": 50,
    "y": 45
   },
   "preview": {
    "video": "previews/transition/glass-zoom.mp4",
    "poster": "previews/transition/glass-zoom.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 2.7
   }
  },
  {
   "kind": "transition",
   "id": "glass-punch",
   "pack": "glass",
   "title": "Glass Punch",
   "description": "Удар: уходящая сцена летит на камеру ×2,5 с двумя эхо-копиями и смазом, из точки удара разлетаются полосы скорости, новая садится ×1.35 → 1 из размытия. На резкой смене, после панчлайна.",
   "tags": [
    "punch",
    "impact",
    "speed lines",
    "удар",
    "полосы скорости",
    "эхо",
    "hud",
    "glass"
   ],
   "tier": "premium",
   "defaultDurationSec": 0.4,
   "version": "1.0.0",
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "x": {
      "default": 50,
      "description": "Точка удара, % ширины",
      "type": "number",
      "minimum": 0,
      "maximum": 100
     },
     "y": {
      "default": 45,
      "description": "Точка удара, % высоты",
      "type": "number",
      "minimum": 0,
      "maximum": 100
     },
     "echoes": {
      "default": true,
      "description": "Две эхо-копии за уходящей сценой",
      "type": "boolean"
     },
     "lines": {
      "default": true,
      "description": "Полосы скорости из точки удара",
      "type": "boolean"
     },
     "seed": {
      "default": 7,
      "description": "Вариант рисунка полос",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
     },
     "color": {
      "default": "#C6FF3D",
      "description": "Акцент перехода (hex #RRGGBB)",
      "type": "string"
     }
    }
   },
   "defaults": {
    "x": 50,
    "y": 45,
    "echoes": true,
    "lines": true,
    "seed": 7,
    "color": "#C6FF3D"
   },
   "preview": {
    "video": "previews/transition/glass-punch.mp4",
    "poster": "previews/transition/glass-punch.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 2.8
   }
  },
  {
   "kind": "transition",
   "id": "glass-glitch",
   "pack": "glass",
   "title": "Glass Glitch",
   "description": "Сбой: кадр режется на горизонтальные полосы, они сдвигаются, RGB-каналы расходятся, мелькают тонкие акцентные линии; склейка посередине. Для «было/стало», ошибки, взлома.",
   "tags": [
    "glitch",
    "rgb split",
    "сбой",
    "глитч",
    "срезы",
    "hud",
    "glass"
   ],
   "tier": "premium",
   "defaultDurationSec": 0.2,
   "version": "1.0.0",
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "amount": {
      "default": 1,
      "description": "Сила: сдвиг полос 40 px и RGB 6 px × amount",
      "type": "number",
      "minimum": 0,
      "maximum": 3
     },
     "seed": {
      "default": 7,
      "description": "Вариант нарезки",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
     },
     "color": {
      "default": "#C6FF3D",
      "description": "Акцент перехода (hex #RRGGBB)",
      "type": "string"
     }
    }
   },
   "defaults": {
    "amount": 1,
    "seed": 7,
    "color": "#C6FF3D"
   },
   "preview": {
    "video": "previews/transition/glass-glitch.mp4",
    "poster": "previews/transition/glass-glitch.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 3
   }
  },
  {
   "kind": "transition",
   "id": "cam-morph",
   "pack": "cam",
   "title": "Cam Morph",
   "description": "Перетекание кадра между полным и карточкой: между двумя видео-сценами (обычно один и тот же человек). to-card — первая сцена на весь кадр сжимается в карточку снизу, во второй висит эффект cam-card с теми же параметрами; to-full — наоборот.",
   "tags": [
    "morph",
    "card",
    "карточка",
    "перетекание",
    "full",
    "talking head",
    "cam",
    "переход"
   ],
   "tier": "premium",
   "defaultDurationSec": 0.3,
   "version": "1.0.0",
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "direction": {
      "default": "to-card",
      "description": "to-card: уходящая сцена полная → карточка; to-full: приходящая сцена из карточки → на весь кадр. Карточечная сцена получает cam-card с теми же параметрами",
      "type": "string",
      "enum": [
       "to-card",
       "to-full"
      ]
     },
     "top": {
      "default": 0.649,
      "description": "Верх карточки, доля высоты кадра (как в cam-card)",
      "type": "number",
      "minimum": 0,
      "maximum": 1
     },
     "radius": {
      "default": 0.065,
      "description": "Радиус верхних углов, доля ширины (как в cam-card)",
      "type": "number",
      "minimum": 0,
      "maximum": 1
     },
     "scale": {
      "default": 1,
      "description": "Масштаб кадра в карточке (как в cam-card)",
      "type": "number",
      "minimum": 1,
      "maximum": 1.5
     },
     "originX": {
      "default": 0.5,
      "description": "Точка масштаба по X (как в cam-card)",
      "type": "number",
      "minimum": 0,
      "maximum": 1
     },
     "originY": {
      "default": 1,
      "description": "Точка масштаба по Y (как в cam-card)",
      "type": "number",
      "minimum": 0,
      "maximum": 1
     },
     "background": {
      "default": "#0A0A0B",
      "description": "Фон над карточкой (как в cam-card)",
      "type": "string"
     },
     "grid": {
      "default": true,
      "description": "Сетка на фоне (как в cam-card)",
      "type": "boolean"
     }
    }
   },
   "defaults": {
    "direction": "to-card",
    "top": 0.649,
    "radius": 0.065,
    "scale": 1,
    "originX": 0.5,
    "originY": 1,
    "background": "#0A0A0B",
    "grid": true
   },
   "preview": {
    "video": "previews/transition/cam-morph.mp4",
    "poster": "previews/transition/cam-morph.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 2.9
   }
  }
 ],
 "effects": [
  {
   "kind": "effect",
   "id": "ken-burns",
   "pack": "core",
   "title": "Ken Burns",
   "description": "Медленный наезд/отъезд с панорамой по кадру. Оживляет фото и статичные планы.",
   "tags": [
    "ken burns",
    "zoom",
    "pan",
    "наезд",
    "панорама",
    "фото"
   ],
   "tier": "open",
   "version": "1.0.0",
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "zoomFrom": {
      "default": 1,
      "description": "Масштаб в начале сцены",
      "type": "number",
      "minimum": 1,
      "maximum": 3
     },
     "zoomTo": {
      "default": 1.2,
      "description": "Масштаб в конце сцены",
      "type": "number",
      "minimum": 1,
      "maximum": 3
     },
     "fromX": {
      "default": 40,
      "description": "Точка фокуса в начале, % ширины",
      "type": "number",
      "minimum": 0,
      "maximum": 100
     },
     "fromY": {
      "default": 50,
      "description": "Точка фокуса в начале, % высоты",
      "type": "number",
      "minimum": 0,
      "maximum": 100
     },
     "toX": {
      "default": 60,
      "description": "Точка фокуса в конце, % ширины",
      "type": "number",
      "minimum": 0,
      "maximum": 100
     },
     "toY": {
      "default": 45,
      "description": "Точка фокуса в конце, % высоты",
      "type": "number",
      "minimum": 0,
      "maximum": 100
     }
    }
   },
   "defaults": {
    "zoomFrom": 1,
    "zoomTo": 1.2,
    "fromX": 40,
    "fromY": 50,
    "toX": 60,
    "toY": 45
   },
   "preview": {
    "video": "previews/effect/ken-burns.mp4",
    "poster": "previews/effect/ken-burns.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 3
   }
  },
  {
   "kind": "effect",
   "id": "zoom-punch",
   "pack": "core",
   "title": "Zoom Punch",
   "description": "Резкий зум-удар в заданный момент — акцент на фразе, бите, панчлайне.",
   "tags": [
    "zoom",
    "punch",
    "зум",
    "акцент",
    "удар",
    "бит"
   ],
   "tier": "open",
   "version": "1.0.0",
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "atSec": {
      "default": 1,
      "description": "Момент удара, секунды от начала сцены",
      "type": "number",
      "minimum": 0
     },
     "amount": {
      "default": 0.18,
      "description": "Сила зума: 0.18 — +18% масштаба",
      "type": "number",
      "minimum": 0.02,
      "maximum": 1
     },
     "hold": {
      "default": true,
      "description": "true — остаться в приближении (jump zoom); false — отскочить обратно",
      "type": "boolean"
     },
     "originX": {
      "default": 50,
      "description": "Центр зума, % ширины",
      "type": "number",
      "minimum": 0,
      "maximum": 100
     },
     "originY": {
      "default": 50,
      "description": "Центр зума, % высоты",
      "type": "number",
      "minimum": 0,
      "maximum": 100
     }
    }
   },
   "defaults": {
    "atSec": 1,
    "amount": 0.18,
    "hold": true,
    "originX": 50,
    "originY": 50
   },
   "preview": {
    "video": "previews/effect/zoom-punch.mp4",
    "poster": "previews/effect/zoom-punch.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 3
   }
  },
  {
   "kind": "effect",
   "id": "color-grade",
   "pack": "core",
   "title": "Color Grade",
   "description": "Цветокоррекция пресетом: teal-orange (кино), mono (ч/б), warm, cold, vintage (плёнка, выцветшие тени), high-contrast.",
   "tags": [
    "color",
    "grade",
    "lut",
    "цветокор",
    "грейдинг",
    "ч/б",
    "кино"
   ],
   "tier": "open",
   "version": "1.0.0",
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "preset": {
      "default": "teal-orange",
      "description": "Пресет грейдинга",
      "type": "string",
      "enum": [
       "teal-orange",
       "mono",
       "warm",
       "cold",
       "vintage",
       "high-contrast"
      ]
     },
     "intensity": {
      "default": 1,
      "description": "Сила: 0 — без изменений, 1 — полностью",
      "type": "number",
      "minimum": 0,
      "maximum": 1
     }
    }
   },
   "defaults": {
    "preset": "teal-orange",
    "intensity": 1
   },
   "preview": {
    "video": "previews/effect/color-grade.mp4",
    "poster": "previews/effect/color-grade.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 3
   }
  },
  {
   "kind": "effect",
   "id": "vignette",
   "pack": "core",
   "title": "Vignette",
   "description": "Затемнение краёв кадра — фокус на центре, кинематографичность.",
   "tags": [
    "vignette",
    "виньетка",
    "края",
    "кино"
   ],
   "tier": "open",
   "version": "1.0.0",
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "strength": {
      "default": 0.6,
      "description": "Плотность затемнения краёв",
      "type": "number",
      "minimum": 0,
      "maximum": 1
     },
     "size": {
      "default": 0.55,
      "description": "Размер светлой середины: меньше — виньетка шире",
      "type": "number",
      "minimum": 0.1,
      "maximum": 1
     },
     "color": {
      "default": "#000000",
      "description": "Цвет виньетки: CSS-цвет",
      "type": "string"
     }
    }
   },
   "defaults": {
    "strength": 0.6,
    "size": 0.55,
    "color": "#000000"
   },
   "preview": {
    "video": "previews/effect/vignette.mp4",
    "poster": "previews/effect/vignette.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 3
   }
  },
  {
   "kind": "effect",
   "id": "film-grain",
   "pack": "core",
   "title": "Film Grain",
   "description": "Живое плёночное зерно, меняется каждый кадр. Снимает «цифровую» стерильность.",
   "tags": [
    "grain",
    "noise",
    "зерно",
    "плёнка",
    "шум",
    "film"
   ],
   "tier": "open",
   "version": "1.0.0",
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "amount": {
      "default": 0.25,
      "description": "Заметность зерна",
      "type": "number",
      "minimum": 0,
      "maximum": 1
     },
     "size": {
      "default": 1,
      "description": "Размер зерна: 1 — мелкое, 3 — крупное",
      "type": "number",
      "minimum": 0.5,
      "maximum": 4
     }
    }
   },
   "defaults": {
    "amount": 0.25,
    "size": 1
   },
   "preview": {
    "video": "previews/effect/film-grain.mp4",
    "poster": "previews/effect/film-grain.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 3
   }
  },
  {
   "kind": "effect",
   "id": "letterbox",
   "pack": "core",
   "title": "Letterbox",
   "description": "Кинополосы сверху и снизу до заданного соотношения сторон, с выездом в начале сцены.",
   "tags": [
    "letterbox",
    "cinema",
    "кинополосы",
    "широкий экран",
    "2.39"
   ],
   "tier": "open",
   "version": "1.0.0",
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "ratio": {
      "default": 2.39,
      "description": "Видимое соотношение сторон: 2.39 — синемаскоп, 1.85 — кино",
      "type": "number",
      "minimum": 1,
      "maximum": 4
     },
     "color": {
      "default": "#000000",
      "description": "Цвет полос: CSS-цвет",
      "type": "string"
     },
     "animateSec": {
      "default": 0.6,
      "description": "Выезд полос в начале сцены, секунды; 0 — сразу",
      "type": "number",
      "minimum": 0,
      "maximum": 5
     }
    }
   },
   "defaults": {
    "ratio": 2.39,
    "color": "#000000",
    "animateSec": 0.6
   },
   "preview": {
    "video": "previews/effect/letterbox.mp4",
    "poster": "previews/effect/letterbox.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 3
   }
  },
  {
   "kind": "effect",
   "id": "camera-shake",
   "pack": "core",
   "title": "Camera Shake",
   "description": "Тряска ручной камеры: лёгкий handheld или сильная тряска на удар.",
   "tags": [
    "shake",
    "тряска",
    "handheld",
    "камера",
    "удар"
   ],
   "tier": "open",
   "version": "1.0.0",
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "intensity": {
      "default": 10,
      "description": "Амплитуда сдвига, px при 1080p: 5 — handheld, 30 — удар",
      "type": "number",
      "minimum": 0,
      "maximum": 100
     },
     "frequency": {
      "default": 2,
      "description": "Скорость тряски, колебаний в секунду",
      "type": "number",
      "minimum": 0.2,
      "maximum": 20
     },
     "rotation": {
      "default": 0.4,
      "description": "Амплитуда поворота, градусы",
      "type": "number",
      "minimum": 0,
      "maximum": 10
     },
     "seed": {
      "default": 1,
      "description": "Зерно — другой рисунок тряски",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
     }
    }
   },
   "defaults": {
    "intensity": 10,
    "frequency": 2,
    "rotation": 0.4,
    "seed": 1
   },
   "preview": {
    "video": "previews/effect/camera-shake.mp4",
    "poster": "previews/effect/camera-shake.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 3
   }
  },
  {
   "kind": "effect",
   "id": "blur-in",
   "pack": "core",
   "title": "Blur In",
   "description": "Проявление из расфокуса в начале сцены.",
   "tags": [
    "blur",
    "focus",
    "размытие",
    "фокус",
    "появление"
   ],
   "tier": "open",
   "version": "1.0.0",
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "durationSec": {
      "default": 0.8,
      "description": "Длительность фокусировки, секунды",
      "type": "number",
      "minimum": 0.1,
      "maximum": 5
     },
     "blur": {
      "default": 30,
      "description": "Начальное размытие, px при 1080p",
      "type": "number",
      "minimum": 1,
      "maximum": 100
     },
     "fade": {
      "default": true,
      "description": "Одновременно проявлять из прозрачности",
      "type": "boolean"
     }
    }
   },
   "defaults": {
    "durationSec": 0.8,
    "blur": 30,
    "fade": true
   },
   "preview": {
    "video": "previews/effect/blur-in.mp4",
    "poster": "previews/effect/blur-in.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 3
   }
  },
  {
   "kind": "effect",
   "id": "fade-in-out",
   "pack": "core",
   "title": "Fade In/Out",
   "description": "Проявление из цвета в начале и уход в цвет в конце сцены (затемнение).",
   "tags": [
    "fade",
    "затемнение",
    "из чёрного",
    "в чёрное"
   ],
   "tier": "open",
   "version": "1.0.0",
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "inSec": {
      "default": 0.5,
      "description": "Проявление в начале, секунды; 0 — без него",
      "type": "number",
      "minimum": 0,
      "maximum": 5
     },
     "outSec": {
      "default": 0.5,
      "description": "Уход в конце, секунды; 0 — без него",
      "type": "number",
      "minimum": 0,
      "maximum": 5
     },
     "color": {
      "default": "#000000",
      "description": "Цвет, из которого/в который уходим",
      "type": "string"
     }
    }
   },
   "defaults": {
    "inSec": 0.5,
    "outSec": 0.5,
    "color": "#000000"
   },
   "preview": {
    "video": "previews/effect/fade-in-out.mp4",
    "poster": "previews/effect/fade-in-out.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 3
   }
  },
  {
   "kind": "effect",
   "id": "glass-flash",
   "pack": "glass",
   "title": "Glass Flash",
   "description": "Вспышка акцентом на весь кадр в режиме screen (белое остаётся белым): пик 1/30 с, затухание 0,2 с. Удар на главном слове, не чаще раза в 10–15 с.",
   "tags": [
    "flash",
    "impact",
    "вспышка",
    "удар",
    "акцент",
    "hud",
    "glass"
   ],
   "tier": "premium",
   "version": "1.0.0",
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "atSec": {
      "default": 1,
      "description": "Момент удара, секунды от начала сцены (ставить на главное слово)",
      "type": "number",
      "minimum": 0
     },
     "power": {
      "default": 1,
      "description": "Сила 0–1: прозрачность пика 0,85 × power",
      "type": "number",
      "minimum": 0,
      "maximum": 1
     },
     "color": {
      "default": "#C6FF3D",
      "description": "Цвет вспышки (hex)",
      "type": "string"
     }
    }
   },
   "defaults": {
    "atSec": 1,
    "power": 1,
    "color": "#C6FF3D"
   },
   "preview": {
    "video": "previews/effect/glass-flash.mp4",
    "poster": "previews/effect/glass-flash.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 3
   }
  },
  {
   "kind": "effect",
   "id": "glass-roll",
   "pack": "glass",
   "title": "Glass Roll",
   "description": "Наклон всего кадра на 2,5° с толчком масштаба +3,5 % и пружинным возвратом. Удар на слове; хорошо в паре с glass-flash.",
   "tags": [
    "roll",
    "tilt",
    "impact",
    "наклон",
    "удар",
    "толчок",
    "hud",
    "glass"
   ],
   "tier": "premium",
   "version": "1.0.0",
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "atSec": {
      "default": 1,
      "description": "Момент удара, секунды от начала сцены (ставить на главное слово)",
      "type": "number",
      "minimum": 0
     },
     "power": {
      "default": 1,
      "description": "Сила: угол 2,5° × power",
      "type": "number",
      "minimum": 0,
      "maximum": 3
     },
     "direction": {
      "default": "right",
      "description": "В какую сторону наклон (чередовать на соседних ударах)",
      "type": "string",
      "enum": [
       "right",
       "left"
      ]
     },
     "background": {
      "default": "#0A0A0B",
      "description": "Фон, открывающийся в углах под наклоном",
      "type": "string"
     }
    }
   },
   "defaults": {
    "atSec": 1,
    "power": 1,
    "direction": "right",
    "background": "#0A0A0B"
   },
   "preview": {
    "video": "previews/effect/glass-roll.mp4",
    "poster": "previews/effect/glass-roll.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 3
   }
  },
  {
   "kind": "effect",
   "id": "glass-shake",
   "pack": "glass",
   "title": "Glass Shake",
   "description": "Короткая тряска кадра 0,13 с: ±18 px с затуханием, новая точка каждые 1/30 с. Для «сломалось», «бах», резкой ошибки.",
   "tags": [
    "shake",
    "impact",
    "тряска",
    "удар",
    "ошибка",
    "hud",
    "glass"
   ],
   "tier": "premium",
   "version": "1.0.0",
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "atSec": {
      "default": 1,
      "description": "Момент удара, секунды от начала сцены (ставить на главное слово)",
      "type": "number",
      "minimum": 0
     },
     "power": {
      "default": 1,
      "description": "Сила: амплитуда 18 px × power",
      "type": "number",
      "minimum": 0,
      "maximum": 3
     },
     "seed": {
      "default": 0,
      "description": "Вариант рисунка тряски",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
     },
     "background": {
      "default": "#0A0A0B",
      "description": "Фон, открывающийся по краям при сдвиге",
      "type": "string"
     }
    }
   },
   "defaults": {
    "atSec": 1,
    "power": 1,
    "seed": 0,
    "background": "#0A0A0B"
   },
   "preview": {
    "video": "previews/effect/glass-shake.mp4",
    "poster": "previews/effect/glass-shake.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 3
   }
  },
  {
   "kind": "effect",
   "id": "cam-punch-in",
   "pack": "cam",
   "title": "Cam Punch-in",
   "description": "Резкий наезд на говорящую голову вокруг точки кадра по списку моментов: на склейках и смене мысли картинка то 1.0, то 1.15. Монтаж «в стиле Saraev» — динамика без смены плана.",
   "tags": [
    "punch-in",
    "zoom",
    "наезд",
    "зум",
    "склейка",
    "говорящая голова",
    "talking head",
    "jump cut",
    "cam"
   ],
   "tier": "premium",
   "version": "1.0.0",
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "x": {
      "default": 0.5,
      "description": "Точка наезда по X, доля ширины кадра (центр лица)",
      "type": "number",
      "minimum": 0,
      "maximum": 1
     },
     "y": {
      "default": 0.4,
      "description": "Точка наезда по Y, доля высоты кадра (центр лица)",
      "type": "number",
      "minimum": 0,
      "maximum": 1
     },
     "moments": {
      "default": [
       {
        "atSec": 1,
        "scale": 1.15
       },
       {
        "atSec": 2.5,
        "scale": 1
       }
      ],
      "description": "Моменты смены масштаба; до первого — 1.0",
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "atSec": {
         "type": "number",
         "minimum": 0,
         "description": "Секунда сцены, с которой действует масштаб"
        },
        "scale": {
         "type": "number",
         "minimum": 1,
         "maximum": 2,
         "description": "Масштаб с этого момента и до следующего (1 — без наезда, 1.15 — наезд)"
        }
       },
       "required": [
        "atSec",
        "scale"
       ]
      }
     },
     "rampSec": {
      "default": 0,
      "description": "Плавность смены, сек; 0 — мгновенно, как на склейке",
      "type": "number",
      "minimum": 0,
      "maximum": 1
     }
    }
   },
   "defaults": {
    "x": 0.5,
    "y": 0.4,
    "moments": [
     {
      "atSec": 1,
      "scale": 1.15
     },
     {
      "atSec": 2.5,
      "scale": 1
     }
    ],
    "rampSec": 0
   },
   "preview": {
    "video": "previews/effect/cam-punch-in.mp4",
    "poster": "previews/effect/cam-punch-in.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 3
   }
  },
  {
   "kind": "effect",
   "id": "cam-card",
   "pack": "cam",
   "title": "Cam Card",
   "description": "Съёмка в карточке снизу кадра (скруглённые верхние углы, обводка, тень); над ней свободное место под панель cam-panel или заголовок. Опционально кадр перетекает из полного в карточку на заданной секунде.",
   "tags": [
    "card",
    "карточка",
    "панель",
    "talking head",
    "говорящая голова",
    "morph",
    "композиция",
    "cam",
    "glass"
   ],
   "tier": "premium",
   "version": "1.0.0",
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "top": {
      "default": 0.649,
      "description": "Верх карточки, доля высоты кадра (1247/1920 = 0.649)",
      "type": "number",
      "minimum": 0,
      "maximum": 1
     },
     "radius": {
      "default": 0.065,
      "description": "Радиус верхних углов, доля ширины кадра (70/1080)",
      "type": "number",
      "minimum": 0,
      "maximum": 1
     },
     "scale": {
      "default": 1,
      "description": "Масштаб кадра внутри карточки (1.0–1.1: лицо покрупнее)",
      "type": "number",
      "minimum": 1,
      "maximum": 1.5
     },
     "originX": {
      "default": 0.5,
      "description": "Точка масштаба по X, доля кадра",
      "type": "number",
      "minimum": 0,
      "maximum": 1
     },
     "originY": {
      "default": 1,
      "description": "Точка масштаба по Y, доля кадра (1 — низ: голова уходит вверх, низ кадра на месте)",
      "type": "number",
      "minimum": 0,
      "maximum": 1
     },
     "enterSec": {
      "default": 0,
      "description": "С какой секунды сцены кадр перетекает в форму; 0 — сразу в форме с первого кадра",
      "type": "number",
      "minimum": 0
     },
     "exitSec": {
      "default": 0,
      "description": "С какой секунды возвращается на весь кадр; 0 — не возвращается",
      "type": "number",
      "minimum": 0
     },
     "morphSec": {
      "default": 0.3,
      "description": "Длительность морфа, сек (в cam-engine 18 к. @60 = 0,3 с)",
      "type": "number",
      "minimum": 0.05,
      "maximum": 2
     },
     "background": {
      "default": "#0A0A0B",
      "description": "Цвет фона вокруг формы (hex)",
      "type": "string"
     },
     "grid": {
      "default": true,
      "description": "Сетка 108 px + виньетка поверх фона",
      "type": "boolean"
     }
    }
   },
   "defaults": {
    "top": 0.649,
    "radius": 0.065,
    "scale": 1,
    "originX": 0.5,
    "originY": 1,
    "enterSec": 0,
    "exitSec": 0,
    "morphSec": 0.3,
    "background": "#0A0A0B",
    "grid": true
   },
   "preview": {
    "video": "previews/effect/cam-card.mp4",
    "poster": "previews/effect/cam-card.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 3
   }
  },
  {
   "kind": "effect",
   "id": "cam-pip",
   "pack": "cam",
   "title": "Cam PiP",
   "description": "Видео сцены уменьшается в кружок в углу кадра (лицо в круге, тень, обводка), остальное занимает фон. Лицо поверх скринкаста/кода: кружок-«ведущий».",
   "tags": [
    "pip",
    "picture in picture",
    "кружок",
    "лицо",
    "угол",
    "круг",
    "ведущий",
    "cam"
   ],
   "tier": "premium",
   "version": "1.0.0",
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "corner": {
      "default": "tr",
      "description": "Угол: tr верх-право, tl верх-лево, bl низ-лево, br низ-право",
      "type": "string",
      "enum": [
       "tr",
       "tl",
       "bl",
       "br"
      ]
     },
     "diameter": {
      "default": 0.3056,
      "description": "Диаметр кружка, доля короткой стороны кадра (330/1080)",
      "type": "number",
      "minimum": 0,
      "maximum": 1
     },
     "focusX": {
      "default": 0.5,
      "description": "Центр лица в исходном кадре по X, доля ширины",
      "type": "number",
      "minimum": 0,
      "maximum": 1
     },
     "focusY": {
      "default": 0.4,
      "description": "Центр лица в исходном кадре по Y, доля высоты",
      "type": "number",
      "minimum": 0,
      "maximum": 1
     },
     "zoom": {
      "default": 1.6,
      "description": "Во сколько раз лицо крупнее минимального охвата кружком (1 — виден весь кадр по короткой стороне)",
      "type": "number",
      "minimum": 1,
      "maximum": 4
     },
     "enterSec": {
      "default": 0,
      "description": "С какой секунды сцены кадр перетекает в форму; 0 — сразу в форме с первого кадра",
      "type": "number",
      "minimum": 0
     },
     "exitSec": {
      "default": 0,
      "description": "С какой секунды возвращается на весь кадр; 0 — не возвращается",
      "type": "number",
      "minimum": 0
     },
     "morphSec": {
      "default": 0.3,
      "description": "Длительность морфа, сек (в cam-engine 18 к. @60 = 0,3 с)",
      "type": "number",
      "minimum": 0.05,
      "maximum": 2
     },
     "background": {
      "default": "#0A0A0B",
      "description": "Цвет фона вокруг формы (hex)",
      "type": "string"
     },
     "grid": {
      "default": true,
      "description": "Сетка 108 px + виньетка поверх фона",
      "type": "boolean"
     }
    }
   },
   "defaults": {
    "corner": "tr",
    "diameter": 0.3056,
    "focusX": 0.5,
    "focusY": 0.4,
    "zoom": 1.6,
    "enterSec": 0,
    "exitSec": 0,
    "morphSec": 0.3,
    "background": "#0A0A0B",
    "grid": true
   },
   "preview": {
    "video": "previews/effect/cam-pip.mp4",
    "poster": "previews/effect/cam-pip.jpg",
    "width": 540,
    "height": 960,
    "durationSec": 3
   }
  },
  {
   "kind": "effect",
   "id": "cam-screen-zoom",
   "pack": "cam",
   "title": "Cam Screen Zoom",
   "description": "Запись экрана с автозумом и плавным курсором: наезжает на места кликов из списка, рисует курсор (стрелка/рука/текст) и кольцо клика. Режим full — на весь кадр, top — стеклянное окно в верхней части кадра (под ним место для карточки с лицом). Сцена — видео записи экрана.",
   "tags": [
    "screen",
    "screencast",
    "скринкаст",
    "запись экрана",
    "курсор",
    "клик",
    "автозум",
    "zoom",
    "cursor",
    "cam"
   ],
   "tier": "premium",
   "version": "1.0.0",
   "props": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
     "clicks": {
      "default": [
       {
        "atSec": 1,
        "x": 0.3,
        "y": 0.3,
        "cursor": "arrow"
       },
       {
        "atSec": 2.2,
        "x": 0.7,
        "y": 0.55,
        "cursor": "hand"
       }
      ],
      "description": "Клики по порядку: курсор летит к следующему, камера наезжает на кластеры кликов",
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "atSec": {
         "type": "number",
         "minimum": 0,
         "description": "Секунда сцены, когда происходит клик (кольцо, нажатие курсора)"
        },
        "x": {
         "type": "number",
         "minimum": 0,
         "maximum": 1,
         "description": "Точка клика по X, доля ширины записи"
        },
        "y": {
         "type": "number",
         "minimum": 0,
         "maximum": 1,
         "description": "Точка клика по Y, доля высоты записи"
        },
        "cursor": {
         "default": "arrow",
         "description": "Вид курсора в точке: arrow — стрелка, hand — рука (ссылка), ibeam — текст",
         "type": "string",
         "enum": [
          "arrow",
          "hand",
          "ibeam"
         ]
        }
       },
       "required": [
        "atSec",
        "x",
        "y"
       ]
      }
     },
     "mode": {
      "default": "full",
      "description": "full — запись на весь кадр; top — окно с рамкой вверху кадра (9:16: Y 250–1010)",
      "type": "string",
      "enum": [
       "full",
       "top"
      ]
     },
     "captureAspect": {
      "default": 0,
      "description": "Пропорции записи (ширина/высота), напр. 1.778 для 16:9; 0 — как у кадра ролика. Координаты кликов — доли именно этой записи",
      "type": "number",
      "minimum": 0,
      "maximum": 4
     },
     "startX": {
      "default": 0.5,
      "description": "Где курсор в начале, доля ширины записи",
      "type": "number",
      "minimum": 0,
      "maximum": 1
     },
     "startY": {
      "default": 0.5,
      "description": "Где курсор в начале, доля высоты записи",
      "type": "number",
      "minimum": 0,
      "maximum": 1
     },
     "auto": {
      "default": true,
      "description": "Автозум на клики; false — камера по умолчанию (покрытие вьюпорта) без наездов",
      "type": "boolean"
     },
     "zoomMax": {
      "default": 0,
      "description": "Потолок зума (ширина записи / видимая ширина); 0 — по умолчанию (2.0–2.5)",
      "type": "number",
      "minimum": 0,
      "maximum": 4
     },
     "cursor": {
      "default": true,
      "description": "Рисовать курсор",
      "type": "boolean"
     },
     "clickRing": {
      "default": true,
      "description": "Кольцо-рябь на клике",
      "type": "boolean"
     },
     "accent": {
      "default": "#C6FF3D",
      "description": "Цвет кольца клика (hex)",
      "type": "string"
     },
     "background": {
      "default": "#0A0A0B",
      "description": "Цвет фона вокруг формы (hex)",
      "type": "string"
     },
     "grid": {
      "default": true,
      "description": "Сетка 108 px + виньетка поверх фона",
      "type": "boolean"
     }
    }
   },
   "defaults": {
    "clicks": [
     {
      "atSec": 1,
      "x": 0.3,
      "y": 0.3,
      "cursor": "arrow"
     },
     {
      "atSec": 2.2,
      "x": 0.7,
      "y": 0.55,
      "cursor": "hand"
     }
    ],
    "mode": "full",
    "captureAspect": 0,
    "startX": 0.5,
    "startY": 0.5,
    "auto": true,
    "zoomMax": 0,
    "cursor": true,
    "clickRing": true,
    "accent": "#C6FF3D",
    "background": "#0A0A0B",
    "grid": true
   },
   "preview": {
    "video": "previews/effect/cam-screen-zoom.mp4",
    "poster": "previews/effect/cam-screen-zoom.jpg",
    "width": 960,
    "height": 540,
    "durationSec": 3
   }
  }
 ]
}