Ecommerce Template
Next.js·React 등으로 만든 최신 전자상거래 템플릿
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기senlink
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
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>