Marketplace senegalaise au Maroc
Translation pending
CommerceTypeScript · PLpgSQLGitHub @mathissene57-specOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
senlink
Translation pending
Taken from the repository README
Loading the full README.
Read the full README ↗/* ================================================================ RESET ================================================================ / ,::before,::after { margin:0; padding:0; box-sizing:border-box; -webkit-tap-highlight-color:transparent; } html { height:100%; overscroll-behavior:none; scroll-behavior:smooth; } body { font-family:‘DM Sans’,-apple-system,BlinkMacSystemFont,system-ui,sans-serif; background:var(–bg); color:var(–txt); min-height:100%; overflow-x:hidden; -webkit-font-smoothing:antialiased; padding-bottom:calc(var(–tab) + var(–safe)); } a { text-decoration:none; color:inherit; } button { font-family:inherit; cursor:pointer; border:none; background:none; touch-action:manipulation; } img { max-width:100%; display:block; object-fit:cover; } input,select,textarea { font-family:inherit; font-size:16px; /* Anti-zoom iOS */ -webkit-appearance:none; touch-action:manipulation; } .sr-only { position:absolute; width:1px; height:1px; overflow:hidden; clip:rect(0,0,0,0); }
/* ================================================================ TOP NAVBAR ================================================================ */ #topnav { position:fixed; top:0; left:0; right:0; height:var(–nav); z-index:var(–z-nav); padding-top:var(–safeT); background:rgba(250,247,242,.95); backdrop-filter:blur(16px); -webkit-backdrop-filter:blur(16px); border-bottom:1px solid var(–bdr); display:flex; align-items:center; justify-content:space-between; padding-left:16px; padding-right:16px; transition:box-shadow .25s; will-change:box-shadow; } #topnav.shadow { box-shadow:0 2px 20px rgba(0,0,0,.08); }
.tn-logo { display:flex; align-items:center; gap:9px; } .tn-ico { width:36px; height:36px; border-radius:10px; background:linear-gradient(135deg,var(–g),var(–gm)); display:flex; align-items:center; justify-content:center; font-size:18px; box-shadow:var(–shg); flex-shrink:0; } .tn-name { font-family:‘Playfair Display’,serif; font-size:20px; font-weight:900; } .tn-name span { color:var(–gold); }
.tn-acts { display:flex; align-items:center; gap:8px; } .tn-btn { width:38px; height:38px; border-radius:var(–r8); background:var(–bgw); border:1px solid var(–bdr); display:flex; align-items:center; justify-content:center; font-size:18px; position:relative; transition:all .2s var(–ease); will-change:transform; } .tn-btn:active { transform:scale(.91); background:var(–gg); border-color:var(–g); } .tn-badge { position:absolute; top:-5px; right:-5px; width:18px; height:18px; background:var(–red); color:#fff; font-size:9px; font-weight:700; border-radius:50%; display:flex; align-items:center; justify-content:center; border:2px solid var(–bg); transform:scale(0); transition:transform .2s var(–ease); will-change:transform; } .tn-badge.show { transform:scale(1); }
/* ================================================================ BOTTOM TAB BAR ================================================================ */ #btmnav { position:fixed; bottom:0; left:0; right:0; height:calc(var(–tab) + var(–safe)); z-index:var(–z-nav); background:rgba(250,247,242,.97); backdrop-filter:blur(16px); -webkit-backdrop-filter:blur(16px); border-top:1px solid var(–bdr); display:flex; align-items:flex-start; justify-content:space-around; padding-top:6px; padding-bottom:var(–safe); } .tab { flex:1; display:flex; flex-direction:column; align-items:center; gap:3px; padding:5px 4px; cursor:pointer; position:relative; transition:all .2s var(–ease); -webkit-user-select:none; user-select:none; } .tab:active { transform:scale(.88); } .tab-ico { font-size:22px; line-height:1; transition:transform .2s var(–ease); will-change:transform; } .tab-lbl { font-size:10px; font-weight:600; color:var(–mut); transition:color .2s; } .tab.on .tab-ico { transform:scale(1.1); } .tab.on .tab-lbl { color:var(–g); } .tab.on::before { content:’’; position:absolute; top:-6px; left:50%; transform:translateX(-50%); width:28px; height:3px; background:var(–g); border-radius:0 0 3px 3px; } .tab-dot { position:absolute; top:3px; right:calc(50% - 17px); width:7px; height:7px; background:var(–red); border-radius:50%; border:2px solid var(–bg); transform:scale(0); transition:transform .2s var(–ease); } .tab-dot.show { transform:scale(1); }
/* ================================================================ PAGES ================================================================ */ .page { display:none; padding-top:var(–nav); min-height:100vh; contain:layout style; } .page.on { display:block; }
/* ================================================================ HERO BANNER ================================================================ */ .hero-banner { margin:10px 16px; background:linear-gradient(135deg,var(–g) 0%,#003d21 60%,#001a0e 100%); border-radius:var(–r20); padding:20px; position:relative; overflow:hidden; } .hero-banner::before { content:’’; position:absolute; inset:0; pointer-events:none; background:url(“data:image/svg+xml,%3Csvg width=‘60’ height=‘60’ viewBox=‘0 0 60 60’ xmlns=‘http://www.w3.org/2000/svg’%3E%3Cg fill=’%23fff’ fill-opacity=‘0.035’%3E%3Cpath d=‘M0 0h30v30H0V0zm30 30h30v30H30V30z’/%3E%3C/g%3E%3C/svg%3E”); } .hb-in { position:relative; z-index:1; } .hb-tag { display:inline-flex; align-items:center; gap:6px; background:rgba(212,160,23,.18); border:1px solid rgba(212,160,23,.35); color:var(–goldb); font-size:11px; font-weight:700; padding:5px 12px; border-radius:var(–rpill); margin-bottom:10px; letter-spacing:.3px; } .hb-h1 { font-family:‘Playfair Display’,serif; font-size:clamp(22px,5vw,30px); font-weight:900; color:#fff; line-height:1.2; margin-bottom:6px; } .hb-h1 em { font-style:normal; color:var(–goldb); } .hb-sub { font-size:12px; color:rgba(255,255,255,.7); margin-bottom:16px; line-height:1.6; } .hb-stats { display:flex; gap:20px; } .hb-n { font-family:‘Playfair Display’,serif; font-size:20px; font-weight:900; color:var(–goldb); line-height:1; } .hb-l { font-size:10px; color:rgba(255,255,255,.55); margin-top:2px; } .hb-cta { display:inline-flex; align-items:center; gap:6px; background:var(–goldb); color:#111; padding:11px 22px; border-radius:var(–rpill); font-size:13px; font-weight:700; margin-top:16px; border:none; cursor:pointer; font-family:inherit; transition:all .2s var(–ease); will-change:transform; } .hb-cta:active { transform:scale(.96); }
/* ================================================================ SEARCH ================================================================ */ .search-sticky { padding:10px 16px 12px; background:var(–bg); position:sticky; top:var(–nav); z-index:50; border-bottom:1px solid var(–bdrs); backdrop-filter:blur(12px); -webkit-backdrop-filter:blur(12px); } .search-row { display:flex; gap:8px; align-items:center; } .search-inp-w { flex:1; position:relative; } .search-inp { width:100%; height:44px; padding:0 40px 0 14px; background:#fff; border:1.5px solid var(–bdr); border-radius:var(–rpill); font-size:15px; color:var(–txt); transition:border-color .2s, box-shadow .2s; } .search-inp:focus { border-color:var(–g); box-shadow:0 0 0 3px var(–gg); } .search-inp::placeholder { color:var(–mut); } .search-ico { position:absolute; right:13px; top:50%; transform:translateY(-50%); font-size:16px; pointer-events:none; } .btn-filter { width:44px; height:44px; border-radius:var(–rpill); background:var(–g); color:#fff; font-size:18px; display:flex; align-items:center; justify-content:center; flex-shrink:0; transition:all .2s; will-change:transform; } .btn-filter:active { transform:scale(.93); background:var(–gm); }
/* ================================================================ HORIZONTAL SCROLL CHIPS ================================================================ */ .hscroll { display:flex; gap:8px; padding:10px 16px 14px; overflow-x:auto; scrollbar-width:none; -webkit-overflow-scrolling:touch; } .hscroll::-webkit-scrollbar { display:none; }
/* Category chips */ .cat-chip { flex-shrink:0; display:flex; flex-direction:column; align-items:center; gap:4px; padding:10px 14px; background:#fff; border:1.5px solid var(–bdr); border-radius:var(–r16); cursor:pointer; min-width:72px; transition:all .2s var(–ease); } .cat-chip:active { transform:scale(.93); } .cat-chip.on { background:var(–g); border-color:var(–g); } .cat-chip.on .cc-ico, .cat-chip.on .cc-lbl { color:#fff; } .cc-ico { font-size:22px; } .cc-lbl { font-size:10px; font-weight:700; color:var(–mut); white-space:nowrap; }
/* ================================================================ SECTION HEADER ================================================================ */ .sec-hd { display:flex; align-items:center; justify-content:space-between; padding:14px 16px 10px; } .sec-ttl { font-family:‘Playfair Display’,serif; font-size:18px; font-weight:900; } .sec-more { font-size:13px; font-weight:600; color:var(–g); cursor:pointer; }
/* ================================================================ SHOP CARDS (horizontal scroll) ================================================================ */ .shop-card-m { flex-shrink:0; width:200px; background:var(–card); border:1px solid var(–bdr); border-radius:var(–r20); overflow:hidden; transition:all .2s var(–ease); contain:layout; } .shop-card-m:active { transform:scale(.97); } .scm-cover { height:88px; display:flex; align-items:center; justify-content:center; font-size:36px; position:relative; } .scm1{background:linear-gradient(135deg,#FF6B6B,#FFE66D)} .scm2{background:linear-gradient(135deg,#4FACFE,#00F2FE)} .scm3{background:linear-gradient(135deg,#43E97B,#38F9D7)} .scm4{background:linear-gradient(135deg,#FA709A,#FEE140)} .scm5{background:linear-gradient(135deg,#A18CD1,#FBC2EB)} .scm6{background:linear-gradient(135deg,#FCCB90,#D57EEB)} .scm-vrf { position:absolute; top:8px; left:8px; background:var(–g); color:#fff; font-size:9px; font-weight:700; padding:2px 8px; border-radius:var(–rpill); } .scm-rat { position:absolute; top:8px; right:8px; background:rgba(0,0,0,.32); backdrop-filter:blur(4px); -webkit-backdrop-filter:blur(4px); color:#fff; font-size:11px; font-weight:700; padding:3px 8px; border-radius:var(–rpill); } .scm-body { padding:10px 12px 12px; } .scm-av { width:38px; height:38px; border-radius:50%; border:2px solid #fff; margin-top:-22px; background:var(–g); display:flex; align-items:center; justify-content:center; font-size:18px; box-shadow:0 2px 8px rgba(0,0,0,.12); margin-bottom:6px; } .scm-name { font-weight:700; font-size:13px; margin-bottom:2px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; } .scm-city { font-size:11px; color:var(–mut); margin-bottom:8px; } .scm-stats { display:flex; gap:10px; margin-bottom:8px; } .scm-stat strong { display:block; font-size:13px; font-weight:700; color:var(–g); } .scm-stat span { font-size:10px; color:var(–mut); } .scm-wa { width:100%; padding:8px; border-radius:var(–r8); background:#25D366; color:#fff; font-size:12px; font-weight:700; display:flex; align-items:center; justify-content:center; gap:5px; border:none; cursor:pointer; font-family:inherit; transition:all .2s; will-change:transform; } .scm-wa:active { background:#20BA5A; transform:scale(.96); }
/* ================================================================ PRODUCT CARDS (2-col grid) ================================================================ */ .prod-grid { display:grid; grid-template-columns:repeat(2,1fr); gap:10px; padding:0 16px; } @media(min-width:480px) { .prod-grid { grid-template-columns:repeat(3,1fr); } } @media(min-width:768px) { .prod-grid { grid-template-columns:repeat(4,1fr); gap:16px; padding:0 24px; } } @media(min-width:1024px) { .prod-grid { grid-template-columns:repeat(5,1fr); padding:0 40px; } }
.prod-card { background:var(–card); border:1px solid var(–bdr); border-radius:var(–r16); overflow:hidden; transition:all .2s var(–ease); contain:layout; } .prod-card:active { transform:scale(.97); box-shadow:var(–shl); } .pc-img { aspect-ratio:1/1; position:relative; display:flex; align-items:center; justify-content:center; font-size:48px; overflow:hidden; } .pc-img img { position:absolute; inset:0; width:100%; height:100%; object-fit:cover; } .pi1{background:linear-gradient(135deg,#FFF3E0,#FFE0B2)} .pi2{background:linear-gradient(135deg,#E8F5E9,#C8E6C9)} .pi3{background:linear-gradient(135deg,#FCE4EC,#F8BBD0)} .pi4{background:linear-gradient(135deg,#E3F2FD,#BBDEFB)} .pi5{background:linear-gradient(135deg,#F3E5F5,#E1BEE7)} .pi6{background:linear-gradient(135deg,#FFFDE7,#FFF9C4)} .pc-badge { position:absolute; top:6px; left:6px; font-size:9px; font-weight:800; padding:3px 8px; border-radius:var(–rpill); text-transform:uppercase; letter-spacing:.4px; } .b-new{background:var(–red);color:#fff} .b-top{background:var(–gold);color:#fff} .b-promo{background:var(–g);color:#fff} .pc-fav { position:absolute; top:6px; right:6px; width:30px; height:30px; border-radius:50%; background:rgba(255,255,255,.88); backdrop-filter:blur(4px); -webkit-backdrop-filter:blur(4px); display:flex; align-items:center; justify-content:center; font-size:14px; cursor:pointer; border:1px solid rgba(255,255,255,.5); transition:all .2s; } .pc-fav:active { transform:scale(1.15); background:#fff; } .pc-stk { position:absolute; bottom:5px; left:6px; font-size:9px; font-weight:700; padding:2px 7px; border-radius:var(–rpill); background:rgba(0,0,0,.42); backdrop-filter:blur(3px); -webkit-backdrop-filter:blur(3px); color:#fff; } .pc-body { padding:9px 10px 11px; } .pc-shop { font-size:9px; font-weight:700; color:var(–mut); text-transform:uppercase; letter-spacing:.4px; margin-bottom:3px; } .pc-name { font-weight:700; font-size:12px; line-height:1.3; margin-bottom:5px; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; } .pc-stars { color:var(–gold); font-size:10px; margin-bottom:6px; } .pc-foot { display:flex; align-items:center; justify-content:space-between; gap:4px; } .pc-price { font-family:‘Playfair Display’,serif; font-size:15px; font-weight:900; color:var(–g); } .pc-price small { font-size:10px; font-family:‘DM Sans’,sans-serif; color:var(–mut); font-weight:400; } .pc-acts { display:flex; gap:5px; } .bwa,.bcart { width:30px; height:30px; border-radius:8px; display:flex; align-items:center; justify-content:center; font-size:14px; border:none; cursor:pointer; transition:all .2s; will-change:transform; flex-shrink:0; } .bwa { background:#25D366; color:#fff; } .bwa:active { background:#20BA5A; transform:scale(.91); } .bcart { background:var(–g); color:#fff; } .bcart:active { background:var(–gm); transform:scale(.91); }
/* ================================================================ BOUTIQUE FULLSCREEN ================================================================ */ .boutique-page { display:none; position:fixed; inset:0; z-index:380; background:var(–bg); overflow-y:auto; contain:layout; } .boutique-page.on { display:block; }
.bp-nav { position:sticky; top:0; z-index:10; height:52px; background:rgba(250,247,242,.96); backdrop-filter:blur(16px); -webkit-backdrop-filter:blur(16px); border-bottom:1px solid var(–bdr); display:flex; align-items:center; justify-content:space-between; padding:0 16px; } .bp-back { display:flex; align-items:center; gap:5px; font-size:14px; font-weight:600; color:var(–g); background:var(–gg); padding:8px 14px; border-radius:var(–rpill); border:none; cursor:pointer; font-family:inherit; transition:all .2s; } .bp-back:active { transform:scale(.95); }
.bp-cover { height:180px; position:relative; overflow:hidden; display:flex; align-items:flex-end; padding:0 16px 0; } .bp-cover-bg { position:absolute; inset:0; background:linear-gradient(135deg,var(–g),#003d21); } .bp-cover-pat { position:absolute; inset:0; background:url(“data:image/svg+xml,%3Csvg width=‘60’ height=‘60’ viewBox=‘0 0 60 60’ xmlns=‘http://www.w3.org/2000/svg’%3E%3Cg fill=’%23fff’ fill-opacity=‘0.035’%3E%3Cpath d=‘M0 0h30v30H0V0zm30 30h30v30H30V30z’/%3E%3C/g%3E%3C/svg%3E”); } .bp-logo { width:70px; height:70px; border-radius:var(–r16); border:3px solid #fff; background:var(–g); display:flex; align-items:center; justify-content:center; font-size:32px; box-shadow:var(–shl); position:relative; z-index:1; transform:translateY(36px); }
.bp-info { padding:44px 16px 16px; } .bp-name { font-family:‘Playfair Display’,serif; font-size:22px; font-weight:900; margin-bottom:4px; } .bp-owner { font-size:13px; color:var(–mut); margin-bottom:8px; } .bp-desc { font-size:14px; color:var(–txt2); line-height:1.65; margin-bottom:14px; }
.bp-stats { display:flex; background:#fff; border:1px solid var(–bdr); border-radius:var(–r16); overflow:hidden; margin-bottom:14px; } .bp-stat { flex:1; padding:12px 8px; text-align:center; border-right:1px solid var(–bdr); } .bp-stat:last-child { border-right:none; } .bp-stat-n { font-family:‘Playfair Display’,serif; font-size:18px; font-weight:900; color:var(–g); } .bp-stat-l { font-size:10px; color:var(–mut); margin-top:2px; }
.bp-acts { display:flex; gap:10px; margin-bottom:16px; } .bp-btn-foll { flex:1; padding:12px; border-radius:var(–r12); border:1.5px solid var(–bdr); font-size:14px; font-weight:700; color:var(–txt2); background:transparent; cursor:pointer; font-family:inherit; transition:all .2s; display:flex; align-items:center; justify-content:center; gap:6px; } .bp-btn-foll.on { background:var(–g); color:#fff; border-color:var(–g); } .bp-btn-wa { flex:1; padding:12px; border-radius:var(–r12); background:#25D366; color:#fff; font-size:14px; font-weight:700; border:none; cursor:pointer; font-family:inherit; display:flex; align-items:center; justify-content:center; gap:6px; transition:all .2s; } .bp-btn-wa:active { background:#20BA5A; transform:scale(.98); }
.bp-tabs { display:flex; border-bottom:1px solid var(–bdr); background:#fff; overflow-x:auto; scrollbar-width:none; } .bp-tabs::-webkit-scrollbar { display:none; } .bp-tab { flex:1; padding:13px 10px; font-size:13px; font-weight:600; color:var(–mut); border-bottom:2px solid transparent; cursor:pointer; white-space:nowrap; text-align:center; min-width:80px; transition:all .2s; } .bp-tab.on { color:var(–g); border-bottom-color:var(–g); }
.bp-content { padding:16px; }
/* ================================================================ INSCRIPTION VENDEUR (full screen) ================================================================ */ .reg-page { display:none; position:fixed; inset:0; z-index:440; background:var(–bg); overflow-y:auto; } .reg-page.on { display:block; }
.reg-nav { position:sticky; top:0; z-index:10; height:52px; background:rgba(250,247,242,.96); backdrop-filter:blur(16px); -webkit-backdrop-filter:blur(16px); border-bottom:1px solid var(–bdr); display:flex; align-items:center; justify-content:space-between; padding:0 16px; } .reg-step-lbl { font-size:13px; color:var(–mut); font-weight:600; }
.reg-prog { height:3px; background:var(–bdrs); } .reg-prog-fill { height:100%; background:var(–g); border-radius:0 2px 2px 0; transition:width .4s var(–ease); will-change:width; }
.reg-body { padding:20px 20px calc(80px + var(–safe)); } .reg-step { display:none; } .reg-step.on { display:block; } .reg-h1 { font-family:‘Playfair Display’,serif; font-size:22px; font-weight:900; margin-bottom:6px; } .reg-sub { font-size:14px; color:var(–mut); margin-bottom:24px; line-height:1.6; }
.reg-fixed { position:fixed; bottom:0; left:0; right:0; padding:12px 20px calc(12px + var(–safe)); background:rgba(250,247,242,.97); backdrop-filter:blur(12px); -webkit-backdrop-filter:blur(12px); border-top:1px solid var(–bdr); z-index:10; display:flex; gap:10px; } .reg-fixed button { flex:1; }
/* ================================================================ PANIER (bottom sheet) ================================================================ */ .sheet-overlay { position:fixed; inset:0; background:rgba(0,0,0,.45); z-index:var(–z-sh); opacity:0; pointer-events:none; transition:opacity .25s; backdrop-filter:blur(2px); -webkit-backdrop-filter:blur(2px); will-change:opacity; } .sheet-overlay.on { opacity:1; pointer-events:auto; }
.sheet { position:fixed; bottom:0; left:0; right:0; z-index:calc(var(–z-sh) + 1); background:#fff; border-radius:24px 24px 0 0; padding:0 0 calc(24px + var(–safe)); transform:translateY(100%); transition:transform .35s var(–ease); max-height:92vh; overflow-y:auto; box-shadow:0 -8px 40px rgba(0,0,0,.13); will-change:transform; overscroll-behavior:contain; } .sheet.on { transform:translateY(0); }
.sh-handle { width:36px; height:4px; background:var(–bdr); border-radius:2px; margin:12px auto 4px; } .sh-hd { display:flex; align-items:center; justify-content:space-between; padding:12px 20px 4px; } .sh-title { font-family:‘Playfair Display’,serif; font-size:18px; font-weight:900; } .sh-close { width:32px; height:32px; border-radius:50%; background:var(–bgw); border:1px solid var(–bdr); display:flex; align-items:center; justify-content:center; font-size:15px; cursor:pointer; transition:background .15s; } .sh-close:active { background:var(–bdr); } .sh-body { padding:8px 20px; }
/* Cart items */ .ci-row { display:flex; align-items:center; gap:12px; padding:12px 0; border-bottom:1px solid var(–bdrs); } .ci-img { width:56px; height:56px; border-radius:var(–r12); display:flex; align-items:center; justify-content:center; font-size:24px; flex-shrink:0; } .ci-info { flex:1; min-width:0; } .ci-info h4 { font-size:14px; font-weight:600; margin-bottom:2px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; } .ci-info p { font-size:13px; color:var(–g); font-weight:700; } .ci-qty { display:flex; align-items:center; gap:8px; flex-shrink:0; } .qty-b { width:28px; height:28px; border-radius:8px; border:1px solid var(–bdr); background:var(–bgw); font-size:16px; font-weight:700; display:flex; align-items:center; justify-content:center; cursor:pointer; transition:all .15s; } .qty-b:active { background:var(–g); color:#fff; border-color:var(–g); } .qty-n { font-size:15px; font-weight:700; min-width:20px; text-align:center; } .cart-empty { text-align:center; padding:48px 20px; } .cart-empty .ce-ico { font-size:48px; margin-bottom:12px; } .cart-empty .ce-ttl { font-size:17px; font-weight:700; margin-bottom:6px; } .cart-empty .ce-sub { font-size:14px; color:var(–mut); } .cart-total { display:flex; justify-content:space-between; align-items:center; padding:14px 0 0; border-top:1px solid var(–bdr); margin-top:4px; } .cart-total span { font-size:15px; color:var(–mut); } .cart-total strong { font-family:‘Playfair Display’,serif; font-size:22px; color:var(–g); } .btn-checkout { width:100%; padding:16px; border-radius:var(–r16); background:var(–g); color:#fff; font-size:16px; font-weight:700; display:flex; align-items:center; justify-content:center; gap:8px; margin-top:12px; border:none; cursor:pointer; font-family:inherit; transition:all .2s; box-shadow:var(–shg); will-change:transform; } .btn-checkout:active { background:var(–gm); transform:scale(.98); }
/* ================================================================ FORMS ================================================================ */ .fg { margin-bottom:16px; } .fg label { display:block; font-size:13px; font-weight:600; color:var(–txt2); margin-bottom:7px; } .fg label .req { color:var(–red); margin-left:2px; } .fi { width:100%; padding:13px 15px; border:1.5px solid var(–bdr); border-radius:var(–r12); font-size:15px; color:var(–txt); background:var(–bgw); transition:border-color .2s, box-shadow .2s; } .fi:focus { border-color:var(–g); box-shadow:0 0 0 3px var(–gg); outline:none; } .fi::placeholder { color:var(–mut); } .fi.err { border-color:var(–red); } textarea.fi { height:80px; resize:none; } .fi-row { display:grid; grid-template-columns:1fr 1fr; gap:12px; } .fi-full { grid-column:1/-1; } .ferr { font-size:11px; color:var(–red); margin-top:4px; display:none; } .fi.err + .ferr { display:block; }
/* Strength meter */ .strength-wrap { margin-top:5px; } .strength-bar { height:4px; background:var(–bdr); border-radius:2px; overflow:hidden; } .strength-fill { height:100%; border-radius:2px; transition:width .3s, background .3s; will-change:width; } .strength-lbl { font-size:11px; margin-top:3px; font-weight:600; }
/* Upload */ .upload-zone { border:2px dashed var(–bdr); border-radius:var(–r16); padding:24px; text-align:center; background:var(–bgw); cursor:pointer; position:relative; transition:all .2s; } .upload-zone:active { border-color:var(–g); background:var(–gg); } .upload-zone input { position:absolute; inset:0; opacity:0; cursor:pointer; } .uz-ico { font-size:30px; margin-bottom:6px; } .uz-txt { font-size:13px; color:var(–mut); } .uz-hint{ font-size:11px; color:var(–mut); margin-top:3px; } #logoPreview { width:68px; height:68px; border-radius:50%; object-fit:cover; display:none; margin:10px auto 0; border:3px solid var(–g); }
/* Slug preview */ .slug-preview { font-size:12px; color:var(–mut); margin-top:5px; } .slug-preview strong { color:var(–g); }
/* Buttons */ .btn-p { width:100%; padding:15px; border-radius:var(–r16); background:var(–g); color:#fff; font-size:15px; font-weight:700; border:none; cursor:pointer; font-family:inherit; display:flex; align-items:center; justify-content:center; gap:8px; transition:all .2s; margin-top:8px; box-shadow:var(–shg); will-change:transform; } .btn-p:active { background:var(–gm); transform:scale(.98); } .btn-p:disabled { opacity:.55; cursor:not-allowed; pointer-events:none; } .btn-s { width:100%; padding:13px; border-radius:var(–r16); background:transparent; color:var(–txt2); border:1.5px solid var(–bdr); font-size:14px; font-weight:600; cursor:pointer; font-family:inherit; margin-top:8px; transition:all .2s; } .btn-s:active { border-color:var(–g); color:var(–g); }
/* Toggle */ .toggle { width:42px; height:24px; border-radius:var(–rpill); background:var(–mut); position:relative; cursor:pointer; transition:background .25s var(–ease); border:none; flex-shrink:0; will-change:background; } .toggle.on { background:var(–g); } .toggle::after { content:’’; position:absolute; top:3px; left:3px; width:18px; height:18px; border-radius:50%; background:#fff; transition:transform .25s var(–ease); will-change:transform; } .toggle.on::after { transform:translateX(18px); }
/* ================================================================ PROFIL PAGE ================================================================ */ .profile-hero { background:linear-gradient(135deg,var(–g),#003d21); padding:clamp(32px,5vw,52px) 20px 64px; text-align:center; position:relative; } .profile-hero::after { content:’’; position:absolute; bottom:0; left:0; right:0; height:36px; background:var(–bg); border-radius:36px 36px 0 0; } .ph-av { width:78px; height:78px; border-radius:50%; border:3px solid #fff; background:var(–gm); display:flex; align-items:center; justify-content:center; font-size:36px; margin:0 auto 12px; box-shadow:var(–shl); } .ph-name { font-family:‘Playfair Display’,serif; font-size:20px; font-weight:900; color:#fff; margin-bottom:4px; } .ph-email{ font-size:13px; color:rgba(255,255,255,.65); }
.pcard { background:var(–card); border:1px solid var(–bdr); border-radius:var(–r16); margin:0 16px 12px; overflow:hidden; } .pcard-ttl { font-size:12px; font-weight:700; color:var(–mut); text-transform:uppercase; letter-spacing:.7px; padding:13px 16px 8px; border-bottom:1px solid var(–bdrs); } .pcard-item { display:flex; align-items:center; gap:12px; padding:13px 16px; border-bottom:1px solid var(–bdrs); cursor:pointer; transition:background .15s; } .pcard-item:last-child { border-bottom:none; } .pcard-item:active { background:var(–bgw); } .pi-ico { width:36px; height:36px; border-radius:var(–r8); display:flex; align-items:center; justify-content:center; font-size:18px; flex-shrink:0; } .pi-g { background:var(–gg); } .pi-r { background:var(–redb); } .pi-b { background:rgba(61,142,255,.09); } .pi-y { background:rgba(212,160,23,.1); } .pi-txt strong { display:block; font-size:14px; font-weight:600; } .pi-txt span { font-size:12px; color:var(–mut); } .pi-arr { margin-left:auto; font-size:18px; color:var(–mut); }
/* ================================================================ FAVORIS PAGE ================================================================ */ .favs-empty { text-align:center; padding:60px 20px; } .fe-ico { font-size:52px; margin-bottom:14px; } .fe-ttl { font-family:‘Playfair Display’,serif; font-size:20px; font-weight:700; margin-bottom:8px; } .fe-sub { font-size:14px; color:var(–mut); }
/* ================================================================ BOUTIQUES PAGE – full grid ================================================================ */ .shops-grid { display:grid; grid-template-columns:1fr 1fr; gap:10px; padding:0 16px; } @media(min-width:480px) { .shops-grid { grid-template-columns:repeat(3,1fr); } } @media(min-width:768px) { .shops-grid { grid-template-columns:repeat(4,1fr); gap:16px; padding:0 24px; } }
/* ================================================================ TOAST ================================================================ */ #toasts { position:fixed; bottom:calc(var(–tab) + var(–safe) + 10px); left:12px; right:12px; z-index:var(–z-tst); display:flex; flex-direction:column; gap:7px; pointer-events:none; } .toast { background:#fff; border:1px solid var(–bdr); border-left:4px solid var(–g); padding:12px 16px; border-radius:var(–r12); font-size:14px; font-weight:500; box-shadow:var(–shl); display:flex; align-items:center; gap:10px; transform:translateY(14px); opacity:0; transition:all .3s var(–ease); pointer-events:auto; will-change:transform,opacity; } .toast.show { transform:translateY(0); opacity:1; } .toast.hiding { transform:translateY(8px); opacity:0; } .toast.e { border-left-color:var(–red); } .toast.w { border-left-color:var(–gold); } .toast-x { margin-left:auto; cursor:pointer; font-size:14px; color:var(–mut); flex-shrink:0; } .toast-x:active { color:var(–txt); }
/* ================================================================ SKELETON ================================================================ */ .skel { background:linear-gradient(90deg,#f0ebe3 25%,#e5dfd6 50%,#f0ebe3 75%); background-size:200% 100%; animation:shim 1.5s infinite; will-change:background-position; } @keyframes shim { 0%{background-position:200% 0} 100%{background-position:-200% 0} } .skel-prod { border-radius:var(–r16); }
/* ================================================================ RESPONSIVE – desktop ================================================================ */ @media(min-width:768px) { body { padding-bottom:0; } #btmnav { display:none; } #topnav { height:68px; padding:0 clamp(24px,5%,80px); } .page { padding-top:68px; } .sec-hd { padding:20px clamp(24px,5%,80px) 12px; } .search-sticky { padding:12px clamp(24px,5%,80px) 14px; } .hscroll { padding:10px clamp(24px,5%,80px) 16px; } .hero-banner { margin:14px clamp(24px,5%,80px); } }
/* Flag stripe */ .flag { height:5px; display:flex; } .f-g{flex:1;background:var(–g)} .f-y{flex:1;background:var(–goldb)} .f-r{flex:1;background:var(–red)}
/* Vendor CTA section */ .vendor-cta { margin:16px 16px 0; background:linear-gradient(135deg,var(–g) 0%,#004d2b 60%,#002a17 100%); border-radius:var(–r20); padding:24px 20px; position:relative; overflow:hidden; color:#fff; text-align:center; } .vendor-cta::before { content:’’; position:absolute; inset:0; background:radial-gradient(circle at 70% 50%,rgba(245,184,0,.12) 0%,transparent 65%); pointer-events:none; } .vc-in { position:relative; z-index:1; } .vc-h2 { font-family:‘Playfair Display’,serif; font-size:20px; font-weight:900; margin-bottom:8px; line-height:1.25; } .vc-h2 span { color:var(–goldb); } .vc-sub { font-size:13px; opacity:.8; margin-bottom:18px; line-height:1.65; } .vc-feats { display:flex; flex-wrap:wrap; gap:10px; justify-content:center; margin-bottom:18px; } .vc-feat { display:flex; align-items:center; gap:6px; font-size:12px; font-weight:600; } .vc-chk { width:20px; height:20px; border-radius:50%; background:rgba(255,255,255,.18); display:flex; align-items:center; justify-content:center; font-size:10px; font-weight:700; flex-shrink:0; }
<!-- Step 2 -->
<div class="reg-step" id="regS2">
<div class="reg-h1">Votre profil vendeur</div>
<div class="reg-sub">Informations affichees sur votre boutique</div>
<div class="fi-row">
<div class="fg"><label for="rVille">Ville <span class="req">*</span></label>
<select class="fi" id="rVille"><option value="">Choisir...</option><option>Casablanca</option><option>Rabat</option><option>Marrakech</option><option>Tanger</option><option>Agadir</option><option>Dakar</option><option>Autre</option></select>
</div>
<div class="fg"><label for="rTel">Telephone <span class="req">*</span></label><input class="fi" id="rTel" type="tel" placeholder="+212 6XX XXX" autocomplete="tel"></div>
</div>
<div class="fg"><label for="rWa">WhatsApp commandes</label><input class="fi" id="rWa" type="tel" placeholder="+212 6XX XXX (idem si pareil)"></div>
</div>
<!-- Step 3 -->
<div class="reg-step" id="regS3">
<div class="reg-h1">Votre boutique</div>
<div class="reg-sub">Personnalisez votre espace SenMarket</div>
<div class="fg">
<label for="rBoutique">Nom de la boutique <span class="req">*</span></label>
<input class="fi" id="rBoutique" type="text" placeholder="Ex: Awa Fashion Casa">
<div class="slug-preview">URL : <strong id="slugPreview">senmarket.ma/boutique/votre-nom</strong></div>
</div>
<div class="fg"><label for="rCat">Categorie <span class="req">*</span></label>
<select class="fi" id="rCat"><option value="">Choisir...</option><option>Mode & Tissu</option><option>Alimentation</option><option>Beaute & Soin</option><option>Bijoux & Art</option><option>High-Tech</option><option>Maison & Deco</option><option>Services</option></select>
</div>
<div class="fg"><label for="rDesc">Description</label><textarea class="fi" id="rDesc" placeholder="Decrivez vos produits, votre histoire..."></textarea></div>
<div class="fg">
<label>Logo de votre boutique</label>
<div class="upload-zone" id="uploadZone">
<input type="file" id="rLogo" accept="image/*">
<div class="uz-ico">🖼️</div>
<div class="uz-txt">Appuyez pour choisir une image</div>
<div class="uz-hint">JPG, PNG, WebP -- max 2 Mo</div>
</div>
<img id="logoPreview" alt="Apercu logo">
</div>
<div id="regMsg" role="alert" aria-live="polite"></div>
</div>