# PROJECT.md ## Name newwalls.pl — PrestaShop 1.7 (theme: ayon) ## Mission Sklep z tapetami na wymiar. Klient prowadzi migrację wyglądu strony produktu na nowy layout. Do czasu zakończenia testów nowy layout jest warunkowany IP administratora. ## Core Constraints - Stary i nowy wygląd strony produktu współegzystują w `themes/ayon/templates/catalog/product.tpl`: - Stary layout: `{if $smarty.server.REMOTE_ADDR != '89.69.31.86'} ... {/if}` - Nowy layout: `{if $smarty.server.REMOTE_ADDR == '89.69.31.86'} ... {/if}` - Nie wolno modyfikować starego layoutu (produkcja działa dla zwykłych użytkowników). - Partial `themes/ayon/templates/catalog/_partials/product-variants.tpl` jest współdzielony — zmiany w nim muszą być zgodne z oboma layoutami. - Stack: PrestaShop 1.7, Smarty, jQuery, SCSS (`themes/ayon/assets/css/custom.scss` → `custom.css`). ## Value Proposition Nowy layout strony produktu ma dać czystszy, bardziej prezentowalny UI konfiguratora tapety przy zachowaniu dotychczasowej funkcjonalności (wybór wariantu kolorystycznego, wymiary, dodanie do koszyka itd.). ## Known Broken After Redesign ### ✅ Naprawione (Phase 01) - `.product-variants` (wariant kolorystyczny) — wygląd grid 3×1 wg Figma 27:9867 + klik zmienia wariant in-place (AJAX `action=refresh` + `history.pushState`). ### ✅ Naprawione (Phase 02) - **Konfigurator „piece"** (Plan 02-01) — crop + odbicie lustrzane, drag + mirror, re-init po AJAX refresh. Reuse `#piece` z shared partial. - **Add-to-cart submission** (Plan 02-02) — capture-phase native handler w custom.js + inline mirror, blockcart refresh, idempotency guard. Button+qty poza formą `#add-to-cart-or-refresh` — manualny serialize + POST. - **Customization save + success modal** (Plan 02-03) — full squaremeter payload (26 fields, verbose PL dim), chain POST do `/module/ps_shoppingcart/ajax` → Bootstrap `#blockcart-modal`. `__p02p02InFlight` re-entrancy guard. Inline script finally renders (Plan 02-03 `{/block}` move). - **Live cena labelka** (Plan 02-04) — `.p02p04-total-price` obok "Dodaj do koszyka", reactively updates z piece dimensions + variant AJAX refresh. Górna `.current-price` zostaje statyczna info-label. - **Struktura materiału w POST payload** (Plan 02-05) — enumeracja external PS attribute groups (`[name^="group["]` poza formą) w POST payload. Wybrana „Tekstura materiału" (`