feat: mobil uyumlu PWA — manifest, service worker, gercek kurulum, filtre cekmecesi

- public/manifest.webmanifest (standalone, tr, kisayollar) + 192/512 ve
  maskable ikonlar + apple-touch-icon; index.html PWA meta etiketleri
- public/sw.js: /assets cache-first (hash'li adlar), kabuk network-first,
  /api ASLA onbellekten (eski ihale gosterilmesin); surum degisince temizlik
- main.jsx: SW yalniz uretimde kaydedilir (dev'de HMR ile cakismasin)
- Mobil PWA sayfasindaki "Cihaza Yukle" dugmesi sahteydi (setInstalled(true));
  artik beforeinstallprompt ile gercek kurulum, standalone algilama, iOS/
  Android/masaustu yol tarifi
- Kucuk ekranda sol filtre paneli listeyi 72 satir asagi itiyordu: lg altinda
  "Filtreler" dugmesiyle acilan cekmece; sag panel xl altinda gizli

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
2026-09-04 00:39:40 +03:00
co-authored by Claude Fable 5.1
parent acec88a4c4
commit fabff18fe9
12 changed files with 136 additions and 7 deletions
+35
View File
@@ -0,0 +1,35 @@
import React, { useState } from 'react';
import { SlidersHorizontal, X } from 'lucide-react';
import { LeftSidebar } from './LeftSidebar';
/**
* Mobil filtre çekmecesi: küçük ekranda sol menü listeyi aşağı itiyordu
* (72 satırlık panel). Artık lg altında gizli; "Filtreler" düğmesiyle
* soldan açılan çekmecede aynı bileşen çalışır.
*/
export const MobilFiltreCekmecesi = () => {
const [acik, setAcik] = useState(false);
return (
<div className="lg:hidden">
<button
type="button"
onClick={() => setAcik(true)}
className="w-full mb-3 bg-white border border-slate-200 rounded-xl px-4 py-2.5 text-xs font-bold text-slate-800 flex items-center justify-center gap-2 shadow-xs"
>
<SlidersHorizontal className="w-4 h-4 text-blue-600" /> Filtreler & Hızlı Erişim
</button>
{acik && (
<div className="fixed inset-0 z-50 flex" onClick={() => setAcik(false)}>
<div className="absolute inset-0 bg-slate-900/50" />
<div onClick={(e) => e.stopPropagation()} className="relative h-full w-[88%] max-w-sm bg-slate-100 shadow-2xl overflow-y-auto p-3 animate-fade-in">
<div className="flex items-center justify-between mb-3">
<span className="text-xs font-black text-slate-800 uppercase tracking-wider">Filtreler</span>
<button onClick={() => setAcik(false)} className="p-1.5 rounded-lg bg-white border border-slate-200" aria-label="Kapat"><X className="w-4 h-4" /></button>
</div>
<LeftSidebar />
</div>
</div>
)}
</div>
);
};