diff --git a/docs/release-manifest.json b/docs/release-manifest.json
index 2b4c489..54158c5 100644
--- a/docs/release-manifest.json
+++ b/docs/release-manifest.json
@@ -1,6 +1,6 @@
{
"app": "Caterium",
- "version": "v17.6.5",
+ "version": "v17.6.6",
"channel": "production",
"schema": 17,
"legacyStateKept": true,
@@ -11,7 +11,7 @@
"serverReady": true,
"workspaceAutoDiscovery": true,
"invitesTemporarilyDisabled": false,
- "pwaCache": "v70-20260908-v17-6-5-stability",
+ "pwaCache": "v71-20260908-v17-6-6-offer-templates",
"fullOfferDescriptions": true,
"dynamicOfferRows": true,
"pdfOfferDescriptionFix": true,
@@ -99,7 +99,7 @@
"catalogCompositionTildaEndpoint": "getproduct",
"catalogCompositionPremiumForceRefresh": true,
"catalogCompositionCacheRequiresPremium": true,
- "notes": "Stability hardening: cache-busting corrected from v17.6.0, cloud RPC timeouts and capped conflict retries, deduplicated network error logging with backoff, lightweight support refresh, calmer Developer/background polling.",
+ "notes": "Four proposal templates now keep the per-order choice and use distinct PDF compositions. Menu sidebar icon uses the native mask system without the yellow square.",
"catalogPhotoSources": 113,
"catalogPhotosStoredInCatalog": true,
"catalogLegacyPhotosInCatalog": 60,
@@ -237,7 +237,7 @@
"signupTrial": "14-day Full",
"developerMfaInputSelectorFixed": true,
"developerMfaRepeatedValidationToastsFixed": true,
- "release": "20260908-v17-6-5-stability",
+ "release": "20260908-v17-6-6-offer-templates",
"registrationFlow": "email-password-confirm-company-auto-login",
"emailConfirmationRequired": false,
"employeeInviteLinks": false,
@@ -324,5 +324,10 @@
"supportRefreshIntervalMs": 20000,
"indexCacheBustCurrent": true,
"backgroundImageMutationBatching": true,
- "opsBootWaitBounded": true
+ "opsBootWaitBounded": true,
+ "offerTemplates": 4,
+ "offerTemplatePerOrder": true,
+ "offerTemplateStructuralPreviews": true,
+ "offerPdfDistinctLayouts": true,
+ "menuNavMaskFixed": true
}
diff --git a/docs/releases/V17.6.6-CHANGES.txt b/docs/releases/V17.6.6-CHANGES.txt
new file mode 100644
index 0000000..33a910f
--- /dev/null
+++ b/docs/releases/V17.6.6-CHANGES.txt
@@ -0,0 +1,8 @@
+Caterium v17.6.6 — Proposal templates and Menu icon
+Date: 2026-09-08
+
+- Removed the yellow square and duplicate icon next to Menu. The item now uses the same 20px masked sidebar icon system as Stock and Routes.
+- Fixed per-order proposal template selection being overwritten by the global template during rendering.
+- Four PDF templates now use different section composition, not only different colors.
+- Template pickers use structural mini-previews matching the intended PDF hierarchy.
+- PWA cache v71 / 20260908-v17-6-6-offer-templates.
diff --git a/package-lock.json b/package-lock.json
index b96c716..23fb380 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "caterium-app",
- "version": "17.6.5",
+ "version": "17.6.6",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "caterium-app",
- "version": "17.6.5",
+ "version": "17.6.6",
"devDependencies": {
"@playwright/test": "^1.51.0",
"http-server": "^14.1.1",
diff --git a/package.json b/package.json
index 8012090..1064291 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "caterium-app",
"private": true,
- "version": "17.6.5",
+ "version": "17.6.6",
"type": "module",
"scripts": {
"check:syntax": "node --check public/app-runtime.js && node --check public/service-worker.js && node --check public/legacy/bootstrap.js && node --check public/core/sun-safe.js && node --check public/core/performance.js && node --check public/core/hotfix-v1763.js && node --check public/core/ops-ux-v1762.js && node --check public/core/ux-fixes-v1764.js && node --check public/core/pdf-engine.js",
diff --git a/public/app-runtime.js b/public/app-runtime.js
index 10b22f5..8ca7572 100644
--- a/public/app-runtime.js
+++ b/public/app-runtime.js
@@ -1170,7 +1170,7 @@ window.SUN_LEGACY_CATALOG_V175=[{"id":"1","name":"Фуршетный бокс
function offerRenderMessage(text='Обновляю предложение…'){const host=$('sunClientOfferPreview');if(host)host.innerHTML=`
${esc(text)}
`}
async function renderOffer(snapshot){
const renderToken=++offerRenderSeq;currentOffer.snapshot=snapshot;currentOffer.pdfBlob=null;currentOffer.pdfPromise=null;currentOffer.pages=null;offerRenderMessage();const pdfBtn=$('sunOfferPdf');if(pdfBtn){pdfBtn.disabled=true;pdfBtn.textContent='Готовлю просмотр…'}
- const prepared=await preparedSnapshot(snapshot);prepared.offerTemplateId=offerTemplateId();
+ const prepared=await preparedSnapshot(snapshot);const explicitTemplate=String(snapshot?.offerTemplateId||prepared?.offerTemplateId||'').trim();prepared.offerTemplateId=OFFER_TEMPLATE_IDS.has(explicitTemplate)?explicitTemplate:offerTemplateId();
const pdfPrepared=await preparedPdfSnapshot(prepared),pages=await renderOfferPdfPages(pdfPrepared);
if(renderToken!==offerRenderSeq)return null;
currentOffer.snapshot=snapshot;currentOffer.prepared=prepared;currentOffer.pdfPrepared=pdfPrepared;currentOffer.pages=pages;currentOffer.renderToken=renderToken;
@@ -1530,7 +1530,11 @@ window.SUN_LEGACY_CATALOG_V175=[{"id":"1","name":"Фуршетный бокс
else{const imgs=finalGallery.slice(0,2),cellW=(W-2*M-gap)/2;if(imgs[0])pdfDrawCover(ctx,imgs[0],M,y,cellW,available,14);if(imgs[1])pdfDrawCover(ctx,imgs[1],M+cellW+gap,y,cellW,available,14)}
y=bottom;
}
- newPage();brandHeader();hero();sellingBlock();drawItems();summary();if(id==='editorial-grid'){pricing();infoCards()}else{infoCards();pricing()}footerNoteBlock();finalGalleryFill();
+ newPage();
+ if(id==='editorial-grid'){brandHeader();hero();drawItems();summary();pricing();sellingBlock();infoCards();finalGalleryFill();footerNoteBlock();}
+ else if(id==='midnight-glass'){brandHeader();hero();sellingBlock();summary();infoCards();drawItems();pricing();finalGalleryFill();footerNoteBlock();}
+ else if(id==='emerald-gold'){brandHeader();hero();summary();sellingBlock();infoCards();pricing();drawItems();footerNoteBlock();finalGalleryFill();}
+ else{brandHeader();hero();sellingBlock();drawItems();summary();infoCards();pricing();footerNoteBlock();finalGalleryFill();}
canvases.forEach((c,i)=>{const x=c.getContext('2d');x.setTransform(SCALE,0,0,SCALE,0,0);x.save();x.fillStyle=FOOT;x.fillRect(0,H-52,W,52);x.strokeStyle=LINE;x.lineWidth=1;x.beginPath();x.moveTo(0,H-52.5);x.lineTo(W,H-52.5);x.stroke();pdfText(x,'Солнце Кейтеринг · Санкт-Петербург',M,H-36,620,22,{font:'12px Arial',color:MUTED,maxLines:1});pdfText(x,`${i+1} / ${canvases.length}`,W-M,H-36,100,22,{font:'12px Arial',color:MUTED,align:'right',maxLines:1});x.restore()});
return canvases;
}
@@ -4096,10 +4100,10 @@ window.SUN_LEGACY_CATALOG_V175=[{"id":"1","name":"Фуршетный бокс
const KEY='sunOfferTemplateV1';
const DEFAULT_ID='light';
const TEMPLATES=[
- {id:'light',name:'Светлый фирменный',desc:'Белый фон, фирменный зелёный и золото. Основной дизайн.',thumb:'offer-templates/thumb-light.jpg'},
- {id:'editorial-grid',name:'Солнце Editorial',desc:'Макет по референсу: крупный первый экран, компактное меню, фотосетка и итоги на одной визуальной системе.',thumb:'offer-templates/thumb-editorial-grid.jpg'},
- {id:'midnight-glass',name:'Midnight Glass',desc:'Двухколоночный макет: меню списком слева, реальные фото боксов мозаикой справа.',thumb:'offer-templates/thumb-midnight-glass.jpg'},
- {id:'emerald-gold',name:'Emerald Gold',desc:'Премиальная композиция: золотой итог в первом экране, меню слева и фотоколлаж справа.',thumb:'offer-templates/thumb-emerald-gold.jpg'}
+ {id:'light',name:'Светлый фирменный',desc:'Классическая A4-композиция: обложка, карточки меню, итог и условия.',thumb:'offer-templates/thumb-light.jpg'},
+ {id:'editorial-grid',name:'Солнце Editorial',desc:'Журнальная композиция: крупный первый экран, меню-сетка, фотоблоки и редакционная подача.',thumb:'offer-templates/thumb-editorial-grid.jpg'},
+ {id:'midnight-glass',name:'Midnight Glass',desc:'Тёмная презентация: стеклянные панели, итог до меню и контрастная двухколоночная композиция.',thumb:'offer-templates/thumb-midnight-glass.jpg'},
+ {id:'emerald-gold',name:'Emerald Gold',desc:'Премиальный буклет: золотой итог на первом экране, условия и меню как финальная часть.',thumb:'offer-templates/thumb-emerald-gold.jpg'}
];
const esc=window.SunSafe.escapeHTML;
@@ -4140,11 +4144,17 @@ window.SUN_LEGACY_CATALOG_V175=[{"id":"1","name":"Фуршетный бокс
`;
document.head.appendChild(style);
+ function offerTemplateMini(id){
+ if(id==='editorial-grid')return '';
+ if(id==='midnight-glass')return '';
+ if(id==='emerald-gold')return '';
+ return '';
+ }
function cardHtml(){
const cur=selected();
return `
Шаблон предложения клиенту
Выберите внешний вид, который будет использоваться в «Предложении клиенту» и в PDF. Реальные фотографии боксов и данные заказа остаются одинаковыми — меняется только дизайн.