- z51-pug-builder: Svelte 5 SPA, визуальный редактор Pug-писем - email-gen: Node.js рендерер Pug→HTML через email-templates + Juice - email-gen-api: HTTP сервер рендеринга (порт 8787) - coin-scout: сервис подбора монет из фидов - Docker Compose для dev/prod - Nginx конфиг с SSL для app.aspekter.ru
498 lines
24 KiB
JSON
498 lines
24 KiB
JSON
{
|
||
"id": "ced0b6a1-73ac-4c1e-bf68-2516b7641044",
|
||
"name": "19-02-2026 Winx Club",
|
||
"title": "Winx Club",
|
||
"date": "2026-02-19",
|
||
"createdAt": "2026-02-18T11:09:24.751Z",
|
||
"updatedAt": "2026-02-18T11:58:20.745Z",
|
||
"blocks": [
|
||
{
|
||
"name": "Заголовок зеленый",
|
||
"content": "tr \n td.paddingWrapperBig\n +defaultTable(\"100%\")\n tr \n td(align=\"center\")\n span.text.smallHeader.bold.greenText Привет, колдун!",
|
||
"collapsed": false,
|
||
"schema": [
|
||
{
|
||
"type": "text",
|
||
"label": "Текст",
|
||
"lineIndex": 5
|
||
}
|
||
],
|
||
"addSpacing": true,
|
||
"spacing": 20
|
||
},
|
||
{
|
||
"name": "Текст",
|
||
"content": "tr \n td.paddingWrapperBig\n +defaultTable(\"100%\")\n tr \n td \n span.text.groceryText Помнишь те времена, когда ты возвращался из школы и включал телевизор? Давай честно, ты тоже залипал на приключения фей из Алфеи! Даже я на своей планетке подрубался к стриму с Земли...",
|
||
"collapsed": true,
|
||
"schema": [
|
||
{
|
||
"type": "text",
|
||
"label": "Текст",
|
||
"lineIndex": 5,
|
||
"paragraphIndex": 1,
|
||
"removable": false
|
||
}
|
||
],
|
||
"addSpacing": true,
|
||
"spacing": 40
|
||
},
|
||
{
|
||
"name": "Банер",
|
||
"content": "tr \n td(align=\"center\") \n a(href=\"https://z51.ru/\" target=\"_blank\")\n img(src=\"https://z51.ru/upload/email/newsletter-2026/02-18/1.png\" alt=\"pic\" style=\"display: block\" width=\"600\")",
|
||
"collapsed": true,
|
||
"schema": [
|
||
{
|
||
"type": "href",
|
||
"label": "Ссылка",
|
||
"lineIndex": 2,
|
||
"occurrence": 0
|
||
},
|
||
{
|
||
"type": "src",
|
||
"label": "Картинка",
|
||
"lineIndex": 3,
|
||
"occurrence": 0
|
||
}
|
||
],
|
||
"addSpacing": true
|
||
},
|
||
{
|
||
"name": "Текст",
|
||
"content": "tr \n td.paddingWrapperBig\n +defaultTable(\"100%\")\n tr \n td \n span.text.groceryText Так вот, студия Iron Frog и издатель Maximum Entertainment решили, что пора, и анонсировали Winx Club: The Magic is Back. Игра выходит на ПК и консолях уже в апреле 2026 года!\n +spacerLine(20)\n tr\n td\n span.text.groceryText Ностальгия в глаз попала? Отвлекись на кресла, там тоже есть на что залипнуть:",
|
||
"collapsed": true,
|
||
"schema": [
|
||
{
|
||
"type": "text",
|
||
"label": "Текст",
|
||
"lineIndex": 5,
|
||
"paragraphIndex": 1,
|
||
"removable": false
|
||
},
|
||
{
|
||
"type": "text",
|
||
"label": "Текст",
|
||
"lineIndex": 9,
|
||
"paragraphIndex": 2,
|
||
"removable": true
|
||
}
|
||
],
|
||
"addSpacing": true,
|
||
"spacing": 25
|
||
},
|
||
{
|
||
"name": "Кнопка",
|
||
"content": "tr \n td(align=\"center\").paddingWrapper \n +buttonRounded(\"Залипнуть\", \"https://z51.ru/catalog/\", 525, 42, \"#c9e905\", 18, \"#000000\", 4, \"#c9e905\").bold.text",
|
||
"collapsed": false,
|
||
"schema": [
|
||
{
|
||
"type": "mixin-text",
|
||
"label": "Текст кнопки",
|
||
"lineIndex": 2,
|
||
"argIndex": 0
|
||
},
|
||
{
|
||
"type": "mixin-href",
|
||
"label": "Ссылка кнопки",
|
||
"lineIndex": 2,
|
||
"argIndex": 1
|
||
}
|
||
],
|
||
"addSpacing": true
|
||
},
|
||
{
|
||
"name": "3 товара в ряд",
|
||
"content": "+products3inRow({\n '145105': {\n imageSrc: '',\n name: 'Imperial Royal',\n category: 'Королевский трон у тебя дома',\n },\n '144171': {\n imageSrc: '',\n name: 'Cardinal',\n category: 'Для настоящих кардиналов',\n },\n '142097': {\n imageSrc: '',\n name: 'Cyberpunk Limited',\n category: 'Только для потных каток!',\n },\n})",
|
||
"collapsed": false,
|
||
"schema": [
|
||
{
|
||
"type": "raw",
|
||
"label": "Код блока"
|
||
}
|
||
],
|
||
"addSpacing": true
|
||
},
|
||
{
|
||
"name": "Две кнопки",
|
||
"content": "tr \n td.paddingWrapper \n +defaultTable(\"100%\")\n tr \n td(width=\"250\")\n +defaultTable(\"250\")\n tr \n td(align=\"center\")\n +buttonRounded(\"Игровые кресла\", \"https://z51.ru/catalog/kresla/\", 240, 42, \"#c9e905\", 18, \"#000000\", 4, \"#c9e905\").bold.text\n +tdFixed(36)\n td(width=\"250\")\n +defaultTable(\"250\")\n tr \n td(align=\"center\")\n +buttonRounded(\"Эргономичные кресла\", \"https://z51.ru/catalog/ergonomic-office-chairs/\", 240, 42, \"#c9e905\", 18, \"#000000\", 4, \"#c9e905\", 4).bold.text",
|
||
"collapsed": false,
|
||
"schema": [
|
||
{
|
||
"type": "mixin-text",
|
||
"label": "Текст кнопки",
|
||
"lineIndex": 8,
|
||
"argIndex": 0
|
||
},
|
||
{
|
||
"type": "mixin-href",
|
||
"label": "Ссылка кнопки",
|
||
"lineIndex": 8,
|
||
"argIndex": 1
|
||
},
|
||
{
|
||
"type": "mixin-text",
|
||
"label": "Текст кнопки",
|
||
"lineIndex": 14,
|
||
"argIndex": 0
|
||
},
|
||
{
|
||
"type": "mixin-href",
|
||
"label": "Ссылка кнопки",
|
||
"lineIndex": 14,
|
||
"argIndex": 1
|
||
}
|
||
],
|
||
"addSpacing": true
|
||
},
|
||
{
|
||
"name": "Разделитель",
|
||
"content": "+dividerZ(525, 2)\n+spacerLine(40)",
|
||
"collapsed": false,
|
||
"schema": [],
|
||
"addSpacing": true
|
||
},
|
||
{
|
||
"name": "Заголовок зеленый",
|
||
"content": "tr \n td.paddingWrapperBig\n +defaultTable(\"100%\")\n tr \n td(align=\"center\")\n span.text.smallHeader.bold.greenText ЭНЧАНТИКС!",
|
||
"collapsed": false,
|
||
"schema": [
|
||
{
|
||
"type": "text",
|
||
"label": "Текст",
|
||
"lineIndex": 5
|
||
}
|
||
],
|
||
"addSpacing": true,
|
||
"spacing": 20
|
||
},
|
||
{
|
||
"name": "Текст",
|
||
"content": "tr \n td.paddingWrapperBig\n +defaultTable(\"100%\")\n tr \n td \n span.text.groceryText Разрабы обещают вернуть дух оригинального сериала, но в современной оболочке. Что нас ждет:",
|
||
"collapsed": false,
|
||
"schema": [
|
||
{
|
||
"type": "text",
|
||
"label": "Текст",
|
||
"lineIndex": 5,
|
||
"paragraphIndex": 1,
|
||
"removable": false
|
||
}
|
||
],
|
||
"addSpacing": true,
|
||
"spacing": 20
|
||
},
|
||
{
|
||
"name": "Маркированный список",
|
||
"content": "\ntr \n td.paddingWrapper\n +defaultTable(\"100%\")\n tr \n +tdFixed(12, \"center\", \"top\").markerPadding\n img(src=\"https://z51.ru/upload/email/master-template/markers/marker.png\" alt=\"\" width=\"12\")\n +tdFixed(16)\n td \n span.text.groceryText Магические бои — да, пострелять заклинаниями все-таки дадут.\n tr \n +tdFixed(12, \"center\", \"top\").markerPadding\n img(src=\"https://z51.ru/upload/email/master-template/markers/marker.png\" alt=\"\" width=\"12\")\n +tdFixed(16)\n td \n span.text.groceryText Головоломки — без них никуда, Алфея не терпит тупых!\n tr \n +tdFixed(12, \"center\", \"top\").markerPadding\n img(src=\"https://z51.ru/upload/email/master-template/markers/marker.png\" alt=\"\" width=\"12\")\n +tdFixed(16)\n td \n span.text.groceryText Кооператив — причем локальный на двоих. Можно позвать друга и наконец-то выяснить, кто из вас помнит имена всех фей.
",
|
||
"collapsed": false,
|
||
"schema": [
|
||
{
|
||
"type": "list-item",
|
||
"label": "Пункт",
|
||
"lineIndex": 9,
|
||
"itemIndex": 0,
|
||
"removable": false
|
||
},
|
||
{
|
||
"type": "list-item",
|
||
"label": "Пункт",
|
||
"lineIndex": 15,
|
||
"itemIndex": 1,
|
||
"removable": true
|
||
},
|
||
{
|
||
"type": "list-item",
|
||
"label": "Пункт",
|
||
"lineIndex": 21,
|
||
"itemIndex": 2,
|
||
"removable": true
|
||
}
|
||
],
|
||
"addSpacing": true,
|
||
"spacing": 20
|
||
},
|
||
{
|
||
"name": "Текст",
|
||
"content": "tr \n td.paddingWrapperBig\n +defaultTable(\"100%\")\n tr \n td \n span.text.groceryText Управлять можно всеми шестью феями оригинального состава: Блум, Стеллой, Флорой, Музой, Текной и Лейлой (вот тебе все имена, если вдруг подзабыл).",
|
||
"collapsed": false,
|
||
"schema": [
|
||
{
|
||
"type": "text",
|
||
"label": "Текст",
|
||
"lineIndex": 5,
|
||
"paragraphIndex": 1,
|
||
"removable": false
|
||
}
|
||
],
|
||
"addSpacing": true
|
||
},
|
||
{
|
||
"name": "Банер",
|
||
"content": "tr \n td(align=\"center\") \n a(href=\"https://z51.ru\" target=\"_blank\")\n img(src=\"https://z51.ru/upload/email/newsletter-2026/02-18/2.png\" alt=\"pic\" style=\"display: block\" width=\"600\")",
|
||
"collapsed": false,
|
||
"schema": [
|
||
{
|
||
"type": "href",
|
||
"label": "Ссылка",
|
||
"lineIndex": 2,
|
||
"occurrence": 0
|
||
},
|
||
{
|
||
"type": "src",
|
||
"label": "Картинка",
|
||
"lineIndex": 3,
|
||
"occurrence": 0
|
||
}
|
||
],
|
||
"addSpacing": true
|
||
},
|
||
{
|
||
"name": "Разделитель",
|
||
"content": "+dividerZ(525, 2)\n+spacerLine(40)",
|
||
"collapsed": false,
|
||
"schema": [],
|
||
"addSpacing": true
|
||
},
|
||
{
|
||
"name": "Заголовок зеленый",
|
||
"content": "tr \n td.paddingWrapperBig\n +defaultTable(\"100%\")\n tr \n td(align=\"center\")\n span.text.smallHeader.bold.greenText Где колдуем?",
|
||
"collapsed": false,
|
||
"schema": [
|
||
{
|
||
"type": "text",
|
||
"label": "Текст",
|
||
"lineIndex": 5
|
||
}
|
||
],
|
||
"addSpacing": true
|
||
},
|
||
{
|
||
"name": "Текст",
|
||
"content": "tr \n td.paddingWrapperBig\n +defaultTable(\"100%\")\n tr \n td \n span.text.groceryText Карта локаций обещает быть сочной и прямиком из детства:\n",
|
||
"collapsed": false,
|
||
"schema": [
|
||
{
|
||
"type": "text",
|
||
"label": "Текст",
|
||
"lineIndex": 5,
|
||
"paragraphIndex": 1,
|
||
"removable": false
|
||
}
|
||
],
|
||
"addSpacing": true,
|
||
"spacing": 30
|
||
},
|
||
{
|
||
"name": "Текст",
|
||
"content": "tr \n td.paddingWrapperBig\n +defaultTable(\"100%\")\n tr \n td \n span.text.groceryText 1. Школа Алфея;<br>2. Зачарованный лес;<br>3. Прибрежные утесы;<br>4. Красный Фонтан (это где беловолосые мужики тусовались).",
|
||
"collapsed": false,
|
||
"schema": [
|
||
{
|
||
"type": "text",
|
||
"label": "Текст",
|
||
"lineIndex": 5,
|
||
"paragraphIndex": 1,
|
||
"removable": false
|
||
}
|
||
],
|
||
"addSpacing": true
|
||
},
|
||
{
|
||
"name": "Текст",
|
||
"content": "tr \n td.paddingWrapperBig\n +defaultTable(\"100%\")\n tr \n td \n span.text.groceryText Игрокам предстоит отражать атаки фантастических тварей, прокачивать заклинания и становиться сильнее. Всё как мы любим: и фан, и фарма.",
|
||
"collapsed": false,
|
||
"schema": [
|
||
{
|
||
"type": "text",
|
||
"label": "Текст",
|
||
"lineIndex": 5,
|
||
"paragraphIndex": 1,
|
||
"removable": false
|
||
}
|
||
],
|
||
"addSpacing": true
|
||
},
|
||
{
|
||
"name": "Разделитель",
|
||
"content": "+dividerZ(525, 2)\n+spacerLine(40)",
|
||
"collapsed": false,
|
||
"schema": [],
|
||
"addSpacing": true
|
||
},
|
||
{
|
||
"name": "Заголовок зеленый",
|
||
"content": "tr \n td.paddingWrapperBig\n +defaultTable(\"100%\")\n tr \n td(align=\"center\")\n span.text.smallHeader.bold.greenText ЖДЕШЬ?!",
|
||
"collapsed": false,
|
||
"schema": [
|
||
{
|
||
"type": "text",
|
||
"label": "Текст",
|
||
"lineIndex": 5
|
||
}
|
||
],
|
||
"addSpacing": true,
|
||
"spacing": 20
|
||
},
|
||
{
|
||
"name": "Текст",
|
||
"content": "tr \n td.paddingWrapperBig\n +defaultTable(\"100%\")\n tr \n td \n span.text.groceryText Не знаю, как ты, а я прям вдохновился... Понятно, что это все рофл, но все-таки я хочу, чтобы игруля вышла достойной и не опозорила честь школы волшебниц!\n +spacerLine(20)\n tr\n td\n span.text.groceryText А вот кто всегда держит марку, так это мои кресла (иначе я их сжигаю, ха-ха-ха):",
|
||
"collapsed": false,
|
||
"schema": [
|
||
{
|
||
"type": "text",
|
||
"label": "Текст",
|
||
"lineIndex": 5,
|
||
"paragraphIndex": 1,
|
||
"removable": false
|
||
},
|
||
{
|
||
"type": "text",
|
||
"label": "Текст",
|
||
"lineIndex": 9,
|
||
"paragraphIndex": 2,
|
||
"removable": true
|
||
}
|
||
],
|
||
"addSpacing": true
|
||
},
|
||
{
|
||
"name": "Кнопка",
|
||
"content": "tr \n td(align=\"center\").paddingWrapper \n +buttonRounded(\"Чекнуть\", \"https://z51.ru/catalog/\", 525, 42, \"#c9e905\", 18, \"#000000\", 4, \"#c9e905\").bold.text",
|
||
"collapsed": false,
|
||
"schema": [
|
||
{
|
||
"type": "mixin-text",
|
||
"label": "Текст кнопки",
|
||
"lineIndex": 2,
|
||
"argIndex": 0
|
||
},
|
||
{
|
||
"type": "mixin-href",
|
||
"label": "Ссылка кнопки",
|
||
"lineIndex": 2,
|
||
"argIndex": 1
|
||
}
|
||
],
|
||
"addSpacing": true
|
||
},
|
||
{
|
||
"name": "3 товара в ряд",
|
||
"content": "+products3inRow({\n '144270': {\n imageSrc: '',\n name: 'Tanuki',\n category: 'Удача всегда с тобой',\n },\n '144839': {\n imageSrc: '',\n name: 'Bad Bunny',\n category: 'Осторожно, кролик плохой!',\n },\n '141580': {\n imageSrc: '',\n name: 'Aniki',\n category: 'Дэнжн-мастер',\n },\n})",
|
||
"collapsed": false,
|
||
"schema": [
|
||
{
|
||
"type": "raw",
|
||
"label": "Код блока"
|
||
}
|
||
],
|
||
"addSpacing": true
|
||
},
|
||
{
|
||
"name": "Две кнопки",
|
||
"content": "tr \n td.paddingWrapper \n +defaultTable(\"100%\")\n tr \n td(width=\"250\")\n +defaultTable(\"250\")\n tr \n td(align=\"center\")\n +buttonRounded(\"Игровые кресла\", \"https://z51.ru/catalog/kresla/\", 240, 42, \"#c9e905\", 18, \"#000000\", 4, \"#c9e905\").bold.text\n +tdFixed(36)\n td(width=\"250\")\n +defaultTable(\"250\")\n tr \n td(align=\"center\")\n +buttonRounded(\"Эргономичные кресла\", \"https://z51.ru/catalog/ergonomic-office-chairs/\", 240, 42, \"#c9e905\", 18, \"#000000\", 4, \"#c9e905\", 4).bold.text",
|
||
"collapsed": false,
|
||
"schema": [
|
||
{
|
||
"type": "mixin-text",
|
||
"label": "Текст кнопки",
|
||
"lineIndex": 8,
|
||
"argIndex": 0
|
||
},
|
||
{
|
||
"type": "mixin-href",
|
||
"label": "Ссылка кнопки",
|
||
"lineIndex": 8,
|
||
"argIndex": 1
|
||
},
|
||
{
|
||
"type": "mixin-text",
|
||
"label": "Текст кнопки",
|
||
"lineIndex": 14,
|
||
"argIndex": 0
|
||
},
|
||
{
|
||
"type": "mixin-href",
|
||
"label": "Ссылка кнопки",
|
||
"lineIndex": 14,
|
||
"argIndex": 1
|
||
}
|
||
],
|
||
"addSpacing": true
|
||
},
|
||
{
|
||
"name": "Разделитель",
|
||
"content": "+dividerZ(525, 2)\n+spacerLine(40)",
|
||
"collapsed": false,
|
||
"schema": [],
|
||
"addSpacing": true
|
||
},
|
||
{
|
||
"name": "Блок преимуществ",
|
||
"content": "tr \n td.paddingWrapperBig\n +defaultTable(\"100%\")\n tr \n td(align=\"center\")\n span.text.smallHeader.bold.greenText Почему выбирают товары у Баззи?\n\n+spacerLine(40)\n\ntr \n td.paddingWrapper \n +defaultTable(\"100%\")\n tr \n td(width=\"250\" valign=\"top\")\n +defaultTable(\"250\")\n //Unordered List\n tr \n td\n +defaultTable(\"100%\")\n tr \n +tdFixed(12, \"center\", \"top\").markerPadding\n img(src=\"https://z51.ru/upload/email/master-template/markers/marker.png\" alt=\"pic\" width=\"12\")\n +tdFixed(10)\n td \n span.groceryText <span style=\"font-weight: 700; color: #DAFD04;\">Официальный магазин</span><br />В наличии всё самое вкусное от ZONE 51 — кресла, столы, периферия и аксессуары\n +spacerLine(20)\n tr \n +tdFixed(12, \"center\", \"top\").markerPadding\n img(src=\"https://z51.ru/upload/email/master-template/markers/marker.png\" alt=\"pic\" width=\"12\")\n +tdFixed(10)\n td \n span.groceryText <span style=\"font-weight: 700; color: #DAFD04;\">Первоклассные и надежные продукты</span><br />Из качественных, инопланетных и безопасных материалов для себя, родных и друзей. Не понравилось? Можешь вернуть в течение 28 дней с даты приобретения\n +tdFixed(36)\n td(width=\"250\" valign=\"top\")\n +defaultTable(\"250\")\n tr \n td\n +defaultTable(\"100%\")\n tr \n +tdFixed(12, \"center\", \"top\").markerPadding\n img(src=\"https://z51.ru/upload/email/master-template/markers/marker.png\" alt=\"pic\" width=\"12\")\n +tdFixed(10)\n td \n span.groceryText <span style=\"font-weight: 700; color: #DAFD04;\">Новинки и эксклюзивы</span><br />Я постоянно потею над новыми товарами, которые можно приобрести только здесь\n +spacerLine(20)\n tr \n +tdFixed(12, \"center\", \"top\").markerPadding\n img(src=\"https://z51.ru/upload/email/master-template/markers/marker.png\" alt=\"pic\" width=\"12\")\n +tdFixed(10)\n td \n span.groceryText <span style=\"font-weight: 700; color: #DAFD04;\">Клиенто-ориентированность</span><br />Даю до 3 лет гарантии на свой товар +1 год за покупку в фирменном магазине ZONE 51 (онлайн и офлайн), а человеки у трубки помогут быстро обкашлять любые вопросы\n+spacerLine(40)\n\ntr \n td(align=\"center\").paddingWrapper \n +buttonRounded(\"Залетай к нам!\", \"https://z51.ru/\", 300, 42, \"#c9e905\", 18, \"#000000\", 4, \"#c9e905\").bold.text",
|
||
"collapsed": false,
|
||
"schema": [
|
||
{
|
||
"type": "text",
|
||
"label": "Текст",
|
||
"lineIndex": 5
|
||
},
|
||
{
|
||
"type": "src",
|
||
"label": "Картинка",
|
||
"lineIndex": 21,
|
||
"occurrence": 0
|
||
},
|
||
{
|
||
"type": "text",
|
||
"label": "Текст",
|
||
"lineIndex": 24
|
||
},
|
||
{
|
||
"type": "src",
|
||
"label": "Картинка",
|
||
"lineIndex": 28,
|
||
"occurrence": 0
|
||
},
|
||
{
|
||
"type": "text",
|
||
"label": "Текст",
|
||
"lineIndex": 31
|
||
},
|
||
{
|
||
"type": "src",
|
||
"label": "Картинка",
|
||
"lineIndex": 40,
|
||
"occurrence": 0
|
||
},
|
||
{
|
||
"type": "text",
|
||
"label": "Текст",
|
||
"lineIndex": 43
|
||
},
|
||
{
|
||
"type": "src",
|
||
"label": "Картинка",
|
||
"lineIndex": 47,
|
||
"occurrence": 0
|
||
},
|
||
{
|
||
"type": "text",
|
||
"label": "Текст",
|
||
"lineIndex": 50
|
||
},
|
||
{
|
||
"type": "mixin-text",
|
||
"label": "Текст кнопки",
|
||
"lineIndex": 55,
|
||
"argIndex": 0
|
||
},
|
||
{
|
||
"type": "mixin-href",
|
||
"label": "Ссылка кнопки",
|
||
"lineIndex": 55,
|
||
"argIndex": 1
|
||
}
|
||
],
|
||
"addSpacing": false
|
||
}
|
||
]
|
||
} |