diff --git a/docs/site-fixes-2026-10-11/REPORT.md b/docs/site-fixes-2026-10-11/REPORT.md index 5fa765b..f4d2f46 100644 --- a/docs/site-fixes-2026-10-11/REPORT.md +++ b/docs/site-fixes-2026-10-11/REPORT.md @@ -184,3 +184,27 @@ net8.0` (не `net8.0-windows`) + Avalonia (кроссплатформенный `API-токен`, `ОКП`, `Kaspi Magazin`, `Wildberries`, `Ozon`, `TLS 1.3`, `100 000`, `триал`, `SIN EXCEPCION`. Обложка `/blog/quick-start` = `/screenshots/catalog.webp` (скриншот продукта, без чужого фото). + +--- + +## Круг 3 (финальный прогон этапа 1, 11.10 — Chrome/Win11 VM) + +Две мелкие правки, деплой только на тест (`test.food-market.kz`, commit `a25b940`, +статус `OK`; образ отката `test-pre-site-fixes-3` создан до деплоя). + +1. **Касса подаётся единообразно честно.** Раньше /status, /pos, /kb/pos-setup + писали «скоро», а главная и /about — как готовую. Привёл к одному виду: касса + для Windows и Linux, **приложение для скачивания — «скоро»** (как на /pos). + - главная — карточка «Продажи и касса»: «…для Windows и Linux, работает без + интернета. Приложение для скачивания — скоро.» + - /about, «Что уже работает»: «Касса … для Windows и Linux, работает без + интернета (приложение для скачивания — скоро).» + Проверено живым grep и скриншотами (главная/ about) на 1280 и 390. +2. **Знак «₸» не переносится в тарифах.** `whitespace-nowrap` + неразрывные + пробелы: «10 000 ₸» / «14 000 ₸» (конструктор «Бизнес»), «5 000 ₸/мес» («Старт»), + CTA «… 10 000 ₸/мес». Проверка: высота строки цены конструктора 36px (одна + строка) на 1280 и 390 — не разрывается. + +Скриншоты: `k3-pricing-1280.png`, `k3-pricing-390.png`, `k3-about-1280.png`. +Автопроверка (Playwright): 5/5. Юридические реквизиты не трогал (отложены до +продакшна). Прод-сайт не трогал. diff --git a/docs/site-fixes-2026-10-11/k3-about-1280.png b/docs/site-fixes-2026-10-11/k3-about-1280.png new file mode 100644 index 0000000..1c23152 Binary files /dev/null and b/docs/site-fixes-2026-10-11/k3-about-1280.png differ diff --git a/docs/site-fixes-2026-10-11/k3-pricing-1280.png b/docs/site-fixes-2026-10-11/k3-pricing-1280.png new file mode 100644 index 0000000..e37cbfb Binary files /dev/null and b/docs/site-fixes-2026-10-11/k3-pricing-1280.png differ diff --git a/docs/site-fixes-2026-10-11/k3-pricing-390.png b/docs/site-fixes-2026-10-11/k3-pricing-390.png new file mode 100644 index 0000000..35a4a52 Binary files /dev/null and b/docs/site-fixes-2026-10-11/k3-pricing-390.png differ diff --git a/tests/e2e/tools/site-fixes-verify-3.mjs b/tests/e2e/tools/site-fixes-verify-3.mjs new file mode 100644 index 0000000..65edde1 --- /dev/null +++ b/tests/e2e/tools/site-fixes-verify-3.mjs @@ -0,0 +1,38 @@ +import { chromium } from '@playwright/test' +import { mkdirSync } from 'node:fs' +import { resolve } from 'node:path' +const BASE = process.env.SITE_URL ?? 'https://test.food-market.kz' +const OUT = resolve('/home/nns/food-market', 'docs/site-fixes-2026-10-11') +mkdirSync(OUT, { recursive: true }) +const results = [] +const ok = (n, c, d = '') => { results.push({ n, c: !!c, d }); console.log(`${c ? '✓' : '✗'} ${n} ${d}`) } +const b = await chromium.launch({ args: ['--ignore-certificate-errors'] }) + +for (const [w, h, tag] of [[1280, 900, '1280'], [390, 844, '390']]) { + const ctx = await b.newContext({ viewport: { width: w, height: h }, deviceScaleFactor: 2, ignoreHTTPSErrors: true, isMobile: w < 500, hasTouch: w < 500 }) + const p = await ctx.newPage() + // pricing — конструктор, «₸» не переносится + await p.goto(`${BASE}/pricing`, { waitUntil: 'networkidle' }); await p.waitForTimeout(1200) + // «₸» в большой сумме и «5 000 ₸/мес» в одной строке (проверяем перенос по высоте строки) + const priceBox = await p.locator('#configurator .font-extrabold').first().boundingBox().catch(() => null) + ok(`pricing@${tag}: цена конструктора в одну строку`, priceBox && priceBox.height < 60, priceBox ? `h=${Math.round(priceBox.height)}` : 'нет') + await p.locator('#configurator').scrollIntoViewIfNeeded().catch(() => {}) + await p.screenshot({ path: resolve(OUT, `k3-pricing-${tag}.png`) }) + // главная — касса «скоро» + await p.goto(`${BASE}/`, { waitUntil: 'networkidle' }); await p.waitForTimeout(600) + const homeTxt = await p.locator('body').innerText() + ok(`главная@${tag}: касса «скачивание — скоро»`, /скачивани[ея].{0,3}—.{0,3}скоро/i.test(homeTxt)) + await ctx.close() +} +// about — касса «скоро» (один раз) +{ + const ctx = await b.newContext({ viewport: { width: 1280, height: 900 }, deviceScaleFactor: 2, ignoreHTTPSErrors: true }) + const p = await ctx.newPage() + await p.goto(`${BASE}/about`, { waitUntil: 'networkidle' }); await p.waitForTimeout(500) + const t = await p.locator('body').innerText() + ok('about: касса «скачивание — скоро»', /приложение для скачивания.{0,3}—.{0,3}скоро/i.test(t)) + await p.screenshot({ path: resolve(OUT, 'k3-about-1280.png'), fullPage: true }) + await ctx.close() +} +await b.close() +console.log(`\n[site-verify-3] ${results.filter(r => r.c).length}/${results.length} passed → ${OUT}`)