/* ============================================================ Выравнивание НИЗА правого блока под левую колонку Carrd С СОХРАНЕНИЕМ равных зазоров между всеми рядами. Идея: не набиваем пустоту, а подбираем единый зазор --row-gap так, чтобы (2 карточки + список + равные зазоры) в сумме дали высоту левой колонки. Промежутки остаются равными между собой, и низ блока совпадает с низом левой колонки. ВАЖНО: ТОЛЬКО блочные комментарии. Carrd публикует код embed'а в ОДНУ строку, и однострочные // закомментировали бы весь остаток скрипта (SyntaxError). Не добавляй // сюда. ============================================================ */ (function () { var wrap = document.getElementById('cw-fs-wrap'); if (!wrap) return; var BASE = 14; /* минимальный зазор в px = дефолт --row-gap */ wrap.style.setProperty('--row-gap', BASE + 'px'); return; function visibleKids(el) { var out = []; for (var i = 0; i < el.children.length; i++) { var c = el.children[i]; if (c.offsetWidth > 0 && c.offsetHeight > 0) out.push(c); } return out; } /* колонки стоят рядом: близкий верх, но разное «лево» */ function sideBySide(kids) { var t = kids.map(function (k) { return k.getBoundingClientRect().top; }); var l = kids.map(function (k) { return k.getBoundingClientRect().left; }); return (Math.max.apply(null, t) - Math.min.apply(null, t) < 60) && (Math.max.apply(null, l) - Math.min.apply(null, l) > 40); } /* строка колонок Carrd = .inner, который держит наш блок и 2+ колонки в ряд */ function findRow() { var cont = wrap.closest('.columns'); var scope = cont || document.body; var inners = scope.getElementsByClassName('inner'); for (var i = inners.length - 1; i >= 0; i--) { var c = inners[i]; if (!c.contains(wrap)) continue; var k = visibleKids(c); if (k.length >= 2 && sideBySide(k)) return c; } var n = wrap.parentElement; while (n && n !== document.body) { var k2 = visibleKids(n); if (k2.length >= 2 && sideBySide(k2)) return n; n = n.parentElement; } return null; } var observed = null; function fit() { wrap.style.setProperty('--row-gap', BASE + 'px'); /* сброс к базе перед замером */ var row = findRow(); if (!row) return; /* мобила / нет ряда колонок — оставляем базовый зазор */ /* наш столбец = прямой ребёнок row, внутри которого мы */ var col = wrap; while (col.parentElement && col.parentElement !== row) col = col.parentElement; /* самая высокая соседняя (левая) колонка */ var maxH = 0, tallest = null; for (var j = 0; j < row.children.length; j++) { var ch = row.children[j]; if (ch === col) continue; if (ch.offsetHeight > maxH) { maxH = ch.offsetHeight; tallest = ch; } } if (!tallest) return; /* целевая высота блока = низ левой колонки − верх нашего блока */ var target = tallest.getBoundingClientRect().bottom - wrap.getBoundingClientRect().top; /* суммарная высота рядов без зазоров: 2 карточки + список преимуществ */ var rows = wrap.querySelectorAll('.cw-fs-card, .cw-fs-benefits'); var rowsH = 0; for (var r = 0; r < rows.length; r++) rowsH += rows[r].getBoundingClientRect().height; var gaps = rows.length - 1; /* промежутки между рядами */ if (gaps < 1) return; var g = (target - rowsH) / gaps; if (g < BASE) g = BASE; /* контент выше колонки — не сжимаем, ставим базу */ wrap.style.setProperty('--row-gap', g + 'px'); /* следим за левой колонкой: догрузилось видео/иконки → пересчёт */ if (observed !== tallest && 'ResizeObserver' in window) { if (observed && ro) ro.unobserve(observed); observed = tallest; ro.observe(tallest); } } var ro = ('ResizeObserver' in window) ? new ResizeObserver(function () { fit(); }) : null; function schedule() { fit(); setTimeout(fit, 250); setTimeout(fit, 800); setTimeout(fit, 1600); } if (document.readyState === 'complete') schedule(); else window.addEventListener('load', schedule); var t; window.addEventListener('resize', function () { clearTimeout(t); t = setTimeout(fit, 120); }); })(); (function () { if (window.cwGaClicksInstalled) return; window.cwGaClicksInstalled = true; var BUTTONS = { "rule34.xxx": { eventName: "social_rule34_click", group: "social", name: "Rule34" }, "tantabus.ai": { eventName: "social_tantabus_click", group: "social", name: "Tantabus" }, "x.com": { eventName: "social_x_click", group: "social", name: "X" }, "bsky.app": { eventName: "social_bluesky_click", group: "social", name: "Bluesky" }, "pixiv.net": { eventName: "social_pixiv_click", group: "social", name: "Pixiv" }, "subscribestar.adult": { eventName: "donate_subscribestar_click", group: "donation", name: "SubscribeStar" }, "patreon.com": { eventName: "donate_patreon_click", group: "donation", name: "Patreon" } }; function buttonInfo(link) { var host; var key; try { host = new URL(link.href, window.location.href).hostname.toLowerCase(); } catch (error) { return null; } if (host.slice(0, 4) === "www.") host = host.slice(4); if (BUTTONS[host]) return BUTTONS[host]; for (key in BUTTONS) { if ( Object.prototype.hasOwnProperty.call(BUTTONS, key) && host.slice(-(key.length + 1)) === "." + key ) { return BUTTONS[key]; } } return null; } function sendEvent(info, link) { var url = new URL(link.href, window.location.href); var parameters = { button_group: info.group, button_name: info.name, link_url: url.href, link_domain: url.hostname, transport_type: "beacon" }; if (typeof window.gtag === "function") { window.gtag("event", info.eventName, parameters); return; } if (Array.isArray(window.dataLayer)) { window.dataLayer.push({ event: info.eventName, button_group: parameters.button_group, button_name: parameters.button_name, link_url: parameters.link_url, link_domain: parameters.link_domain }); } } document.addEventListener("click", function (event) { var target = event.target; var link; var info; if (!target || typeof target.closest !== "function") return; link = target.closest("a.cw-social-link, a.cw-fs-card"); if (!link) return; info = buttonInfo(link); if (!info) return; sendEvent(info, link); }, true); })();
Next post will be released on: (UTC) UTC time: --:--:-- ?
(function () { /* Файл со статусом на твоём Cloudflare (его пишет телеграм-бот) */ var STATUS_URL = "https://images.cloudwings.art/status.json"; var DAYS = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]; /* Запасные тексты, если status.json ещё не загружен/не создан */ var FALLBACK_SOON = "New posts are on the way - hang tight, cutie!!"; var lead = document.getElementById("cw-status-lead"); var dayEl = document.getElementById("cw-status-day"); var banner = document.getElementById("cw-status-banner"); var anchor = document.getElementById("utc-anchor"); function showDay(dayName) { lead.style.display = ""; dayEl.style.display = ""; anchor.style.display = "inline-block"; banner.style.display = "none"; dayEl.textContent = " " + dayName + " "; } function showBanner(text) { lead.style.display = "none"; dayEl.style.display = "none"; anchor.style.display = "none"; banner.style.display = ""; banner.textContent = text; } function utcDaysBetween(isoDate) { try { var parts = isoDate.split("-"); var start = Date.UTC(+parts[0], +parts[1] - 1, +parts[2]); var now = new Date(); var today = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()); var diff = Math.floor((today - start) / 86400000); return diff > 0 ? diff : 0; } catch (e) { return 0; } } function render(status) { if (!status || typeof status !== "object") { showBanner(FALLBACK_SOON); return; } var texts = status.texts || {}; if (status.mode === "soon") { showBanner(texts.soon || FALLBACK_SOON); return; } if (status.mode === "now") { showBanner(texts.now || FALLBACK_SOON); return; } if (status.mode === "custom") { showBanner(status.custom_text || FALLBACK_SOON); return; } /* mode === "day" */ var idx = DAYS.indexOf(status.day); if (idx < 0) idx = 0; if (status.auto && status.set_date) { idx = (idx + utcDaysBetween(status.set_date)) % 7; } showDay(DAYS[idx]); } fetch(STATUS_URL + "?v=" + Date.now(), { cache: "no-store" }) .then(function (r) { return r.json(); }) .then(render) .catch(function () { showBanner(FALLBACK_SOON); }); function updateUTCClock() { const clock = document.getElementById("utc-clock"); if (!clock) return; const now = new Date(); const utcDay = now.toLocaleDateString("en-US", { timeZone: "UTC", weekday: "short" }); const utcTime = now.toLocaleTimeString("en-GB", { timeZone: "UTC", hour: "2-digit", minute: "2-digit", second: "2-digit" }); clock.textContent = "UTC time: " + utcTime + " " + utcDay; } updateUTCClock(); setInterval(updateUTCClock, 1000); })();
(function(){ function boot(){ document.querySelectorAll('unloaded-script').forEach(function(n){ var t=n.textContent||'',s; if(!/cw(?:Shockwave|Cursor)Installed/.test(t))return; s=document.createElement('script'); s.text=t; document.head.appendChild(s); }); } boot(); addEventListener('load',boot); })();
Haha, kidding. I’m actually TidalSeashell’s sister. Boring, naive, just the way you like it :3
I only started using AI because I wanted to make comics. Right now, I can make almost any MLP comic, no matter how complex, with proper dialogue and everything... I’ll show you soon! But give it some time. I’m open to requests. I’m open to suggestions. I can make NSFW art with your OC from just one reference image. I can make a whole NSFW comic with your character. Hell, I can do pretty much anything!
Every picture starts with an idea in my head. Then I generate the first versions and edit them from there. I don’t finish the AI’s work - the AI finishes mine. That’s what drives me and my ideas, and what helps me create unique works
I make all my pictures as sets. Usually, I post 2-3 of them online, and the rest are available through a paid subscription. Sooo... are you still reading? I love you <3
(function () { var root = document.getElementById("animation"); if (!root) return; var PHOTO_URL = "https://images.cloudwings.art/anim1.webp"; var ARROW_URL = "https://images.cloudwings.art/anim2.webp"; var ABOUT_LINES = [ "Just a regular pony who generates", "pictures - what else were you", "expecting to read here?" ]; var photo = root.querySelector(".cw-about-photo"); var photoFlash = root.querySelector(".cw-about-photo-flash"); var arrow = root.querySelector(".cw-about-arrow"); var copy = root.querySelector(".cw-about-copy"); var lines = root.querySelectorAll(".cw-about-line"); var more = root.querySelector(".cw-about-more"); var reduceMotion = window.matchMedia("(prefers-reduced-motion: reduce)"); var loadPromise = null; var playId = 0; var typeTimer = 0; var scrollTimer = 0; function isAboutHash(value) { value = String(value || "").toLowerCase(); return value === "#aboutme" || value === "#about_me"; } function readTimeSetting(name) { var value = window .getComputedStyle(root) .getPropertyValue(name) .trim(); var number = parseFloat(value) || 0; return value.slice(-2) === "ms" ? number : number * 1000; } function loadLayer(image, url) { return new Promise(function (resolve) { function finish(ok) { image.removeEventListener("load", onLoad); image.removeEventListener("error", onError); if (!ok) image.style.display = "none"; resolve(ok); } function onLoad() { if (image.decode) { image.decode().catch(function () {}).then(function () { finish(true); }); } else { finish(true); } } function onError() { finish(false); } image.addEventListener("load", onLoad); image.addEventListener("error", onError); image.src = url; if (image.complete && image.naturalWidth) onLoad(); }); } function ensureImages() { if (!loadPromise) { loadPromise = Promise.all([ loadLayer(photo, PHOTO_URL), loadLayer(photoFlash, PHOTO_URL), loadLayer(arrow, ARROW_URL) ]); } return loadPromise; } function scrollToAnimation() { var attempts = 0; window.clearTimeout(scrollTimer); function tryScroll() { var isVisible = root.getClientRects().length > 0 && window.getComputedStyle(root).display !== "none"; if (isVisible) { root.scrollIntoView({ behavior: "smooth", block: "start" }); return; } attempts += 1; if (attempts < 24) { scrollTimer = window.setTimeout(tryScroll, 50); } } scrollTimer = window.setTimeout(tryScroll, 80); } function showFullText() { lines.forEach(function (line, index) { line.textContent = ABOUT_LINES[index] || ""; }); copy.classList.add("cw-about-typed"); more.classList.add("cw-about-more-visible"); } function clearText() { lines.forEach(function (line) { line.textContent = ""; }); copy.classList.remove("cw-about-typed"); more.classList.remove("cw-about-more-visible"); } function typeText(id) { var lineIndex = 0; var characterIndex = 0; var letterDelay = readTimeSetting("--cw-typing-letter-delay"); var lineDelay = readTimeSetting("--cw-typing-line-delay"); var afterTypingPause = readTimeSetting("--cw-after-typing-pause"); var betweenStages = readTimeSetting("--cw-between-stages-pause"); var typingStartDelay = readTimeSetting("--cw-photo-duration") + betweenStages + readTimeSetting("--cw-arrow-duration") + betweenStages + readTimeSetting("--cw-title-duration") + betweenStages; clearText(); function typeNext() { var characters; if (id !== playId) return; characters = Array.from(ABOUT_LINES[lineIndex]); lines[lineIndex].textContent += characters[characterIndex]; characterIndex += 1; if (characterIndex < characters.length) { typeTimer = window.setTimeout(typeNext, letterDelay); } else if (lineIndex < ABOUT_LINES.length - 1) { lineIndex += 1; characterIndex = 0; typeTimer = window.setTimeout(typeNext, lineDelay); } else { copy.classList.add("cw-about-typed"); typeTimer = window.setTimeout(function () { if (id === playId) { more.classList.add("cw-about-more-visible"); } }, afterTypingPause); } } typeTimer = window.setTimeout(typeNext, typingStartDelay); } function play() { playId += 1; var id = playId; window.clearTimeout(typeTimer); root.classList.remove("cw-about-playing"); clearText(); void root.offsetWidth; root.classList.add("cw-about-playing"); if (reduceMotion.matches) { showFullText(); } else { typeText(id); } } function activate(replay) { var wasActive = root.classList.contains("cw-about-active"); root.classList.add("cw-about-active"); scrollToAnimation(); if (!wasActive || replay) { ensureImages().then(play); } } function deactivate() { playId += 1; window.clearTimeout(typeTimer); window.clearTimeout(scrollTimer); root.classList.remove("cw-about-active", "cw-about-playing"); } document.addEventListener("click", function (event) { var link = event.target.closest ? event.target.closest("a[href]") : null; if (!link) return; try { if (isAboutHash(new URL(link.href, window.location.href).hash)) { activate(true); } } catch (error) {} }, true); window.addEventListener("hashchange", function () { if (isAboutHash(window.location.hash)) { activate(false); } else { deactivate(); } }); if (isAboutHash(window.location.hash)) { activate(false); } })();
(function () { var root = document.getElementById("how-animation"); if (!root) return; var HOW_LINES = [ "How? Like this, but it's actually 4 hour work!!!" ]; var lines = root.querySelectorAll(".cw-how-line"); var image = root.querySelector(".cw-how-image"); var reduceMotion = window.matchMedia("(prefers-reduced-motion: reduce)"); var imagePromise = null; var typingTimer = 0; var scrollTimer = 0; var playId = 0; var imageReady = false; var typingDone = false; function isHowHash(value) { value = String(value || "").toLowerCase(); return value === "#howimadethis2"; } function readTimeSetting(name) { var value = window .getComputedStyle(root) .getPropertyValue(name) .trim(); var number = parseFloat(value) || 0; return value.slice(-2) === "ms" ? number : number * 1000; } function clearTyping() { lines.forEach(function (line) { line.textContent = ""; }); typingDone = false; image.classList.remove("cw-how-image-loaded"); } function revealImageWhenReady() { if (imageReady && typingDone) { image.classList.add("cw-how-image-loaded"); } } function showFullText() { lines.forEach(function (line, index) { line.textContent = HOW_LINES[index] || ""; }); typingDone = true; revealImageWhenReady(); } function playTyping() { var id; var lineIndex = 0; var characterIndex = 0; var letterDelay = readTimeSetting("--cw-how-letter-delay"); var lineDelay = readTimeSetting("--cw-how-line-delay"); playId += 1; id = playId; window.clearTimeout(typingTimer); clearTyping(); if (reduceMotion.matches) { showFullText(); return; } function typeNext() { var characters; if (id !== playId) return; characters = Array.from(HOW_LINES[lineIndex]); lines[lineIndex].textContent += characters[characterIndex]; characterIndex += 1; if (characterIndex < characters.length) { typingTimer = window.setTimeout(typeNext, letterDelay); } else if (lineIndex < HOW_LINES.length - 1) { lineIndex += 1; characterIndex = 0; typingTimer = window.setTimeout(typeNext, lineDelay); } else { typingDone = true; revealImageWhenReady(); } } typingTimer = window.setTimeout(typeNext, 80); } function ensureImage() { var url; if (imagePromise) return imagePromise; url = image.getAttribute("data-src"); imagePromise = new Promise(function (resolve) { function finish(ok) { image.removeEventListener("load", onLoad); image.removeEventListener("error", onError); if (ok) { imageReady = true; revealImageWhenReady(); } else { image.style.display = "none"; } resolve(ok); } function onLoad() { if (image.decode) { image.decode().catch(function () {}).then(function () { finish(true); }); } else { finish(true); } } function onError() { finish(false); } image.addEventListener("load", onLoad); image.addEventListener("error", onError); image.src = url; if (image.complete && image.naturalWidth) onLoad(); }); return imagePromise; } function scrollToBlock() { var attempts = 0; window.clearTimeout(scrollTimer); function tryScroll() { var isVisible = root.getClientRects().length > 0 && window.getComputedStyle(root).display !== "none"; if (isVisible) { root.scrollIntoView({ behavior: "smooth", block: "start" }); return; } attempts += 1; if (attempts < 24) { scrollTimer = window.setTimeout(tryScroll, 50); } } scrollTimer = window.setTimeout(tryScroll, 80); } function activate(replay) { var wasActive = root.classList.contains("cw-how-active"); root.classList.add("cw-how-active"); scrollToBlock(); ensureImage(); if (!wasActive || replay) { playTyping(); } } function deactivate() { playId += 1; window.clearTimeout(typingTimer); window.clearTimeout(scrollTimer); root.classList.remove("cw-how-active"); } document.addEventListener("click", function (event) { var link = event.target.closest ? event.target.closest("a[href]") : null; if (!link) return; try { if (isHowHash(new URL(link.href, window.location.href).hash)) { activate(true); } } catch (error) {} }, true); window.addEventListener("hashchange", function () { if (isHowHash(window.location.hash)) { activate(false); } else { deactivate(); } }); if (isHowHash(window.location.hash)) { activate(false); } })();