♡ ♡
https://magicalgirl.net
(・ω・)ノ
header banner
About me
Show meDesigns
My favourite songs
type down ur fav songs here : )
title — artist
title — artist
title — artist
(ノ◕ヮ◕)ノ*:・゚✧
✿ / my quote (or any kind of text) text text text...
| crd made by Iyanna :3
✚ ✚ ✚ Internet settings (・∀・)
(function () { const loader = document.getElementById('kawaii-loader'); const disclaimer = document.getElementById('kawaii-disclaimer'); const continueBtn = document.getElementById('disclaimer-continue'); if (!loader) return; document.documentElement.classList.add('kawaii-is-loading'); let p = 0; let done = false; const tick = () => { p += Math.random() * 4 + 1; p = Math.min(p, 96); loader.style.setProperty('--p', p.toFixed(0) + '%'); if (!done) requestAnimationFrame(tick); }; requestAnimationFrame(tick); const showDisclaimer = () => { if (!disclaimer) return; document.documentElement.classList.add('kawaii-disclaimer-on'); disclaimer.classList.add('show'); disclaimer.setAttribute('aria-hidden', 'false'); }; const hideDisclaimer = () => { if (!disclaimer) return; disclaimer.classList.remove('show'); disclaimer.setAttribute('aria-hidden', 'true'); setTimeout(() => { disclaimer.remove(); document.documentElement.classList.remove('kawaii-disclaimer-on'); }, 600); }; if (continueBtn) { continueBtn.addEventListener('click', hideDisclaimer); } window.addEventListener('load', () => { done = true; const finish = () => { if (p < 100) { p += 1; loader.style.setProperty('--p', p + '%'); requestAnimationFrame(finish); } else { setTimeout(() => { showDisclaimer(); loader.classList.add('hide'); document.documentElement.classList.remove('kawaii-is-loading'); setTimeout(() => loader.remove(), 700); }, 800); } }; finish(); }); })(); (function(){ /* ===== PLAYLIST ===== */ const songs = [ { title: "Hoover", artist: "Yung Lean", cover: "https://image2url.com/r2/default/images/1770725135074-b775f364-c9ad-4b75-bfe4-b046f67cae07.png", audio: "https://example.com/song.mp3", tooltip: "song ♡ artist" } ]; /* ===== SETTINGS ===== */ let current = 0; let isPlaying = false; let fadeTimer = null; const FADE_TIME = 600; const FADE_STEPS = 20; /* ===== MARQUEE TEXT ===== */ function setMarquee(el, text, tooltip){ if (!el) return; let track = el.querySelector(".marquee-track"); if (!track){ track = document.createElement("div"); track.className = "marquee-track"; el.innerHTML = ""; el.appendChild(track); } track.innerHTML = `${text}${text}`; if (tooltip) el.title = tooltip; } /* ===== FADE AUDIO ===== */ function fade(audio, from, to, done){ if (!audio) return; clearInterval(fadeTimer); let step = 0; const time = FADE_TIME / FADE_STEPS; fadeTimer = setInterval(() => { step++; const v = from + (to - from) * (step / FADE_STEPS); audio.volume = Math.max(0, Math.min(1, v)); if (step >= FADE_STEPS){ clearInterval(fadeTimer); audio.volume = to; done && done(); } }, time); } /* ===== INIT ===== */ function init(){ const ipod = document.querySelector(".ipod"); if (!ipod) return; // prevent duplicate listeners if init runs multiple times if (ipod.dataset.ipodInit === "1") return; ipod.dataset.ipodInit = "1"; const audio = ipod.querySelector("#ipodAudio"); const playBtn = ipod.querySelector("#ipodPlayPause"); const wheel = ipod.querySelector(".wheel"); const nextBtn = wheel ? wheel.querySelector(".right") : null; const prevBtn = wheel ? wheel.querySelector(".left") : null; const artEl = ipod.querySelector(".album-art"); const titleEl = ipod.querySelector(".song-name"); const artistEl= ipod.querySelector(".artist"); if (!audio || !playBtn || !wheel || !artEl || !titleEl || !artistEl) return; if (!Array.isArray(songs) || songs.length === 0) return; audio.preload = "none"; audio.volume = 1; function loadSong(i){ const s = songs[i]; if (!s) return; artEl.style.backgroundImage = `url("${s.cover}")`; setMarquee(titleEl, s.title || "", s.tooltip || ""); setMarquee(artistEl, s.artist || ""); audio.src = s.audio; audio.load(); } function setPlayIcon(paused){ // only toggle if Font Awesome classes exist if (paused){ playBtn.classList.remove("fa-pause"); playBtn.classList.add("fa-play"); } else { playBtn.classList.remove("fa-play"); playBtn.classList.add("fa-pause"); } } function play(){ audio.play().then(() => { isPlaying = true; setPlayIcon(false); fade(audio, 0, 1); }).catch(() => { isPlaying = false; setPlayIcon(true); }); } function pause(){ fade(audio, audio.volume, 0, () => { audio.pause(); isPlaying = false; setPlayIcon(true); }); } playBtn.addEventListener("click", (e) => { e.stopPropagation(); isPlaying ? pause() : play(); }); if (nextBtn){ nextBtn.addEventListener("click", (e) => { e.stopPropagation(); current = (current + 1) % songs.length; loadSong(current); play(); }); } if (prevBtn){ prevBtn.addEventListener("click", (e) => { e.stopPropagation(); current = (current - 1 + songs.length) % songs.length; loadSong(current); play(); }); } audio.addEventListener("ended", () => { current = (current + 1) % songs.length; loadSong(current); play(); }); // start state setPlayIcon(true); loadSong(current); } /* Carrd-safe init */ init(); window.addEventListener("load", init); setTimeout(init, 250); setTimeout(init, 900); })(); (function(){ function clamp(n, min, max){ return Math.max(min, Math.min(max, n)); } function makeFakeScrollbar(scroller){ if (!scroller || scroller.dataset.fakeScroll === "1") return; scroller.dataset.fakeScroll = "1"; // Create track + thumb const bar = document.createElement("div"); bar.className = "fake-scrollbar"; const thumb = document.createElement("div"); thumb.className = "fake-thumb"; bar.appendChild(thumb); scroller.appendChild(bar); function sync(){ const viewH = scroller.clientHeight; const scrollH = scroller.scrollHeight; const barH = bar.clientHeight; // Always show it (even if not overflow) — keep it cute and present // If you ONLY want it when overflow exists, uncomment next 2 lines: // if (scrollH <= viewH + 1){ bar.style.display = "none"; return; } // bar.style.display = "block"; const thumbH = clamp((viewH / scrollH) * barH, 22, barH); thumb.style.height = thumbH + "px"; const maxTop = barH - thumbH; const ratio = (scrollH <= viewH) ? 0 : (scroller.scrollTop / (scrollH - viewH)); thumb.style.top = (ratio * maxTop) + "px"; } // Scroll -> thumb scroller.addEventListener("scroll", sync, { passive: true }); window.addEventListener("resize", sync); // Drag thumb -> scroll let dragging = false; let startY = 0; let startTop = 0; thumb.addEventListener("mousedown", (e) => { dragging = true; startY = e.clientY; startTop = parseFloat(getComputedStyle(thumb).top) || 0; e.preventDefault(); }); document.addEventListener("mousemove", (e) => { if (!dragging) return; const barH = bar.clientHeight; const thumbH = thumb.clientHeight; const maxTop = barH - thumbH; const dy = e.clientY - startY; const newTop = clamp(startTop + dy, 0, maxTop); thumb.style.top = newTop + "px"; const viewH = scroller.clientHeight; const scrollH = scroller.scrollHeight; const ratio = (maxTop <= 0) ? 0 : (newTop / maxTop); scroller.scrollTop = ratio * (scrollH - viewH); }); document.addEventListener("mouseup", () => { dragging = false; }); // Click track to jump bar.addEventListener("mousedown", (e) => { if (e.target === thumb) return; const rect = bar.getBoundingClientRect(); const clickY = e.clientY - rect.top; const barH = bar.clientHeight; const thumbH = thumb.clientHeight; const maxTop = barH - thumbH; const newTop = clamp(clickY - thumbH / 2, 0, maxTop); const viewH = scroller.clientHeight; const scrollH = scroller.scrollHeight; const ratio = (maxTop <= 0) ? 0 : (newTop / maxTop); scroller.scrollTop = ratio * (scrollH - viewH); }); // Initial sync (Carrd sometimes needs a tiny delay) setTimeout(sync, 50); setTimeout(sync, 300); setTimeout(sync, 900); } // Apply to ANYTHING you mark with .fake-scroll function init(){ document.querySelectorAll(".fake-scroll").forEach(makeFakeScrollbar); } init(); window.addEventListener("load", init); setTimeout(init, 250); setTimeout(init, 900); })();
この順番の方法
いりぐち♥
わたしの小さな世界へ★
text text text text tex
text text text text tex
text text text text
text text text text
text text text text
text text text text
text text text text
text text text text
text text text text
text text text text
text text text text
text text text text
あそびばカ♥
ゆっくりしていってね★
ふわ系 ♥
text text text
text text text
text text text
text text text
煌めく ♥
text text text
text text text
text text text
text text text
ゆめ系 ♥
text text text
text text text
text text text
text text text
美白テクニック 5
特集
体の中と外からダブルケアで透け肌へ
1 BEAUTY ITEMS 2 DAILY CARE 3 MAKEUP NOTES
フタの努力
フタ芸大公開
方法まとめ
STYLE CHECK / K-POP LOOK / LENS & SKINCARE
3
2
1
特集
発見! スキンケア
(function () { const bar = document.getElementById('kawaii-scrollbar'); if (!bar) return; const thumb = bar.querySelector('.kawaii-scroll-thumb'); const root = document.documentElement; let drag = null; function clamp(n, min, max){ return Math.max(min, Math.min(max, n)); } function getMetrics(){ const pageMax = Math.max(0, root.scrollHeight - window.innerHeight); const trackH = bar.clientHeight; const ratio = root.scrollHeight > 0 ? window.innerHeight / root.scrollHeight : 1; const thumbH = clamp(Math.round(trackH * ratio), 56, Math.round(trackH * 0.55)); const travel = Math.max(0, trackH - thumbH); return { pageMax, trackH, thumbH, travel }; } function setThumbFromScroll(){ const m = getMetrics(); thumb.style.height = m.thumbH + 'px'; const y = m.pageMax > 0 ? (window.scrollY / m.pageMax) * m.travel : 0; thumb.style.transform = `translateY(${y}px)`; } function setScrollFromThumbY(y){ const m = getMetrics(); const yy = clamp(y, 0, m.travel); const ratio = m.travel > 0 ? yy / m.travel : 0; window.scrollTo({ top: ratio * m.pageMax, behavior: 'auto' }); } thumb.addEventListener('pointerdown', (e) => { const currentY = parseFloat((thumb.style.transform.match(/-?\d+(\.\d+)?/) || [0])[0]) || 0; drag = { startClientY: e.clientY, startY: currentY }; thumb.setPointerCapture(e.pointerId); e.preventDefault(); }); thumb.addEventListener('pointermove', (e) => { if (!drag) return; const dy = e.clientY - drag.startClientY; setScrollFromThumbY(drag.startY + dy); }); thumb.addEventListener('pointerup', () => { drag = null; }); thumb.addEventListener('pointercancel', () => { drag = null; }); bar.addEventListener('pointerdown', (e) => { if (e.target === thumb) return; const rect = bar.getBoundingClientRect(); const m = getMetrics(); const targetY = (e.clientY - rect.top) - (m.thumbH / 2); setScrollFromThumbY(targetY); }); window.addEventListener('scroll', setThumbFromScroll, { passive: true }); window.addEventListener('resize', setThumbFromScroll); window.addEventListener('load', setThumbFromScroll); setTimeout(setThumbFromScroll, 250); setTimeout(setThumbFromScroll, 1000); })();