SFW Gallery


IT’s me!

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); } })();

Six illustrated stages connected by hand-drawn arrows
(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); } })();
(function () { if (window.cwShockwaveInstalled) return; window.cwShockwaveInstalled = true; /* ================== НАСТРОЙКИ ================== */ var CFG = { targets: [ { sel: "img.cw-pony", wrap: true }, { sel: "a.cw-social-link", wrap: false }, { sel: "a.cw4-nav-button", wrap: false }, { sel: "div.cw4-info-pulse", wrap: false }, { sel: "a.about-button", wrap: false }, { sel: "a.return-button", wrap: false }, { sel: "#sfwworks-section .buttons-component a[role='button']", wrap: false } ], trigger: { zoneSel: ".site-main > .inner", interactiveSel: "a, button, [role='button'], [role='link'], .slideshow-component .nav", mediaSel: "video, audio, img, picture, svg, canvas, iframe, object, embed, figure, [role='img'], .cw-left-video, .slideshow-background > .visible, .slideshow-component .visible", misclickMediaSel: "img.cw-how-image", maxPressMs: 450 }, wave: { speed: 1.7, ring: true, color: "#FFFFFF", thickness: 3, startOpacity: 0.55, phoneBreakpoint: 736, phoneSlowdown: 2.2, phonePopSlowdown: 1.3 }, jump: { height: 16, duration: 460, rotate: 6, scale: 1.07 } }; /* ================================================ */ var reduced = false; var J = CFG.jump; var pressState = null; try { reduced = window.matchMedia("(prefers-reduced-motion: reduce)").matches; } catch (e) {} var st = document.createElement("style"); st.textContent = "@keyframes cwShockPop{" + "0%{translate:0 0;scale:1;rotate:0deg;}" + "22%{translate:0 -" + J.height + "px;scale:" + J.scale + ";rotate:var(--cwr1,0deg);}" + "48%{translate:0 " + Math.round(J.height * 0.22) + "px;scale:.96;rotate:var(--cwr2,0deg);}" + "72%{translate:0 -" + Math.round(J.height * 0.28) + "px;scale:1.02;rotate:var(--cwr3,0deg);}" + "100%{translate:0 0;scale:1;rotate:0deg;}}" + "@keyframes cwShockReduced{" + "0%,100%{opacity:1;filter:brightness(1);}" + "50%{opacity:.72;filter:brightness(1.35);}}" + "html body .cw-shock-pop{animation:cwShockPop var(--cw-shock-duration," + J.duration + "ms) cubic-bezier(.34,1.4,.5,1) both !important;" + "will-change:translate,scale,rotate;}" + "html body .cw-shock-reduced{animation:cwShockReduced 180ms ease-out both !important;" + "will-change:opacity,filter;}" + ".cw-shock-zone{position:relative !important;}" + ".cw-shock-clip{position:absolute;inset:0;overflow:hidden;pointer-events:none;z-index:2147481999;}" + ".cw-shock-ring{position:absolute;border-radius:50%;pointer-events:none;z-index:1;" + "box-sizing:border-box;border:" + CFG.wave.thickness + "px solid " + CFG.wave.color + ";" + "transform:translate(-50%,-50%) scale(0);will-change:transform,opacity;}"; (document.head || document.documentElement).appendChild(st); function closestMatch(el, selector) { while (el && el.nodeType === 1) { if (el.matches && el.matches(selector)) return el; el = el.parentElement; } return null; } function textHitAt(x, y, zone) { var position = null; var node = null; var offset = 0; var text = ""; var candidates = []; var range; var rect; var i; var index; try { if (document.caretPositionFromPoint) { position = document.caretPositionFromPoint(x, y); if (position) { node = position.offsetNode; offset = position.offset; } } else if (document.caretRangeFromPoint) { position = document.caretRangeFromPoint(x, y); if (position) { node = position.startContainer; offset = position.startOffset; } } } catch (e) { return false; } if (!node || node.nodeType !== 3) return false; if (!node.parentElement || !zone.contains(node.parentElement)) return false; text = node.nodeValue || ""; if (!text.trim()) return false; if (offset < text.length) candidates.push(offset); if (offset > 0) candidates.push(offset - 1); for (i = 0; i < candidates.length; i++) { index = candidates[i]; if (!text.charAt(index).trim()) continue; range = document.createRange(); range.setStart(node, index); range.setEnd(node, index + 1); rect = range.getBoundingClientRect(); if (x >= rect.left - 1 && x <= rect.right + 1 && y >= rect.top - 1 && y <= rect.bottom + 1) { return true; } } return false; } function wrapOf(el) { return closestMatch(el, "a.cw-fs-card") || el.parentElement || el; } function collect(options) { var out = []; var i; var j; var nodes; var target; for (i = 0; i < CFG.targets.length; i++) { try { nodes = document.querySelectorAll(CFG.targets[i].sel); for (j = 0; j < nodes.length; j++) { target = CFG.targets[i].wrap ? wrapOf(nodes[j]) : nodes[j]; if (out.indexOf(target) === -1) out.push(target); } } catch (e) {} } return out; } function phoneSlowdown() { try { if (window.matchMedia("(max-width: " + CFG.wave.phoneBreakpoint + "px)").matches) { return CFG.wave.phoneSlowdown; } } catch (e) {} return 1; } function popSlowdown() { return phoneSlowdown() > 1 ? CFG.wave.phonePopSlowdown : 1; } function animateTarget(el, slowdown) { var r = (Math.random() * 2 - 1) * J.rotate; var className = reduced ? "cw-shock-reduced" : "cw-shock-pop"; var duration = reduced ? 180 : J.duration * slowdown; el.style.setProperty("--cw-shock-duration", duration + "ms"); el.style.setProperty("--cwr1", r.toFixed(1) + "deg"); el.style.setProperty("--cwr2", (-r * 0.4).toFixed(1) + "deg"); el.style.setProperty("--cwr3", (r * 0.2).toFixed(1) + "deg"); el.classList.remove("cw-shock-pop"); el.classList.remove("cw-shock-reduced"); void el.offsetWidth; el.classList.add(className); window.setTimeout(function () { el.classList.remove(className); }, duration + 40); } function clipLayer(zone) { var clip = zone.querySelector(":scope > .cw-shock-clip"); if (clip) return clip; zone.classList.add("cw-shock-zone"); clip = document.createElement("div"); clip.className = "cw-shock-clip"; clip.setAttribute("aria-hidden", "true"); zone.appendChild(clip); return clip; } function drawRing(zone, ox, oy, maxD, slowdown) { if (!CFG.wave.ring) return; var clip = clipLayer(zone); var ring = document.createElement("div"); var rd = (maxD / CFG.wave.speed) * slowdown; ring.className = "cw-shock-ring"; ring.style.left = ox + "px"; ring.style.top = oy + "px"; ring.style.width = (maxD * 2) + "px"; ring.style.height = (maxD * 2) + "px"; ring.style.opacity = String(CFG.wave.startOpacity); clip.appendChild(ring); window.requestAnimationFrame(function () { window.requestAnimationFrame(function () { ring.style.transition = "transform " + rd + "ms linear, opacity " + rd + "ms ease-in"; ring.style.transform = "translate(-50%,-50%) scale(1)"; ring.style.opacity = "0"; }); }); window.setTimeout(function () { if (ring.parentNode) ring.parentNode.removeChild(ring); }, rd + 160); } function fire(ox, oy, options) { var settings = options || {}; var zone = settings.zone || document.querySelector(CFG.trigger.zoneSel); var zoneRect; var localX; var localY; var W; var H; var maxD; var targets; var slowdown; var popScale; var leftBound; var rightBound; var topBound; var bottomBound; var i; if (!zone) return; zoneRect = zone.getBoundingClientRect(); localX = ox - zoneRect.left; localY = oy - zoneRect.top; W = zone.clientWidth || zoneRect.width; H = zone.clientHeight || zoneRect.height; slowdown = phoneSlowdown(); popScale = popSlowdown(); if (slowdown > 1) { leftBound = Math.max(0, -zoneRect.left); rightBound = Math.min(W, window.innerWidth - zoneRect.left); topBound = Math.max(0, -zoneRect.top); bottomBound = Math.min(H, window.innerHeight - zoneRect.top); maxD = Math.max( Math.hypot(localX - leftBound, localY - topBound), Math.hypot(localX - rightBound, localY - topBound), Math.hypot(localX - leftBound, localY - bottomBound), Math.hypot(localX - rightBound, localY - bottomBound) ); } else { maxD = Math.max( Math.hypot(localX, localY), Math.hypot(W - localX, localY), Math.hypot(localX, H - localY), Math.hypot(W - localX, H - localY) ); } targets = collect(settings); drawRing(zone, localX, localY, maxD, slowdown); for (i = 0; i < targets.length; i++) { (function (el) { var rect = el.getBoundingClientRect(); var distance; if (!rect.width && !rect.height) return; if (slowdown > 1 && (rect.right < 0 || rect.left > window.innerWidth || rect.bottom < 0 || rect.top > window.innerHeight)) return; distance = Math.hypot( rect.left + rect.width / 2 - ox, rect.top + rect.height / 2 - oy ); window.setTimeout(function () { animateTarget(el, popScale); }, (distance / CFG.wave.speed) * slowdown); })(targets[i]); } } document.addEventListener("pointerdown", function (event) { var zone = closestMatch(event.target, CFG.trigger.zoneSel); pressState = null; if (!zone) return; if (typeof event.button === "number" && event.button !== 0) return; pressState = { zone: zone, time: Date.now() }; }, true); document.addEventListener("pointercancel", function () { pressState = null; }, true); document.addEventListener("click", function (event) { var zone = closestMatch(event.target, CFG.trigger.zoneSel); var interactive; var media; var misclickMedia; var press; var heldFor; var origin = event.target; var rect; var ox; var oy; if (!zone) return; press = pressState; pressState = null; if (!press || press.zone !== zone) return; interactive = closestMatch(event.target, CFG.trigger.interactiveSel); if (interactive && zone.contains(interactive)) return; media = closestMatch(event.target, CFG.trigger.mediaSel); misclickMedia = closestMatch(event.target, CFG.trigger.misclickMediaSel); if (media && zone.contains(media) && !misclickMedia) return; if (textHitAt(event.clientX, event.clientY, zone)) return; heldFor = Date.now() - press.time; if (heldFor > CFG.trigger.maxPressMs) return; ox = event.clientX; oy = event.clientY; if (!ox && !oy) { rect = origin.getBoundingClientRect(); ox = rect.left + rect.width / 2; oy = rect.top + rect.height / 2; } fire(ox, oy, { zone: zone }); }, true); window.cwShock = { fire: fire, collect: collect, cfg: CFG, reduced: reduced }; })();
(function () { if (window.cwCursorInstalled) return; window.cwCursorInstalled = true; var base = 'https://images.cloudwings.art/'; var files = [ 'cw-cursor-default-32-v2.png', 'cw-cursor-button-32-v1.png', 'cw-cursor-help-32-v1.png', 'cw-cursor-text-32-v2.png' ]; window.cwCursorImages = files.map(function (file) { var image = new Image(); image.decoding = 'async'; image.src = base + file; return image; }); var style = document.createElement('style'); style.id = 'cw-custom-cursor'; style.textContent = '@media (hover:hover) and (pointer:fine){' + ':root{' + '--cw-cur-default:url("' + base + files[0] + '") 4 1,auto;' + '--cw-cur-button:url("' + base + files[1] + '") 13 1,pointer;' + '--cw-cur-help:url("' + base + files[2] + '") 10 7,help;' + '--cw-cur-text:url("' + base + files[3] + '") 19 1,text' + '}' + 'html,body{cursor:var(--cw-cur-default)}' + 'html.cw-cursor-text-hit,html.cw-cursor-text-hit body,' + 'html.cw-cursor-text-hit body *{cursor:var(--cw-cur-text)!important}' + 'a,button,[role="button"],[role="link"],input[type="button"],' + 'input[type="submit"],input[type="reset"],select,summary,label[for]{' + 'cursor:var(--cw-cur-button)}' + 'a *,button *,[role="button"] *,[role="link"] *{' + 'cursor:var(--cw-cur-button)!important}' + '.cw4-nav-button,.cw4-nav-button *,' + '.cw4-info-pulse,.cw4-info-pulse *{' + 'cursor:var(--cw-cur-button)!important}' + '.slideshow-component .nav,.slideshow-component .nav::before,' + 'div.nav.next,div.nav.next::before,div.nav.previous,div.nav.previous::before,' + 'a.return-button,a.return-button *,a.about-button,a.about-button *{' + 'cursor:var(--cw-cur-button)!important}' + '#utc-anchor,#utc-anchor *{cursor:var(--cw-cur-help)!important}' + '}'; document.head.appendChild(style); var root = document.documentElement; var interactive = 'a,button,[role="button"],[role="link"],select,summary,label[for],' + 'input,textarea,[contenteditable="true"],#utc-anchor'; function textHitAt(x, y) { var position = null; var node = null; var offset = 0; var text = ''; var candidates = []; try { if (document.caretPositionFromPoint) { position = document.caretPositionFromPoint(x, y); if (position) { node = position.offsetNode; offset = position.offset; } } else if (document.caretRangeFromPoint) { position = document.caretRangeFromPoint(x, y); if (position) { node = position.startContainer; offset = position.startOffset; } } } catch (error) { return false; } if (!node || node.nodeType !== 3 || !node.parentElement) return false; if (node.parentElement.closest(interactive)) return false; text = node.nodeValue || ''; if (text.length > offset) candidates.push(offset); if (offset > 0) candidates.push(offset - 1); return candidates.some(function (index) { var range; var rect; if (!text.charAt(index).trim()) return false; range = document.createRange(); range.setStart(node, index); range.setEnd(node, index + 1); rect = range.getBoundingClientRect(); return x >= rect.left - 1 && rect.right + 1 >= x && y >= rect.top - 1 && rect.bottom + 1 >= y; }); } function updateTextCursor(event) { var target = event.target; if (target && target.closest && target.closest(interactive)) { root.classList.remove('cw-cursor-text-hit'); return; } root.classList.toggle( 'cw-cursor-text-hit', textHitAt(event.clientX, event.clientY) ); } document.addEventListener('pointermove', updateTextCursor, true); document.addEventListener('pointerleave', function () { root.classList.remove('cw-cursor-text-hit'); }, true); })();