🚀 CartList jest w fazie beta! Zarejestruj się i testuj za darmo. Dołącz teraz →
Zacznij za darmo →

Changelog

Historia zmian i aktualizacji CartList.

CartList PWA v6.22.15 — Fix horizontal scroll na rejestracji v6.22.15

🐛 Problem

Po v6.22.14 form rejestracji mieścił się idealnie (header inline, wszystko widoczne),

ALE user mógł przewijać stronę lewo-prawo.

🔍 Diagnoza

Dekoracyjne blur circles (w-96 h-96 = 384px) z translate-x-1/2 wystawały poza container o ~192px z każdej strony, tworząc horizontal overflow.

```jsx

<div className="absolute top-0 left-0 w-96 h-96 ... -translate-x-1/2 ..." />

<div className="absolute bottom-0 right-0 w-96 h-96 ... translate-x-1/2 ..." />

```

Container miał overflowY: auto ale nie overflowX: hidden.

✅ Fix

Dodane overflowX: 'hidden' do containera rejestracji.

```diff

  • overflowY: 'auto',

+ overflowY: 'auto', overflowX: 'hidden',

```

Blur circles wciąż są (dekoracja), ale nie wychodzą poza viewport horizontalnie.

🚀 Deploy

```bash

unzip -o cartlist-v6.22.15.zip

bash mydevil-install.sh --update --auto

```

+ hard refresh / clear site data


1-liner fix · build rebuilt · scroll poziomy zablokowany


Aplikacja: PWA · Środowisko: production · Wdrożenie: 2026-06-22 20:17

CartList PWA v6.22.14 — REBUILT bundle (final) v6.22.14

🚨 KRYTYCZNY FIX: paczki v6.22.10–13 NIE zawierały zbudowanego JS

Co się stało

Vite build (npm run build) nie był wykonywany przy pakowaniu paczek v6.22.10/11/12/13.

Zmiany w resources/js/shared/auth.jsx NIE trafiły do compiled bundle.

Production serwowało STARY kod (shared-auth-DjUDy6Qq.js) niezależnie od deployu.

User widział wciąż v6.17.196-level UI mimo deploy v6.22.13.

Diagnoza

W DevTools widać było:

```html

<form class="space-y-4 mt-6"> ← STARY KOD

```

Powinno być:

```html

<form class="space-y-3 mt-4" onFocus={smartFocusInput}> ← NOWY KOD

```

Fix v6.22.14

Build wykonany w sandboxie z aktualnym kodem:

```

public/build/assets/shared-auth-DvMvsfZ8.js (49.93 kB)

public/build/assets/app-BgdsMeo7.js (79.94 kB)

public/build/assets/MobileLayout-B6W88VmW.js (18.37 kB)

```

Verified w bundle:

  • space-y-3 mt-4 (compact form spacing)
  • Przewiń w dół (scroll hint)
  • ✓ Compact horizontal header (logo + heading inline)
  • smartFocusInput (globalne keyboard-aware)

Co teraz user zobaczy

Po deploy v6.22.14 + hard refresh:

1. Compact header — logo obok "CartList" w jednej linii (~80px oszczędności)

2. Inline subtitle — "Inteligentne zakupy dla rodziny" obok loga

3. Tighter form spacing — space-y-3 zamiast space-y-4

4. Compact card — p-4 na mobile (zamiast p-6)

5. Scroll hint chevron — "Przewiń w dół" gdy content > viewport

6. Smart focus scroll — wszystkie formy w aplikacji

Akumulowane zmiany od v6.22.9

| Wersja | Zmiana |

|---|---|

| v6.22.10 | Register form keyboard-aware (height:100dvh, scrollPaddingBottom, viewport meta) |

| v6.22.11 | Globalne smartFocusInput (BottomSheet, Modal, MobileLayout, LoginScreen) |

| v6.22.12 | Header reduction (logo w-16, text-3xl) |

| v6.22.13 | Compact horizontal header + scroll hint affordance |

