merge: свести ветку визиток из Gitea с локальной работой по лендингу

Две линии разработки разъехались и месяц жили порознь: в Gitea уехали
электронные визитки с QR-кодом, а в рабочей копии на fortress остались шесть
коммитов, которые до репозитория не дошли и, значит, не попали на сайт —
английская версия с переключателем языков, карточка Бонитировки, логотипы
продуктов, реквизиты компании в подвале, убранная кнопка Telegram, имя
директора латиницей. Плюс незакоммиченное бургер-меню.

Что разрешено вручную:

1. Landing.tsx, блок контактов. Столкнулись наша расстановка (почта главной
   кнопкой с подписью из cta_primary, телефон второй) и правка из Gitea,
   переводящая оба контакта с href на onClick, чтобы адрес и номер не лежали
   в разметке и их не собирали боты. Взято и то, и другое: защита от ботов
   сохранена, порядок и оформление наши, адрес почты в подписи не светится.

2. Коллизия номеров миграций: обе стороны завели номер 003. На живой базе
   применены 001, 002 и 003_business_cards, а 003_product_url_and_requisites
   не выполнялась никогда — она и переименована в 004, чтобы раннер (он
   отслеживает миграции по имени файла) отработал её штатно.

3. package-lock пересобран под слитый манифест, а не выбран со стороны.

Проверено: tsc чист, vite build проходит, 118 модулей, 241 КБ.
This commit is contained in:
zeroday
2026-08-25 22:27:25 +03:00
15 changed files with 1209 additions and 204 deletions
+27
View File
@@ -0,0 +1,27 @@
-- Электронные визитки (управляются из админки)
CREATE TABLE IF NOT EXISTS business_cards (
id SERIAL PRIMARY KEY,
slug TEXT UNIQUE NOT NULL,
name TEXT NOT NULL,
role TEXT,
company TEXT,
phone TEXT,
email TEXT,
telegram TEXT,
photo TEXT, -- data URI (base64), сжимается на клиенте
product_title TEXT,
product_subtitle TEXT,
product_url TEXT,
site_url TEXT,
is_published BOOLEAN DEFAULT true,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
INSERT INTO business_cards
(slug, name, role, company, phone, email, telegram, product_title, product_subtitle, product_url, site_url)
VALUES
('alexey', 'Алексей Павлов', 'Основатель · разработчик', 'ООО «Умный Байт»',
'+7 960 011 0007', 'info@umbyte.ru', NULL,
'АгроТО', 'CMMS для агропромышленности', 'https://agroto.ru', 'https://umbyte.ru')
ON CONFLICT (slug) DO NOTHING;