Initial commit: ASPEKTER — визуальный конструктор email-рассылок

- 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
This commit is contained in:
2026-04-13 11:36:39 +05:00
commit 718821fdd6
282 changed files with 64697 additions and 0 deletions

View File

@@ -0,0 +1,301 @@
[
{
"id": "2a5f5c63-6a25-4dd6-b7f7-c39c2edb3e4f",
"name": "Сходим в рейд?",
"savedAt": "2026-02-05T11:41:15.011Z",
"blocks": [
{
"name": "Банер",
"content": "tr \n td(align=\"center\") \n a(href=\"https://z51.ru/news/2026-gift/\" target=\"_blank\")\n img(src=\"https://z51.ru/upload/email/newsletter-2026/02-06/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(align=\"center\")\n span.text.smallHeader.bold.greenText Привет, геймер!",
"collapsed": true,
"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 ZONE 51 приготовили для тебя двойной бонус:",
"collapsed": true,
"schema": [
{
"type": "text",
"label": "Текст",
"lineIndex": 5,
"paragraphIndex": 1,
"removable": false
}
],
"addSpacing": false,
"spacing": 20
},
{
"name": "Маркированный список",
"content": "+spacerLine(25)\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 ARC Raiders, чтобы отправиться в эпичный рейд.",
"collapsed": true,
"schema": [
{
"type": "list-item",
"label": "Пункт",
"lineIndex": 9,
"itemIndex": 0,
"removable": false
},
{
"type": "list-item",
"label": "Пункт",
"lineIndex": 15,
"itemIndex": 1,
"removable": true
}
],
"addSpacing": true
},
{
"name": "Текст",
"content": "tr \n td.paddingWrapperBig\n +defaultTable(\"100%\")\n tr \n td \n span.text.groceryText Как получить ARC Raiders бесплатно?",
"collapsed": true,
"schema": [
{
"type": "text",
"label": "Текст",
"lineIndex": 5,
"paragraphIndex": 1,
"removable": false
}
],
"addSpacing": true,
"spacing": 25
},
{
"name": "Текст",
"content": "tr \n td.paddingWrapperBig\n +defaultTable(\"100%\")\n tr \n td \n span.text.groceryText 1. Выбирай кресло <span style=\"font-weight: 700;\">без скидок и&nbsp;от&nbsp;24&nbsp;990&nbsp;рублей;</span><br>2. Кидай в&nbsp;корзину;<br>3. Промокод не&nbsp;трожь;<br>4. Видишь баннер о&nbsp;подарке? Готово&nbsp;&mdash; оформляй заказ!",
"collapsed": true,
"schema": [
{
"type": "text",
"label": "Текст",
"lineIndex": 5,
"paragraphIndex": 1,
"removable": false
}
],
"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": true,
"schema": [
{
"type": "mixin-text",
"label": "Текст кнопки",
"lineIndex": 2,
"argIndex": 0
},
{
"type": "mixin-href",
"label": "Ссылка кнопки",
"lineIndex": 2,
"argIndex": 1
}
],
"addSpacing": true
},
{
"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": false
},
{
"name": "Маркированный список",
"content": "+spacerLine(25)\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": true,
"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
},
{
"name": "3 товара в ряд",
"content": "+products3inRow({\n '142511': {\n imageSrc: '',\n name: 'Freelancer W8',\n category: 'Эталон в мире кресел',\n },\n '150677': {\n imageSrc: '',\n name: 'Freelancer K5',\n category: 'Топчик по балансу',\n },\n '147210': {\n imageSrc: '',\n name: 'Freelancer X7',\n category: 'Имба для удаленки',\n },\n})",
"collapsed": true,
"schema": [
{
"type": "raw",
"label": "Код блока"
}
],
"addSpacing": true,
"spacing": 20
},
{
"name": "3 товара в ряд",
"content": "+products3inRow({\n '147316': {\n imageSrc: '',\n name: 'Arena Extreme',\n category: 'Для экстремально потных каток',\n },\n '148494': {\n imageSrc: '',\n name: 'Citadel',\n category: 'Твоя обитель комфорта',\n },\n '146741': {\n imageSrc: '',\n name: 'Rider',\n category: 'Лучшая софа для отдыха',\n },\n})",
"collapsed": true,
"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": true,
"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": "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&nbsp;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;\">Первоклассные и&nbsp;надежные продукты</span><br />Из качественных, инопланетных и <span style=\"text-decoration: line-through;\">вроде как</span> безопасных материалов для себя, родных и&nbsp;друзей. Не&nbsp;понравилось? Можешь вернуть в&nbsp;течение 28 дней с&nbsp;даты приобретения\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 />Я постоянно потею над&nbsp;новыми товарами, которые можно приобрести только здесь\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 лет гарантии на&nbsp;свой товар +1 год за&nbsp;покупку в&nbsp;фирменном магазине ZONE&nbsp;51 (онлайн и&nbsp;офлайн), а&nbsp;человеки у&nbsp;трубки помогут быстро обкашлять любые вопросы\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": true,
"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
}
]
}
]