| v6.22.14 | REBUILT bundle — wszystkie zmiany TERAZ aktywne w production |

🚀 Deploy v6.22.14

```bash

cd ~/domains/my.cartlist.app/public_html

unzip -o cartlist-v6.22.14.zip

bash mydevil-install.sh --update --auto

```

Po deployu OBOWIĄZKOWY:

  • Hard refresh (Ctrl+Shift+R) lub F12 → Application → Clear site data → Reload
  • Jeśli PWA zainstalowana → odinstaluj + zainstaluj ponownie (Service Worker cache)

🧪 Verify deploy v6.22.14 zadziałał

W DevTools console:

```js

// Sprawdź jaką wersję ma frontend:

console.log(document.querySelector('meta[name="app-version"]')?.content);

// → 6.22.14

// Sprawdź czy nowy bundle:

performance.getEntriesByType('resource')

.filter(r => r.name.includes('shared-auth'))

.map(r => r.name.split('/').pop());

// → ['shared-auth-DvMvsfZ8.js'] (nowy)

// NIE: ['shared-auth-DjUDy6Qq.js'] (stary)

```

TODO dla install.sh (na przyszłość)

Dodać sekcję która buduje JS na MyDevil jeśli build/ jest stary:

```bash

if [ -f package.json ] && command -v npm >/dev/null; then

BUILD_AGE=$(find public/build/manifest.json -mmin +60 2>/dev/null)

if [ -n "$BUILD_AGE" ]; then

info "Build artifacts >60min — running npm run build"

npm run build

fi

fi

```

(MyDevil może nie mieć npm w PATH — sprawdzić.)


Zbudowane vite assets aktualne · pierwszy deploy z REAL nowym kodem · scroll hint widoczny


Aplikacja: PWA · Środowisko: production · Wdrożenie: 2026-06-22 20:11

CartList PWA v6.22.13 — Compact register form + scroll hint v6.22.13

🎯 Co naprawione

User report: dół rejestracji wciąż ucinał się na małych telefonach (Galaxy S25+ z URL barem) — button "Utwórz konto" tylko częściowo widoczny.

🔧 Fixy

1. Header inline (logo + heading w jednej linii) — oszczędność ~80px

Z stacked layoutu:

```

[🛒]

CartList

Inteligentne zakupy dla całej rodziny

```

Do compact horizontal:

```

[🛒] CartList

Inteligentne zakupy dla rodziny

```

Plus mniejszy logo (w-12 h-12 na mobile), krótszy subtitle.

2. Scroll hint indicator

Animowany chevron "Przewiń w dół" + gradient fade na dole containera.

Logika:

  • Pojawia się TYLKO gdy scrollHeight > clientHeight + 20 (jest co scrollować)
  • Pojawia się TYLKO gdy scrollTop < 30 (user nie scrollował)
  • Znika natychmiast po pierwszym scroll'u (już wie że można)
  • useRef na container + useEffect z listener'em

3. Form card padding redukcja

  • p-5p-4 sm:p-5 (na mobile 16px, desktop 20px)

📊 Total redukcja vs v6.22.9

~170px wertykalnej przestrzeni (header inline + form padding + container padding + tighter spacing).

🧪 Test

  • iPhone SE (568px): cały form widoczny + scroll hint pokazuje "Przewiń w dół"
  • Galaxy S25+ (z URL barem ~720px): cały form widoczny bez hint
  • iPhone 14+ (844px): dużo miejsca, hint może pokazać się jeśli keyboard'em

Aplikuje też wszystkie zmiany z v6.22.10/11/12

  • Container height: 100dvh + overflowY: auto + scrollPaddingBottom: 6rem
  • Viewport meta interactive-widget=resizes-content
  • Globalne smartFocusInput w BottomSheet/Modal/MobileLayout/LoginScreen
  • 12 toast'ów wyciętych (v6.22.9)
  • 4 aria-labels (v6.22.9)

