id:"pro-torty", title:"PRO Торты", summary:"Для тех, кто хочет продавать торты дороже и увереннее работать с заказами.", image:"", accent:"pink", offerType:"discount", priceOld:18000, priceNew:12240, discountType:"promo", payLink:"https://example.com/zenclass/pro-torty", promoCode:"ALINA32", bonuses:["Шаблоны расчета себестоимости", "Разбор частых ошибок"], lifetimeAccess:true, seats:{enabled:true,start:24,ratePerHour:.7,min:2,startAt:"2026-06-22T00:00:00+03:00"}, detail:{mode:"modal",ref:"#detail-pro-torty"} }, { id:"bundle-start", title:"Пакет «Сладкий старт»", summary:"Набор курсов для тех, кто хочет закрыть сразу несколько пробелов.", image:"", accent:"blue", offerType:"discount_plus_gift", priceOld:26000, priceNew:17680, discountType:"preset", payLink:"https://example.com/zenclass/bundle-start", promoCode:null, bundleItems:["Это База 2.0", "Капитан Кукис"], bonuses:["Общий план обучения", "Дополнительный мини-урок"], lifetimeAccess:false, seats:{enabled:false}, detail:{mode:"none"} } ], wheel:{ enabled:true, oncePerUser:true, storageKey:"aps_sale_2026_wheel", prizes:[ {id:"w1",label:"+5% к скидке",kind:"promo",promoCode:"SPIN5",weight:1}, {id:"w2",label:"Набор шаблонов в подарок",kind:"bonus",note:"Выдается вручную после оплаты",weight:1}, {id:"w3",label:"Дополнительный урок-разбор",kind:"bonus",note:"Напишите менеджеру после оплаты",weight:1}, {id:"w4",label:"Чек-лист кондитера",kind:"bonus",note:"Ссылка придет в Telegram",weight:1} ] }, advent:{ startDate:"2026-06-11", endDate:"2026-06-21", days:[ {date:"2026-06-11",title:"День 1",reward:"Мини-урок: как выбрать начинку под сезон",link:"https://t.me/example"}, {date:"2026-06-12",title:"День 2",reward:"Чек-лист закупок для домашней кухни",link:"https://t.me/example"}, {date:"2026-06-13",title:"День 3",reward:"Шаблон расчета себестоимости",link:"https://t.me/example"}, {date:"2026-06-14",title:"День 4",reward:"Разбор частых ошибок в креме",link:"https://t.me/example"}, {date:"2026-06-15",title:"День 5",reward:"Мини-рецепт стабильной начинки",link:"https://t.me/example"}, {date:"2026-06-16",title:"День 6",reward:"Памятка по хранению и перевозке",link:"https://t.me/example"}, {date:"2026-06-17",title:"День 7",reward:"Идеи для летней витрины",link:"https://t.me/example"}, {date:"2026-06-18",title:"День 8",reward:"Шаблон ответа клиенту",link:"https://t.me/example"}, {date:"2026-06-19",title:"День 9",reward:"Мини-урок по декору",link:"https://t.me/example"}, {date:"2026-06-20",title:"День 10",reward:"План подготовки к распродаже",link:"https://t.me/example"}, {date:"2026-06-21",title:"День 11",reward:"Завтра старт распродажи. Проверьте бот и выберите курс заранее.",link:"https://t.me/example"} ] } }; function mergeConfig(base, patch){ if(!patch || typeof patch !== "object") return base; Object.keys(patch).forEach(function(key){ if(Array.isArray(patch[key])) base[key] = patch[key]; else if(patch[key] && typeof patch[key] === "object"){ base[key] = mergeConfig(base[key] && typeof base[key] === "object" ? base[key] : {}, patch[key]); }else if(patch[key] !== undefined){ base[key] = patch[key]; } }); return base; } window.SALE_CONFIG = mergeConfig(defaultConfig, existingConfig); function pad(value){return String(value).padStart(2,"0");} function apsNow(){ var queryNow = ""; try{queryNow = new URLSearchParams(window.location.search).get("aps_now") || "";}catch(e){} return queryNow || window.APS_TEST_NOW ? new Date(queryNow || window.APS_TEST_NOW) : new Date(); } function moscowParts(date){ var formatter = new Intl.DateTimeFormat("ru-RU", { timeZone:"Europe/Moscow", year:"numeric", month:"2-digit", day:"2-digit", hour:"2-digit", minute:"2-digit", second:"2-digit", hour12:false }); var parts = formatter.formatToParts(date).reduce(function(acc, part){ acc[part.type] = part.value; return acc; }, {}); return parts; } function moscowDateString(date){ var p = moscowParts(date); return p.year + "-" + p.month + "-" + p.day; } function isoAtMoscowMidnight(dateString){ return dateString + "T00:00:00+03:00"; } function addDays(dateString, days){ var bits = dateString.split("-").map(Number); var parsed = new Date(Date.UTC(bits[0], bits[1] - 1, bits[2] + days)); return parsed.getUTCFullYear() + "-" + pad(parsed.getUTCMonth() + 1) + "-" + pad(parsed.getUTCDate()); } function compareDateStrings(left, right){ if(left === right) return 0; return left > right ? 1 : -1; } function apsSaleDayIndex(){ var config = window.SALE_CONFIG; var now = apsNow(); if(now < new Date(config.sale.startAt)) return -1; if(now > new Date(config.sale.endAt)) return "ended"; var today = moscowDateString(now); var calendar = config.calendar || []; var exactIndex = calendar.findIndex(function(day){return day.date === today;}); if(exactIndex >= 0) return exactIndex; for(var i = calendar.length - 1; i >= 0; i -= 1){ if(compareDateStrings(today, calendar[i].date) >= 0) return i; } return -1; } function apsPhase(){ var config = window.SALE_CONFIG; var now = apsNow(); var today = moscowDateString(now); if(config.advent && compareDateStrings(today, config.advent.startDate) >= 0 && compareDateStrings(today, config.advent.endDate) <= 0) return "advent"; if(now >= new Date(config.sale.startAt) && now <= new Date(config.sale.endAt)) return "sale"; if(now > new Date(config.sale.endAt)) return "ended"; return "before"; } function nearestCountdownTarget(){ var config = window.SALE_CONFIG; var now = apsNow(); if(now < new Date(config.sale.startAt)){ return {date:new Date(config.sale.startAt),label:"до старта распродажи"}; } if(now > new Date(config.sale.endAt)){ return {date:null,label:"распродажа завершена"}; } var today = moscowDateString(now); var currentIndex = apsSaleDayIndex(); var isLastDay = currentIndex === "ended" || currentIndex >= (config.calendar || []).length - 1; if(isLastDay){ return {date:new Date(config.sale.endAt),label:"до конца распродажи"}; } return {date:new Date(isoAtMoscowMidnight(addDays(today, 1))),label:"до снижения скидки"}; } function formatMoney(value){ if(value === null || value === undefined || value === "") return ""; return new Intl.NumberFormat("ru-RU").format(Number(value)) + " ₽"; } function showToast(message){ var toast = document.querySelector(".aps-toast"); if(!toast){ toast = document.createElement("div"); toast.className = "aps-toast"; document.body.appendChild(toast); } toast.textContent = message; toast.classList.add("is-visible"); window.clearTimeout(showToast.timer); showToast.timer = window.setTimeout(function(){toast.classList.remove("is-visible");}, 1800); } function copyText(value){ if(!value) return Promise.resolve(false); if(navigator.clipboard && navigator.clipboard.writeText){ return navigator.clipboard.writeText(value).then(function(){return true;}).catch(function(){return fallbackCopy(value);}); } return Promise.resolve(fallbackCopy(value)); } function fallbackCopy(value){ var input = document.createElement("textarea"); input.value = value; input.setAttribute("readonly", ""); input.style.position = "fixed"; input.style.top = "-1000px"; document.body.appendChild(input); input.select(); var ok = false; try{ok = document.execCommand("copy");}catch(e){ok = false;} input.remove(); return ok; } window.APS = { now:apsNow, phase:apsPhase, saleDayIndex:apsSaleDayIndex, moscowDateString:moscowDateString, nearestCountdownTarget:nearestCountdownTarget, formatMoney:formatMoney, showToast:showToast, copyText:copyText, isoAtMoscowMidnight:isoAtMoscowMidnight }; })();
transform:translateX(-50%); width:0; height:0; border-left:18px solid transparent; border-right:18px solid transparent; border-top:34px solid var(--aps-ink); filter:drop-shadow(0 3px 4px rgba(61,61,61,.18)); } .aps-wheel-center{ position:absolute; width:26%; aspect-ratio:1; border-radius:50%; background:var(--aps-white); display:grid; place-items:center; font:600 clamp(14px,2vw,18px)/1.1 'Montserrat',Arial,sans-serif; text-align:center; box-shadow:var(--aps-shadow-soft); } .aps-wheel-result{ display:none; width:100%; padding:16px; border-radius:var(--r-tile); background:rgba(225,224,100,.28); } .aps-wheel-result.is-visible{display:block;} .aps-wheel-result strong{ display:block; font-family:'Montserrat',Arial,sans-serif; font-size:clamp(20px,3vw,28px); line-height:1.15; } .aps-wheel-result p{margin-top:8px;font-size:14px;} .aps-wheel-actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:12px;} .aps-confetti-piece{ position:fixed; z-index:99998; width:9px; height:13px; border-radius:4px; pointer-events:none; animation:apsConfetti 900ms ease-out forwards; } @keyframes apsConfetti{ from{transform:translate(0,0) rotate(0);opacity:1;} to{transform:translate(var(--dx),var(--dy)) rotate(260deg);opacity:0;} } @media (max-width:880px){ .aps-wheel-shell{grid-template-columns:1fr;} .aps-wheel-copy{text-align:left;} }
Колесо фортуны

Крутите за подарок

Во время распродажи можно получить промокод или дополнительный бонус к покупке.

APS
SALE