Compact horizontal header + scroll hint affordance · pierwszy ekran rejestracji w całości widoczny


Aplikacja: PWA · Środowisko: production · Wdrożenie: 2026-06-22 19:56

CartList PWA v6.22.12 — Register form compact + globalne keyboard-aware v6.22.12

🎯 Co naprawione

Workspace zniknął przy compaction — odtworzono z v6.22.9 + zaaplikowano wszystkie zmiany z v6.22.10 + v6.22.11 + nowe z v6.22.12.

v6.22.12 nowe zmiany (compact register form)

Problem

User na małych telefonach (iPhone SE 568px, Galaxy A12 z URL barem) zgłaszał że "dół się ucina" statycznie (bez klawiatury), zaraz po wejściu w rejestrację.

Diagnoza

Header (logo + heading + subtitle) zajmował ~190px + form card ~470px + padding ~50px = 710px. Na iPhone SE z ~568px effective viewport: 142px content poza viewport.

Scroll działał (overflowY: auto) ale user nie wiedział że może swipować w dół.

Fix v6.22.12

Reduce header o ~50px:

  • Logo box: w-20 h-20w-16 h-16 (-16px)
  • Logo margin: mb-4mb-3 (-4px)
  • Heading: text-4xltext-3xl (-12px)
  • Heading margin: mb-2mb-1 (-4px)
  • Container margin: mb-5mb-4 (-4px)
  • Subtitle: text-basetext-sm (-4px)
  • Icon: size={40}size={32} (-8px)
  • Card padding: p-6p-5 (-8px)

Plus tighter form:

  • space-y-4 mt-6space-y-3 mt-4 (-12px na gaps)

Plus container padding:

  • Container py-6py-4 (-16px)
  • paddingTop/Bottom: 4vh2vh (-20px combined)

Total reduction: ~90px — mieści się teraz nawet na iPhone SE bez scroll.

v6.22.10 (re-applied)

Keyboard-aware register form

  • height: 100dvh (FIXED — overflow:auto teraz działa)
  • scrollPaddingBottom: 6rem (last input ma miejsce nad keyboard)
  • WebkitOverflowScrolling: touch (smooth iOS scroll)
  • overscrollBehavior: contain (no parent bounce)
  • Body locked (scroll w containerze, gradient stabilny)

Viewport meta tag

```html

<meta name="viewport" content="..., interactive-widget=resizes-content">

```

iOS 15.4+ kompresuje viewport gdy keyboard wjeżdża.

v6.22.11 (re-applied)

smartFocusInput helper w shared/ui.jsx

Single source of truth dla keyboard-aware focus scroll. Zastosowany w:

  • BottomSheet content (wszystkie modale mobile)
  • Modal content (wszystkie modale desktop)
  • MobileLayout <main> (wszystkie full-screen views)
  • LoginScreen <form> (login + register)

Każdy form w aplikacji automatycznie ma:

  • scrollPaddingBottom: 6rem
  • onFocus={smartFocusInput} — smooth scroll do focused input

🧪 Test

iPhone SE (568px) bez keyboard:

  • Cały form widoczny bez scroll (CTA "Otrzymasz 14 dni Premium" widoczne)

iPhone SE z keyboard:

  • Focused input zawsze w centrum
  • Scroll do checkboxów + button submit działa smooth

iPhone 14 / Galaxy S22:

  • Form perfectly fits, dużo miejsca

Compact + keyboard-aware · pierwszy ekran rejestracji widoczny w całości


Aplikacja: PWA · Środowisko: production · Wdrożenie: 2026-06-22 19:38

CartList PWA v6.22.11 — Globalne keyboard-aware UX v6.22.11

🛡 Best practices zastosowane globalnie

W v6.22.10 naprawiono tylko rejestrację. W v6.22.11 te same techniki działają wszędzie w aplikacji — bez duplikowania kodu.

Architektura

Helper smartFocusInput w shared/ui.jsx

Single source of truth dla keyboard-aware focus scroll:

  • Wykrywa focus na input/textarea/select (skipuje checkbox/radio)
  • setTimeout 300ms (keyboard animation buffer)
  • Sprawdza visualViewport.height — czy element jest zasłonięty keyboard'em
  • Jeśli tak → scrollIntoView({block: 'center'}) smooth

```js

export const smartFocusInput = (e) => { / ... / };

```

Aplikacja w 4 kluczowych miejscach

| Komponent | Pokrywa | Zmiana |

|---|---|---|

| MobileLayout <main> | Full-screen views (Settings, Account, Change Password, all views) | overflowY: auto + scrollPaddingBottom: 6rem + onFocus={smartFocusInput} |

| BottomSheet content | Wszystkie modale na mobile (28 confirm + form modals) | onFocus={smartFocusInput} + scrollPaddingBottom: 6rem |

| Modal content | Wszystkie modale na desktop | Same |

| LoginScreen <form> | Login/Register | Refactor inline handler → smartFocusInput |

Bonus: viewport meta tag (z v6.22.10)

```html

<meta name="viewport" content="..., interactive-widget=resizes-content">

```

iOS 15.4+ kompresuje viewport gdy keyboard się pokazuje. 100dvh automatycznie reaguje.

Efekt globalny

Wszystkie miejsca z inputami w aplikacji teraz:

1. Scrollują się tak, że focused input jest w centrum widocznego obszaru

2. Mają 6rem rezerwy nad keyboard (last input nie ginie)

3. Skipują scroll jeśli element już widoczny (no jank)

4. Działają na iOS + Android

Pokryte miejsca (przykłady)

  • ✅ Rejestracja / Logowanie / PIN / Forgot password (LoginScreen)
  • ✅ Zmiana hasła (ChangePasswordView via MobileLayout)
  • ✅ Account details (AccountDetailsView via MobileLayout)
  • ✅ Preferences (PreferencesView via MobileLayout)
  • ✅ AddItemForm w listach (via BottomSheet)
  • ✅ QuickAddSheet (via BottomSheet)
  • ✅ Edit modal (Lists, MealPlan, Recipes, Products, Groups — wszystkie używają ResponsiveModal)
  • ✅ Settlement create, Geofence create, Statistics filter, Templates manage — wszystko via Modal/BottomSheet

DRY benefit

Zamiast aplikować onFocus={...} z setTimeout w każdej z 30+ forms, 3 zmiany w shared components pokrywają wszystko.

Future-proof: każdy nowy form który użyje BottomSheet/Modal/MobileLayout automatycznie dostaje keyboard-aware UX bez dodatkowego kodu.


Globalna keyboard-aware UX · DRY · zero per-view kodu


Aplikacja: PWA · Środowisko: production · Wdrożenie: 2026-06-22 05:38

CartList PWA v6.22.9 — UX Poziom 1 (mobile-first) v6.22.9

🎯 Priorytety naprawione

1. Strona rejestracji mieści się na małych telefonach

Bug: auth.jsx używał height: 100dvh + overflow: hidden + body.overflow: hidden. Form rejestracji (3 checkboxy RODO + password strength + 5 inputów = ~600px) ucinał się na iPhone SE / Galaxy A z keyboard'em (viewport ~400px).

Fix:

  • Container: minHeight: 100dvh + overflowY: auto + paddingBottom: env(safe-area-inset-bottom)
  • Body: nie blokuje już overflow (background gradient zachowany)
  • Smooth scroll na iOS (WebkitOverflowScrolling: touch)

Userzy mogą się teraz zarejestrować na wszystkich telefonach.

2. Wyciszone 12 redundantnych toast'ów

Wycięte "Dodano!" / "Usunięto" / "Zaktualizowano" gdzie efekt jest widoczny w UI (item pojawia się/znika).

Wytrąconych z 6 views:

  • MealPlanView (3)
  • ListDetailView (1)
  • ShoppingSessionView (1)
  • GeofencingView (1)
  • GroupDetailView (1)
  • ProductsView (3)
  • SettlementsView (1)
  • Plus duplikat MealPlan (1)

Zostają: error toast'y (zawsze), "Link skopiowany!" (brak innego feedback), "Zaproszenie wysłane!" (akcja API).

3. Safe-area w Modal footer

Modal (desktop variant) ma teraz paddingBottom: max(0.75rem, env(safe-area-inset-bottom)).

BottomSheet już miał to, ale Modal był pominięty.

4. Aria-labels dla back buttons (4 views)

Dodane do:

  • PasskeyManager
  • SessionsActivityViews
  • SecuritySettingsView
  • LegalPageView

Plus inne (FAB, hamburger, eye-toggle, modal close, trial close) już miały aria-label.

📊 Impact

| Metryka | Przed | Po |

|---|---|---|

| Userzy mogą się zarejestrować na iPhone SE | ❌ Nie | ✅ Tak |

| Toast'y w aplikacji | 347 | 335 (-3.5%) |

| Najgorsze view'y per liczba toast'ów | 48 (GroupDetail) | 47 |

| Aria-label coverage | 5.0% | 5.2% |

| Modal safe-area | BottomSheet only | Modal + BottomSheet |

🚀 Następne kroki (Poziom 2 — kiedyś)

  • Smart sequencing popupów (2-3h)
  • Reduced-motion respect (30 min)
  • Aria-labels więcej icon buttonów
  • Loading states w 5 views

UX cleanup mobile-first · zero breaking changes


Aplikacja: PWA · Środowisko: production · Wdrożenie: 2026-06-21 19:45

CartList PWA v6.22.7 — Auto-heal feature flags v6.22.7

🩺 Self-healing rozszerzony o 3 nowe checki

Skrypt install.sh (sekcja self_heal()) teraz automatycznie wykrywa i naprawia:

Check 1: Globalne feature flags wyłączone

Sprawdza czy core features mają is_enabled=true:

  • geofencing_enabled
  • price_comparison_enabled
  • barcode_scanner_enabled
  • ocr_enabled
  • settlements_enabled
  • realtime_enabled

Jeśli któryś jest FALSE → auto-restore (Setting + FeatureFlag + cache clear).

Output:

```

⚠ Core feature flags wyłączone globalnie: geofencing_enabled,price_comparison_enabled

→ Auto-restore (core features powinny być globalnie ON; admin może wyłączyć per-plan)

✓ Core features re-enabled: geofencing_enabled,price_comparison_enabled

```

Check 2: Per-plan feature_flags wyzerowane

Sprawdza czy paid plans (premium/family/premium_pro) mają >= 5 features enabled:

Jeśli któryś plan ma < 5 features (np. premium_pro z 0/21 jak w incydencie 2026-06-11) → restore z defaults.

Output:

```

⚠ Paid plans z prawie-zero features: premium_pro:0

→ Auto-restore z defaults per plan

✓ Paid plans feature_flags restored

```

Check 3: StripeSyncAuditCommand kolumny

Sprawdza czy command używa aktualnych nazw kolumn (stripe_price_monthly nie stripe_price_id_monthly).

Jeśli stare nazwy → auto-fix przez sed.

Output:

```

⚠ StripeSyncAuditCommand używa starych nazw kolumn (stripe_price_id_*)

→ Auto-fix: rename do stripe_price_monthly/yearly

✓ StripeSyncAuditCommand: kolumny naprawione

```

Plus: poprzedni fix z v6.22.6

  • stripe_price_id_monthlystripe_price_monthly w StripeSyncAuditCommand

Po deploy v6.22.7

Cron stripe:audit-sync codziennie 6:30 będzie działać. Plus każdy deploy automatycznie sprawdzi 3 powyższe + naprawi jeśli trzeba.


Auto-healing infrastruktury · idempotent · zero risk


Aplikacja: PWA · Środowisko: production · Wdrożenie: 2026-06-12 20:53

CartList CMS v6.22.8 — Trwały fix changelog helpers v6.22.8

🐛 Final root cause

Trzy globalne funkcje (parseReleaseNotes, inlineMarkdown, buildDraftStub) były w routes/api.php. To powodowało:

1. v6.22.5 → "Cannot redeclare parseReleaseNotes" — OPcache trzymał stary plik + ładował nowy

2. v6.22.6 → guard function_exists dla parseReleaseNotes → naprawione, ale inlineMarkdown wciąż padał

3. v6.22.7 → guards dla wszystkich 3 funkcji → ale po deploy "Call to undefined function" — Laravel route caching cachował closures, ale globalne funkcje były nieładowane bo function_exists zwracał false podczas cached request

✅ Fix v6.22.8 — przeniesienie do dedicated Service class

Wszystkie 3 funkcje są teraz statycznymi metodami klasy App\Services\ChangelogParser:

  • ChangelogParser::parseReleaseNotes($markdown, $version, $app, $env, $customTitle)
  • ChangelogParser::inlineMarkdown($text)
  • ChangelogParser::buildDraftStub($version, $app, $env)

Autoloader Composera ładuje klasę przy każdym requestcie → brak race conditions z route cache.

Co działa

  • ✅ Landing HTTP 200
  • ✅ Changelog stub endpoint odpowiada
  • ✅ Auto-changelog z PWA działa
  • ✅ Route cache OK
  • ✅ Zero risk redeclare lub undefined function

Final hotfix · architektonicznie poprawne · zero risk


Aplikacja: CMS · Środowisko: production · Wdrożenie: 2026-06-10 18:50

CartList CMS v6.22.6 — Hotfix v6.22.6

🐛 Naprawione

Bug: Cannot redeclare parseReleaseNotes()

Landing zwracał HTTP 500 przez double-declaration funkcji parseReleaseNotes w routes/api.php.

Root cause: OPcache na MyDevil trzymał stary plik w pamięci równolegle z nowym (FPM workers). Gdy PHP próbował załadować nową wersję, kolidowała z cached.

Fix: Dodany guard if (!function_exists('parseReleaseNotes')) wokół deklaracji — funkcja nigdy nie zostanie zadeklarowana 2x w tym samym requestcie.

Bug: Cron marker hardcoded v6.21.13

W install.sh marker był hardcoded zamiast czytać $VERSION.

Fix: Dynamic $marker="# CartList-CMS-AUTO (v${VERSION})".

Co działa po v6.22.6

  • ✅ Landing odpowiada HTTP 200
  • ✅ Cron marker wyrównany z wersją
  • ✅ Synchronizacja z PWA v6.22.5

Hotfix · landing crash naprawiony · OPcache-safe


Aplikacja: CMS · Środowisko: production · Wdrożenie: 2026-06-10 18:41

v6.22.5 — Stripe check fix + audit v6.22.5

🐛 Fix: Pre-flight Stripe wykrywa LIVE keys z DB wizarda

Bug: Stripe check sprawdzał .env jako PIERWSZE źródło. Twoje live keys w DB (Filament wizard) były ignorowane bo .env wciąż miał sk_test_.

Fix: DB Setting ma teraz priorytet nad .env:

  • DB (wizard) → preferowane źródło
  • .env → fallback gdy DB puste

Po deploy v6.22.5 powinieneś zobaczyć:

```

✓ Pre-flight: STRIPE w trybie LIVE (DB wizard) — produkcja gotowa

✓ Stripe: live mode (płatności prawdziwe) [źródło: DB (wizard)]

✓ Production readiness: 100% ✓

```

📋 Plus: AUDIT_v6.22.4.md w paczce

Pełen audit (40+ stron) stanu produkcji: co działa, gdzie weryfikować, GAP-y, zalecone Sprint 3.


Hotfix · script-only · zero zmian w kodzie aplikacji


Aplikacja: PWA · Środowisko: production · Wdrożenie: 2026-06-10 18:34