Skip to content

Aleostube/Aleos-Tube.github.io

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

10 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Aleos-Tube.github.io โ€” Struktur Repo Lengkap (Rapi & Futuristik)

Dokumen ini berisi struktur folder dan isi file yang siap kamu copy-paste ke repo Aleos-Tube.github.io. Saya susun agar modern (Vite + React), tailwind-ready, dan mudah deploy ke GitHub Pages. Kamu akan menemukan file kunci berikut: konfigurasi, komponen, layout futuristik, contoh halaman, stylesheet, workflow GitHub Actions, dan README.


Struktur direktori (ringkasan)

Aleos-Tube.github.io/
โ”œโ”€ .github/
โ”‚  โ””โ”€ workflows/
โ”‚     โ””โ”€ deploy.yml
โ”œโ”€ public/
โ”‚  โ”œโ”€ favicon.ico
โ”‚  โ””โ”€ assets/
โ”‚     โ””โ”€ placeholder.jpg
โ”œโ”€ src/
โ”‚  โ”œโ”€ components/
โ”‚  โ”‚  โ”œโ”€ AnimatedPostCard.jsx
โ”‚  โ”‚  โ”œโ”€ TranslateButton.jsx
โ”‚  โ”‚  โ”œโ”€ Analyser.jsx
โ”‚  โ”‚  โ””โ”€ NavBar.jsx
โ”‚  โ”œโ”€ layouts/
โ”‚  โ”‚  โ””โ”€ FuturisticBlogLayout.jsx
โ”‚  โ”œโ”€ pages/
โ”‚  โ”‚  โ”œโ”€ Home.jsx
โ”‚  โ”‚  โ””โ”€ Post.jsx
โ”‚  โ”œโ”€ App.jsx
โ”‚  โ”œโ”€ main.jsx
โ”‚  โ””โ”€ index.css
โ”œโ”€ .gitignore
โ”œโ”€ README.md
โ”œโ”€ package.json
โ”œโ”€ tailwind.config.cjs
โ”œโ”€ postcss.config.cjs
โ””โ”€ vite.config.js

File kunci โ€” isi (salin ke file masing-masing)

Catatan: jangan jalankan paste seluruh folder ke repo tanpa membaca komentar kecil di tiap file.


1) package.json

{
  "name": "aleos-tube",
  "version": "1.0.0",
  "private": true,
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview",
    "deploy": "gh-pages -d dist"
  },
  "dependencies": {
    "react": "^18.2.0",
    "react-dom": "^18.2.0"
  },
  "devDependencies": {
    "vite": "^5.0.0",
    "tailwindcss": "^3.4.0",
    "postcss": "^8.4.0",
    "autoprefixer": "^10.4.0",
    "gh-pages": "^5.0.0"
  }
}

2) vite.config.js

import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'

export default defineConfig({
  plugins: [react()],
  base: process.env.GITHUB_PAGES ? '/Aleos-Tube.github.io/' : '/'
})

3) tailwind.config.cjs

module.exports = {
  content: ["./index.html","./src/**/*.{js,jsx,ts,tsx}"],
  theme: {
    extend: {
      colors: {
        neon: '#7cf9ff',
        night: '#0b1020',
        chrome: '#c7d2fe'
      }
    }
  },
  plugins: []
}

4) postcss.config.cjs

module.exports = {
  plugins: {
    tailwindcss: {},
    autoprefixer: {}
  }
}

5) .github/workflows/deploy.yml

name: Deploy to GitHub Pages

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Use Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
      - run: npm ci
      - run: npm run build
      - run: npx gh-pages -d dist
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

6) public/assets/placeholder.jpg

Letakkan file gambar placeholder (atau gunakan image dari Unsplash) dengan nama placeholder.jpg.


7) index.html (root โ€” Vite template)

<!doctype html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Toko Tabung Aleo โ€“ Blog Futuristik</title>
  </head>
  <body>
    <div id="root"></div>
    <script type="module" src="/src/main.jsx"></script>
  </body>
</html>

8) src/main.jsx

import React from 'react'
import { createRoot } from 'react-dom/client'
import App from './App'
import './index.css'

createRoot(document.getElementById('root')).render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
)

9) src/index.css

@tailwind base;
@tailwind components;
@tailwind utilities;

html, body, #root { height: 100%; }
body { @apply bg-night text-chrome; }

10) src/App.jsx

import React from 'react'
import FuturisticBlogLayout from './layouts/FuturisticBlogLayout'
import Home from './pages/Home'

export default function App(){
  return (
    <FuturisticBlogLayout>
      <Home />
    </FuturisticBlogLayout>
  )
}

11) src/layouts/FuturisticBlogLayout.jsx

import React from 'react'
import NavBar from '../components/NavBar'

export default function FuturisticBlogLayout({children}){
  return (
    <div className="min-h-screen p-6 bg-gradient-to-b from-black via-[#071129] to-[#071a2b]">
      <NavBar />
      <main className="max-w-5xl mx-auto mt-8">{children}</main>
      <footer className="mt-12 text-center text-sm opacity-70">ยฉ Aleo โ€” Toko Tabung Aleo</footer>
    </div>
  )
}

12) src/components/NavBar.jsx

import React from 'react'

export default function NavBar(){
  return (
    <nav className="flex items-center justify-between max-w-5xl mx-auto">
      <h1 className="text-2xl font-bold text-neon">Aleo's Tube</h1>
      <div className="space-x-4">
        <a href="#" className="text-sm">Home</a>
        <a href="#" className="text-sm">About</a>
        <a href="#" className="text-sm">Contact</a>
      </div>
    </nav>
  )
}

13) src/components/AnimatedPostCard.jsx

import React from 'react'

export default function AnimatedPostCard({title, excerpt, img}){
  return (
    <article className="group relative overflow-hidden rounded-2xl shadow-2xl p-4 bg-gradient-to-r from-[#001022] via-[#04162b] to-[#071a2b] hover:scale-101 transition-transform">
      <img src={img || '/public/assets/placeholder.jpg'} alt="cover" className="w-full h-48 object-cover rounded-lg" />
      <h3 className="mt-4 text-xl font-semibold text-neon">{title}</h3>
      <p className="mt-2 text-sm opacity-80">{excerpt}</p>
    </article>
  )
}

14) src/components/TranslateButton.jsx

import React from 'react'

export default function TranslateButton({onTranslate}){
  return (
    <button onClick={onTranslate} className="px-3 py-1 rounded-md border border-neon text-sm">
      Translate
    </button>
  )
}

15) src/components/Analyser.jsx

import React from 'react'

export default function Analyser({text}){
  return (
    <div className="p-4 rounded-lg border mt-4">
      <strong>Analisis singkat</strong>
      <p className="mt-2 text-sm opacity-80">Kata: {text ? text.split(' ').length : 0}</p>
    </div>
  )
}

16) src/pages/Home.jsx

import React from 'react'
import AnimatedPostCard from '../components/AnimatedPostCard'

export default function Home(){
  const posts = [
    {title: 'Mimpi Tabung Futuristik', excerpt: 'Sketch ide tentang masa depan material tabung.', img: '/assets/placeholder.jpg'},
    {title: 'Kreasi Aleo', excerpt: 'Catatan harian kreator serabutan.'}
  ]

  return (
    <section className="grid grid-cols-1 md:grid-cols-2 gap-6">
      {posts.map((p,i)=> <AnimatedPostCard key={i} {...p} />)}
    </section>
  )
}

17) README.md

# Toko Tabung Aleo โ€” Blog Adaptif Futuristik

Repo ini adalah basis Vite + React + Tailwind untuk blog Aleo. Build dengan perintah:

```bash
npm install
npm run dev

Untuk deploy ke GitHub Pages:

npm run build
npm run deploy

Sesuaikan base pada vite.config.js jika nama repo berbeda.


---

### 18) `.gitignore`

node_modules dist .env


---

## Langkah cepat setelah paste:
1. `npm install`
2. `npm run dev` โ€” buka localhost
3. Buat branch `main` lalu push ke GitHub
4. Action `Deploy to GitHub Pages` akan otomatis berjalan bila sudah ada `main`

---

## Inovasi & ide tambahan (opsional)
- Tambahkan CMS ringan (contentful/markdown) untuk menambah posting tanpa rebuild.
- Integrasi search client-side (lunr.js) untuk pengalaman pembaca.
- Scripting untuk generate OG images otomatis.

---

Kalau kamu mau, aku bisa:  
- Generate file ZIP dari struktur ini (siap download), atau  
- Buat commit siap-push (isi .patch) yang bisa kamu apply di repo, atau  
- Langsung tulis setiap file ke branch `main` (jika kamu beri akses token) โ€” pilih salah satu.



Aleoโ€™s Tube Store โ€“ Futuristic Adaptive Blog

Sistem blog futuristik dengan:

  • Auto Adaptive Layout
  • Auto Translate (15 bahasa + Tetun Timor Leste)
  • AI-like Web Worker Summarizer
  • Grid responsif
  • Support konten biasa, affiliasi, & cerita dewasa Powered by Aleo + Futuristic Engine ๐Ÿš€ import React, { useEffect, useMemo, useState } from "react"; // Futuristic Auto-Adaptive Blog Layout Component // Single-file React component (default export) using Tailwind CSS // Features: // - Responsive, auto-adaptive grid (masonry on wide, single column on mobile) // - Smart ordering: prioritizes featured / affiliate / trending posts // - Age-gate for adult stories (simple confirm + DOB fallback) // - Affiliate cards with disclosure and CTA // - Lazy loading, IntersectionObserver for images // - Accessible keyboard interactions // - Small, modular helpers inside the file for demo purposes

// NOTE: This file is a starting point. Integrate with your app's router, state // management, and analytics as needed.

// --- Mock data types --- const MOCK_POSTS = [ { id: "p1", type: "post", title: "10 Futuristic UI Patterns You Need", excerpt: "Design patterns that will define 2030+ interfaces.", featured: true, affiliate: false, adult: false, image: "https://picsum.photos/600/400?random=1", score: 92, }, { id: "a1", type: "affiliate", title: "Aleo's Tube Store โ€” Pro Camera Kit", excerpt: "Best kit for creators on a budget.", affiliate: true, featured: false, adult: false, image: "https://picsum.photos/600/800?random=2", score: 86, }, { id: "s1", type: "story", title: "Midnight Confessions (Adult)", excerpt: "A mature short story exploring intimacy and regret.", featured: false, affiliate: false, adult: true, image: "https://picsum.photos/600/700?random=3", score: 75, }, // ...more items ];

// --- Utilities --- function clamp(val, a, b) { return Math.max(a, Math.min(b, val)); }

function useViewport() { const [vw, setVw] = useState(typeof window !== "undefined" ? window.innerWidth : 1200); useEffect(() => { const onResize = () => setVw(window.innerWidth); window.addEventListener("resize", onResize); return () => window.removeEventListener("resize", onResize); }, []); return vw; }

// Age gate helper: persistent via localStorage const AGE_KEY = "_age_confirmed_v1"; function checkAgeConfirmed() { try { return localStorage.getItem(AGE_KEY) === "1"; } catch (e) { return false; } } function setAgeConfirmed() { try { localStorage.setItem(AGE_KEY, "1"); } catch (e) {} }

// Image lazy hook function useLazyLoadImage(imgRef) { useEffect(() => { if (!imgRef.current) return; const el = imgRef.current; if ('loading' in HTMLImageElement.prototype) { // browser native lazy loading works el.loading = 'lazy'; return; } const io = new IntersectionObserver((entries) => { entries.forEach((entry) => { if (entry.isIntersecting) { el.src = el.dataset.src; io.unobserve(el); } }); }); io.observe(el); return () => io.disconnect(); }, [imgRef]); }

// Smart ordering algorithm โ€” simple weighted score using metadata + viewport function smartOrder(items, viewportWidth) { // weights: featured > affiliate > score > recency (not in mock) const wFeatured = viewportWidth > 900 ? 3 : 2; const wAffiliate = 1.6; const wAdult = 0.6; // deprioritize adult content slightly on mixed feeds

return [...items].sort((a, b) => { const sa = (a.featured ? wFeatured : 0) + (a.affiliate ? wAffiliate : 0) + (a.score || 0) * 0.01 + (a.adult ? -wAdult : 0); const sb = (b.featured ? wFeatured : 0) + (b.affiliate ? wAffiliate : 0) + (b.score || 0) * 0.01 + (b.adult ? -wAdult : 0); return sb - sa; }); }

// --- UI components --- function AgeGateModal({ onConfirm, onCancel }) { const [dob, setDob] = useState(""); const [error, setError] = useState("");

function submit() { if (!dob) return setError("Masukkan tanggal lahir atau konfirmasi umur."); const d = new Date(dob); if (isNaN(d.getTime())) return setError("Tanggal tidak valid."); const age = (Date.now() - d.getTime()) / (1000 * 60 * 60 * 24 * 365.25); if (age >= 18) { setAgeConfirmed(); onConfirm(); } else { setError("Anda harus berusia 18+ untuk melihat konten ini."); } }

return (

Konten Dewasa

Konfirmasi bahwa Anda berusia 18 tahun atau lebih untuk melanjutkan.

Tanggal lahir <input type="date" value={dob} onChange={(e) => setDob(e.target.value)} className="mt-1 w-full rounded-md border p-2" />
{error &&

{error}

}
Batal Konfirmasi
); }

function PostCard({ item, onOpen }) { const imgRef = React.useRef(null); useLazyLoadImage(imgRef);

return ( <article className={rounded-2xl overflow-hidden shadow-lg bg-white dark:bg-gray-800} tabIndex={0} aria-labelledby={title-${item.id}}> <div className={relative ${item.featured ? "h-56 md:h-64" : "h-48"}}> {item.title} {item.affiliate && ( Affiliate )} {item.adult && ( 18+ )}

<h4 id={title-${item.id}} className="font-semibold text-lg">{item.title}

{item.excerpt}

Score: {item.score}
{item.affiliate ? ( <a href="#" onClick={(e) => { e.preventDefault(); onOpen(item); }} className="px-3 py-1 rounded-md border text-sm">Lihat Penawaran ) : ( <button onClick={() => onOpen(item)} className="px-3 py-1 rounded-md border text-sm">Baca )}
); }

// Sidebar / sticky affiliate area for desktop function Sidebar({ affiliates }) { return (

{affiliates.map((a) => (
{a.title}

{a.excerpt}

Affiliate Disclosure
))}
); }

// Main exported component export default function FuturisticAutoAdaptiveLayout({ posts = MOCK_POSTS }) { const vw = useViewport(); const [showAgeGate, setShowAgeGate] = useState(false); const [agePendingItem, setAgePendingItem] = useState(null); const [modalOpenItem, setModalOpenItem] = useState(null);

const confirmed = useMemo(() => checkAgeConfirmed(), [showAgeGate]);

useEffect(() => { if (agePendingItem && !confirmed) { setShowAgeGate(true); } }, [agePendingItem, confirmed]);

const ordered = useMemo(() => smartOrder(posts, vw), [posts, vw]);

// split out affiliates for sidebar const affiliates = ordered.filter((p) => p.affiliate).slice(0, 3);

function handleOpen(item) { if (item.adult && !checkAgeConfirmed()) { setAgePendingItem(item); setShowAgeGate(true); return; } setModalOpenItem(item); }

function confirmAge() { setAgeConfirmed(); setShowAgeGate(false); if (agePendingItem) { setModalOpenItem(agePendingItem); setAgePendingItem(null); } }

function cancelAge() { setShowAgeGate(false); setAgePendingItem(null); }

// choose layout: masonry for wide, grid for medium, single column for small const layout = vw > 1200 ? "masonry" : vw > 700 ? "grid" : "single";

return (

Aleo's Futuristic Blog

Mode: {layout}

    <div className="lg:flex lg:gap-6">
      <main className="flex-1">
        {/* Controls */}
        <div className="mb-4 flex items-center gap-3">
          <input placeholder="Cari..." className="flex-1 rounded-full border px-4 py-2" />
          <select className="rounded-md border px-3 py-2">
            <option>Terbaru</option>
            <option>Terpopuler</option>
            <option>Affiliate</option>
          </select>
        </div>

        {/* Feed */}
        {layout === "single" && (
          <div className="space-y-6">
            {ordered.map((it) => (
              <PostCard key={it.id} item={it} onOpen={handleOpen} />
            ))}
          </div>
        )}

        {layout === "grid" && (
          <div className="grid grid-cols-1 md:grid-cols-2 gap-6">
            {ordered.map((it) => (
              <PostCard key={it.id} item={it} onOpen={handleOpen} />
            ))}
          </div>
        )}

        {layout === "masonry" && (
          // CSS-only masonry using column-count plus break-inside to avoid JS libs
          <div style={{ columnCount: 3, columnGap: 24 }}>
            {ordered.map((it) => (
              <div key={it.id} style={{ breakInside: "avoid", marginBottom: 24 }}>
                <PostCard item={it} onOpen={handleOpen} />
              </div>
            ))}
          </div>
        )}
      </main>

      <Sidebar affiliates={affiliates} />
    </div>

    {/* Simple modal for opened item */}
    {modalOpenItem && (
      <div className="fixed inset-0 z-40 flex items-center justify-center p-4">
        <div className="absolute inset-0 bg-black/50" onClick={() => setModalOpenItem(null)} />
        <div className="relative max-w-3xl w-full rounded-2xl bg-white dark:bg-gray-900 p-6">
          <h2 className="text-xl font-semibold">{modalOpenItem.title}</h2>
          <p className="mt-3 text-sm text-gray-600">{modalOpenItem.excerpt}</p>
          <div className="mt-4 flex justify-end">
            <button onClick={() => setModalOpenItem(null)} className="px-3 py-2 rounded-md border">Tutup</button>
          </div>
        </div>
      </div>
    )}

    {showAgeGate && <AgeGateModal onConfirm={confirmAge} onCancel={cancelAge} />}
  </div>
</div>

); }

/* -------------------------------------------------------------------------- EXTENSIONS ADDED (user choice: 1,2,3,4)

    1. CMS integration examples (Strapi + WordPress REST)
    1. Improved priority algorithm with signal fusion + lightweight ML hook
    1. Neon / sci-fi styling options + Framer Motion animation snippets
    1. Monetization: rotating affiliate banners + simple A/B testing flow

These additions are provided as append-only helper snippets and pseudocode you can drop into the component above or refactor into separate modules.
----------------------------------------------------------------------------*/

// --------------------------- 1) CMS Integration --------------------------- // Strapi (REST) โ€” fetch posts example (async, server-side or client-side) // Replace STRAPI_URL with your CMS endpoint and secure with an API key if needed. // Usage: call fetchStrapiPosts() during getServerSideProps / useEffect. async function fetchStrapiPosts({ limit = 50, preview = false } = {}) { const STRAPI_URL = process.env.NEXT_PUBLIC_STRAPI_URL || "https://cms.example.com"; const token = process.env.NEXT_PUBLIC_STRAPI_TOKEN || null; // use server-side env for security const url = ${STRAPI_URL}/api/posts?pagination[limit]=${limit}&populate=*&sort=publishedAt:desc; const headers = token ? { Authorization: Bearer ${token} } : {}; const res = await fetch(url, { headers }); if (!res.ok) throw new Error("Failed fetching Strapi posts"); const json = await res.json(); // map to local shape used by component return json.data.map((d) => ({ id: strapi-${d.id}, title: d.attributes.title, excerpt: d.attributes.excerpt || d.attributes.summary || "", image: (d.attributes.cover && d.attributes.cover.data && d.attributes.cover.data.attributes.url) || "", featured: !!d.attributes.featured, affiliate: !!d.attributes.affiliate, adult: !!d.attributes.adult, score: d.attributes.popularity || 50, publishedAt: d.attributes.publishedAt, })); }

// WordPress (WP REST API) โ€” fetch posts example async function fetchWordpressPosts({ perPage = 20 } = {}) { const WP_URL = process.env.NEXT_PUBLIC_WP_URL || "https://blog.example.com"; const url = ${WP_URL}/wp-json/wp/v2/posts?per_page=${perPage}&_embed; const res = await fetch(url); if (!res.ok) throw new Error("Failed fetching WP posts"); const posts = await res.json(); return posts.map((p) => ({ id: wp-${p.id}, title: p.title.rendered.replace(/<[^>]+>/g, ""), excerpt: (p.excerpt && p.excerpt.rendered) ? p.excerpt.rendered.replace(/<[^>]+>/g, "") : "", image: (p._embedded && p._embedded['wp:featuredmedia'] && p._embedded['wp:featuredmedia'][0].source_url) || "", featured: p.featured || false, affiliate: (p.categories || []).includes(/* affiliate category ID */ 12), adult: false, score: p.meta && p.meta._popularity || 50, publishedAt: p.date, })); }

// --------------------------------------------------------------------------- // 2) Improved priority algorithm โ€” signal fusion + lightweight ML hook // Approach: compute a composite relevance score from many signals, optionally // update weights via a tiny server-side ML model or A/B feedback loop.

// Signals we consider (example): // - featured (binary) // - affiliate (binary) // - userEngagement (clicks, timeSpent) โ€” from analytics // - recency (decay by days) // - personalPreference (user topics, saved items) // - adult (flag to deprioritize in mixed feeds)

function compositeScore(item, signals = {}) { // default weights (can be tuned, remotely configurable) const weights = { featured: 3.5, affiliate: 1.2, engagement: 2.0, recency: 1.5, preference: 2.2, adultPenalty: -1.0, };

const featured = item.featured ? 1 : 0; const affiliate = item.affiliate ? 1 : 0; const engagement = signals.engagementForId?.[item.id] || (item.score ? item.score / 100 : 0.5); // normalize

// recency score: newer => closer to 1 const days = item.publishedAt ? Math.max(0, (Date.now() - new Date(item.publishedAt).getTime()) / (10006060*24)) : 365; const recency = Math.exp(-days / 30); // 30-day half-life-ish

const preference = signals.userTopicMatch?.[item.id] || 0; // 0..1

const adultPenalty = item.adult ? weights.adultPenalty : 0;

const score = (featured * weights.featured) + (affiliate * weights.affiliate) + (engagement * weights.engagement) + (recency * weights.recency) + (preference * weights.preference) + adultPenalty;

return score; }

// Smart order using compositeScore function smartOrderAdvanced(items, viewportWidth, signals = {}) { return [...items].sort((a, b) => { const sa = compositeScore(a, signals); const sb = compositeScore(b, signals); return sb - sa; }); }

// Optional: learning signal collector (very small, privacy-first) // Collect interactions locally and periodically send aggregated deltas to server function collectInteraction(interaction) { // interaction = { id, type: 'open'|'click'|'time', duration } try { const key = 'interaction_aggregate_v1'; const raw = localStorage.getItem(key); const data = raw ? JSON.parse(raw) : {}; data[interaction.id] = data[interaction.id] || { opens: 0, clicks: 0, time: 0 }; if (interaction.type === 'open') data[interaction.id].opens++; if (interaction.type === 'click') data[interaction.id].clicks++; if (interaction.type === 'time') data[interaction.id].time += interaction.duration || 0; localStorage.setItem(key, JSON.stringify(data)); // periodically (server-side) you can pull aggregated anonymized data to tune weights } catch (e) {} }

// ------------------- 3) Neon / Sci-fi Styling + Framer Motion ---------------- // Tailwind utility variants for a neon look (example classes) - pick & apply // Example: use className="bg-gradient-to-br from-[#011627] via-[#13293D] to-[#0E4D92] text-white"

// Framer Motion snippet (install framer-motion and import at top of file): // import { motion } from 'framer-motion' // Replace PostCard wrapper with motion.article for pop/focus animations.

/* Example usage inside PostCard (concept): <motion.article initial={{ opacity: 0, translateY: 8 }} animate={{ opacity: 1, translateY: 0 }} whileHover={{ scale: 1.02 }} transition={{ duration: 0.35 }} className="rounded-2xl overflow-hidden shadow-lg"

...content... </motion.article> */

// Add subtle neon highlights (Tailwind config optional): // badge: className="text-xs font-semibold px-2 py-1 rounded bg-gradient-to-r from-pink-500 via-purple-500 to-indigo-500 text-white shadow-lg"

// ------------------------ 4) Monetization + A/B testing --------------------- // Simple rotating affiliate banner with localStorage-based frequency control.

function chooseAffiliateVariant(affiliateId, variants = ['A','B']) { // deterministic but per-user: hash the affiliateId + local client id let clientId = localStorage.getItem('client_uuid'); if (!clientId) { clientId = Math.random().toString(36).slice(2, 10); localStorage.setItem('client_uuid', clientId); } const seed = (affiliateId + clientId).split('').reduce((s,c)=>s + c.charCodeAt(0), 0); return variants[seed % variants.length]; }

// Example render: if variant === 'A' show long-form card; variant 'B' show compact CTA.

// A/B testing flow (very small): // 1) assign variant via chooseAffiliateVariant() // 2) render UI accordingly // 3) collect outcome (clicks, conversions) via collectInteraction or direct server ping // 4) after enough samples, compute winner server-side and push new variant weights via remote config.

// Minimal rotate & throttle function for affiliate impressions function registerAffiliateImpression(affId) { try { const key = 'affiliate_impr_v1'; const raw = localStorage.getItem(key); const data = raw ? JSON.parse(raw) : {}; data[affId] = (data[affId] || 0) + 1; localStorage.setItem(key, JSON.stringify(data)); } catch (e) {} }

/* ----------------------------- Integration notes ---------------------------

  • Place fetchStrapiPosts / fetchWordpressPosts inside your data layer and map to the feed input for FuturisticAutoAdaptiveLayout.
  • Use smartOrderAdvanced(...) with signals pulled from your analytics module.
  • Keep adult gating strictly client-side with DOB confirm; do not serve adult content previews to unauthenticated users without extra checks.
  • For Framer Motion, import at top and replace container wrappers with motion.
  • Remote config (weights, feature flags) is recommended to tune live without redeploys; use a small server endpoint to return JSON weights.

That's it โ€” the code above was appended to the component file in the canvas. Feel free to ask "tambahkan X" or say "implementasikan ke Next.js" and I will update the canvas component to include the integration in-place (e.g., a Next.js getServerSideProps example wiring Strapi -> component). */

/* -------------------------------------------------------------------------- NEXT STEP: IMPLEMENTASI LENGKAP (user requested: "lanjut semua")

    1. Next.js getServerSideProps contoh untuk Strapi
    1. Remote-config endpoint (Next.js API route) untuk bobot algoritme
    1. PostCard -> Framer Motion (import + component snippet)
    1. Panel analytics mock + batch uploader (React component + server API)

Semua potongan di bawah ini bisa ditempel langsung di proyek Next.js

  • file: pages/index.js (example) untuk SSR
  • file: pages/api/remote-config.js untuk config
  • file: components/AnimatedPostCard.jsx untuk Framer Motion
  • file: components/AnalyticsPanel.jsx + pages/api/collect.js untuk koleksi ----------------------------------------------------------------------------*/

// -------------------- 1) Next.js getServerSideProps (Strapi) --------------- // pages/index.js (strip untuk contoh): /* import FuturisticAutoAdaptiveLayout from '../components/FuturisticAutoAdaptiveLayout'; import { fetchStrapiPosts } from '../lib/cms'; // ekstrak dari canvas code

export async function getServerSideProps(context) { try { const posts = await fetchStrapiPosts({ limit: 40 }); return { props: { posts } }; } catch (err) { console.error('Strapi fetch error', err); return { props: { posts: [] } }; } }

export default function Home({ posts }) { return ; } */

// NOTES: // - Keep your STRAPI token on server env (NEXT_PUBLIC vs server-only env vars). // - For incremental static regeneration (ISR) use getStaticProps + revalidate.

// -------------------- 2) Remote-config API (Next.js API route) ------------ // pages/api/remote-config.js /* export default function handler(req, res) { // Example: return JSON with weights and feature flags const config = { weights: { featured: 3.5, affiliate: 1.2, engagement: 2.0, recency: 1.5, preference: 2.2, adultPenalty: -1.0 }, featureFlags: { enableNeonTheme: true, enableFramerMotion: true, abTestingEnabled: true }, updatedAt: new Date().toISOString() }; res.status(200).json(config); } */

// Client usage (fetch remote config once at app init): /* useEffect(() => { async function loadConfig() { try { const r = await fetch('/api/remote-config'); const cfg = await r.json(); // store in context or local state } catch (e) { console.warn('failed remote config', e); } } loadConfig(); }, []); */

// -------------------- 3) Animated PostCard (Framer Motion) --------------- // components/AnimatedPostCard.jsx /* import React from 'react'; import { motion } from 'framer-motion';

export default function AnimatedPostCard({ item, onOpen }) { return ( <motion.article initial={{ opacity: 0, y: 8 }} animate={{ opacity: 1, y: 0 }} whileHover={{ scale: 1.02, boxShadow: '0 10px 30px rgba(0,0,0,0.12)'}} transition={{ duration: 0.36 }} className="rounded-2xl overflow-hidden shadow-lg bg-gradient-to-br from-[#011627] via-[#13293D] to-[#0E4D92] text-white" > <div className={relative ${item.featured ? "h-56 md:h-64" : "h-48"}}> {item.title} {item.affiliate && Affiliate} {item.adult && 18+}

{item.title}

{item.excerpt}

Score: {item.score}
<button onClick={() => onOpen(item)} className="px-3 py-1 rounded-md border border-white/20 text-sm">Baca
</motion.article> ); } */

// Integration note: import AnimatedPostCard and replace PostCard in layout when // remote-config.featureFlags.enableFramerMotion === true.

// -------------------- 4) Analytics Panel + Batch Uploader ------------------ // components/AnalyticsPanel.jsx (simple UI to show collected metrics and send) /* import React, { useEffect, useState } from 'react';

export default function AnalyticsPanel() { const [data, setData] = useState({});

useEffect(() => { const raw = localStorage.getItem('interaction_aggregate_v1'); if (raw) setData(JSON.parse(raw)); }, []);

async function sendBatch() { const payload = { collected: data, ts: new Date().toISOString() }; try { await fetch('/api/collect', { method: 'POST', headers: {'Content-Type':'application/json'}, body: JSON.stringify(payload) }); alert('Batch sent (mock)'); // optional: clear local storage // localStorage.removeItem('interaction_aggregate_v1'); } catch (e) { console.error(e); alert('Gagal mengirim batch'); } }

return (

Analytics Panel (dev)

{JSON.stringify(data, null, 2)}
Kirim Batch <button onClick={() => { localStorage.removeItem('interaction_aggregate_v1'); setData({}); }} className="px-3 py-2 rounded-md border">Hapus Lokal
); } */

// pages/api/collect.js (server receiver - mock) /* export default async function handler(req, res) { if (req.method !== 'POST') return res.status(405).end(); const payload = req.body; // In production: validate, aggregate, store to analytics DB or pipeline console.log('Received analytics batch:', payload.ts, Object.keys(payload.collected || {} ).length); return res.status(200).json({ ok: true }); } */

/* -------------------------------------------------------------------------- DEPLOYMENT CHECKLIST

  • Install framer-motion: npm i framer-motion (or yarn)
  • Tailwind: ensure configured and supports custom gradients
  • Move sensitive envs (Strapi token) to server-only env (process.env.STRAPI_TOKEN)
  • Add CSP and security headers for affiliate link tracking
  • If you serve adult content, consider extra verification for regulated markets

DONE โ€” aku sudah menambahkan semua potongan langkah demi langkah di dokumen. Jika mau, aku bisa: otomatis memasukkan AnimatedPostCard ke layout dan menambahkan AnalyticsPanel ke sidebar (langsung edit canvas). Katakan "pasang" atau "edit otomatis" dan aku langsung update file di canvas. ----------------------------------------------------------------------------*/

/* -------------------------------------------------------------------------- INTEGRASI OTOMATIS: AnimatedPostCard + AnalyticsPanel ----------------------------------------------------------------------------*/

// === Replace PostCard import with AnimatedPostCard === // In FuturisticAutoAdaptiveLayout.jsx: // BEFORE: // import PostCard from './PostCard'; // AFTER: import AnimatedPostCard from './AnimatedPostCard';

// === Replace usage === // BEFORE: // // AFTER: //

// === Tambahkan AnalyticsPanel ke layout (misal di sidebar) === // In FuturisticAutoAdaptiveLayout.jsx atau page container: /* import AnalyticsPanel from './AnalyticsPanel';

export default function FuturisticAutoAdaptiveLayout({ posts }) { return (

{ordered.map(item => ( ))}

  <aside className="lg:col-span-1 space-y-4">
    <AnalyticsPanel />
  </aside>
</div>

); } */

// DONE โ€” AnimatedPostCard sudah dipasang dan AnalyticsPanel sudah diintegrasikan.

/* -------------------------------------------------------------------------- AUTO-TRANSLATE 15 BAHASA + TETUN (TIMOR-LESTE) Integrasi langsung ke pipeline konten ----------------------------------------------------------------------------*/

// === 1) Daftar bahasa populer + Tetun === // Kita buat mapping kode bahasa untuk backend / API lokal. export const SUPPORTED_LANGS = [ { code: 'en', label: 'English' }, { code: 'id', label: 'Indonesian' }, { code: 'pt', label: 'Portuguese' }, { code: 'es', label: 'Spanish' }, { code: 'fr', label: 'French' }, { code: 'de', label: 'German' }, { code: 'it', label: 'Italian' }, { code: 'nl', label: 'Dutch' }, { code: 'ru', label: 'Russian' }, { code: 'ja', label: 'Japanese' }, { code: 'ko', label: 'Korean' }, { code: 'zh', label: 'Chinese (Mandarin)' }, { code: 'ar', label: 'Arabic' }, { code: 'hi', label: 'Hindi' }, { code: 'ms', label: 'Malay' }, // BONUS sesuai permintaan: { code: 'tet', label: 'Tetun (Timor-Leste)' } ];

// === 2) API route untuk auto-translate === // pages/api/translate.js /* import { translateText } from '../../lib/translator'; // wrapper engine local

export default async function handler(req, res) { if (req.method !== 'POST') return res.status(405).json({ error: 'Method not allowed' }); const { text, target } = req.body; try { const out = await translateText(text, target); return res.status(200).json({ translated: out }); } catch (e) { return res.status(500).json({ error: 'translate_failed', info: e.message }); } } */

// === 3) Client helper === /* export async function autoTranslate(text, lang) { const r = await fetch('/api/translate', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ text, target: lang }) }); const j = await r.json(); return j.translated; } */

// === 4) Integrasi ke layout: tombol translate tiap post === /* // Dalam AnimatedPostCard atau PostModal:

const [lang, setLang] = useState('id'); const [translated, setTranslated] = useState(null);

async function handleTranslate(l) { setLang(l); const out = await autoTranslate(item.content, l); setTranslated(out); }

<select onChange={(e) => handleTranslate(e.target.value)} value={lang} className="mt-3 p-2 rounded-md bg-white/10 text-sm"> {SUPPORTED_LANGS.map(l => ( {l.label} ))}

{translated || item.content}
*/

// === 5) Backend translator wrapper (lib/translator.js) === /* // NOTE: Gunakan provider apa punโ€”local LLM / open-source / API enterprise. // Berikut mock universal translator untuk demo.

export async function translateText(text, targetLang) { // Implementasi real: hubungkan ke provider translator. // Untuk Tetun, gunakan fallback model lokal. return [${targetLang}] + text; } */

/* -------------------------------------------------------------------------- AUTO-TRANSLATE TERPASANG โ€” dengan 15 bahasa + Tetun Timor-Leste. Siap dipasang penuh jika mau: bisa kutambahkan caching, pre-generation, dan detection otomatis bahasa user (Accept-Language header). ----------------------------------------------------------------------------*/

๐Ÿ”ฅ Aleoโ€™s Tube Network

Backlink + Affiliate Tracker v1.0

Integrating Blog, YouTube & Affiliate SEO Growth

Aleoโ€™s Tube Network Banner


๐Ÿ“Š Tentang Proyek

Aleoโ€™s Tube Network Tracker membantu kreator, blogger, dan affiliate marketer mengelola backlink, afiliasi, serta performa SEO lintas platform secara efisien.

Proyek ini dibuat untuk menghubungkan seluruh aset digital โ€” mulai dari blog, YouTube channel, hingga link afiliasi โ€” dalam satu sistem pelacakan yang mudah digunakan, transparan, dan otomatis.

๐Ÿ’ก โ€œEmpowering creators to build influence through smart SEO & affiliate growth.โ€


๐Ÿš€ Fitur Utama

โœ… Template Google Sheets untuk pelacakan backlink & afiliasi
โœ… Integrasi lintas platform: Blog, YouTube, Shopee, Digistore24
โœ… Tampilan visual profesional dengan gradasi merahโ€“oranye khas Aleoโ€™s Tube
โœ… Lisensi MIT โ€” bebas digunakan dan dimodifikasi
โœ… Optimasi SEO bawaan (meta tags, rich snippet-ready)


๐Ÿ“‚ Struktur Proyek

๐Ÿ“ Aleos-Tube-Network/ โ”‚ โ”œโ”€โ”€ index.html # Landing page untuk GitHub Pages โ”œโ”€โ”€ Aleo's_Tube_Network_Banner.png # Header/banner resmi โ”œโ”€โ”€ LICENSE # Lisensi MIT โ””โ”€โ”€ README.md # Dokumentasi proyek (file ini)


๐Ÿ”— Akses Cepat

๐Ÿ”ง Aksi ๐ŸŒ Link
๐Ÿ“Š Buka Template Google Sheets Klik di sini
๐Ÿ’พ Lihat di GitHub Pages aleostube.github.io/backlink-tracker
๐Ÿง  Baca Dokumentasi README.md

๐ŸŒ Jejaring & Afiliasi

๐ŸŒ Platform ๐Ÿ”— Link
๐ŸŽฅ YouTube @Daily_vlog_anak_rantau
๐Ÿ“˜ Facebook Aleostube Page
๐Ÿฆ X (Twitter) @aleostube
๐Ÿ“Œ Pinterest Aleostube on Pinterest
๐Ÿ›’ Shopee Affiliate Produk Pilihan Shopee
๐Ÿ’ฐ Digistore24 Affiliate Affiliate Hub

๐Ÿ› ๏ธ Teknologi & Tools

  • HTML5 + CSS3
  • Google Sheets Integration
  • GitHub Pages Deployment
  • MIT Open Source License

โš–๏ธ Lisensi

Proyek ini dilindungi oleh MIT License.
Silakan gunakan, modifikasi, dan distribusikan โ€” dengan tetap mencantumkan kredit kepada Aleoโ€™s Tube Network.


๐Ÿ’ฌ Tentang Penulis

๐Ÿ‘ค Aleoโ€™s Tube
๐Ÿ“บ Kreator konten & penulis digital
๐ŸŒ Membagikan pengetahuan, pengalaman, dan inspirasi dari kehidupan perantauan
๐Ÿ“ง Hubungi: aleostube@gmail.com

๐ŸŒ  โ€œBelajar, berbagi, dan tumbuh bersama โ€” satu backlink dan satu ide setiap hari.โ€


โญ Jika proyek ini bermanfaat, jangan lupa kasih bintang di repo GitHub kamu!
#AleoTube #SEO #AffiliateMarketing #BacklinkTracker #CreatorTools

      <?xml version="1.0" encoding="UTF-8" ?>
<script type="text/plain"> </script> <title></title> <script type='application/ld+json'> ", "url": "", "logo": "", "sameAs": [] }, { "@type": "WebSite", "url": "", "name": "", "potentialAction": { "@type": "SearchAction", "target": "search?q={search_term_string}", "query-input": "required name=search_term_string" } } ] } ]]> </script> <script async src='https://www.googletagmanager.com/gtag/js?id=G-71BR09BJ1R'></script> <script type='text/javascript'> </script> <style type='text/css'> #aleo-tools{font-family:system-ui,Arial;font-size:13px} #aleo-tools .card{background:rgba(255,255,255,0.96);border:1px solid rgba(0,0,0,0.06);padding:12px;border-radius:10px;box-shadow:0 6px 18px rgba(0,0,0,0.04)} #aleo-tools.compact{position:fixed;right:12px;bottom:12px;width:320px;z-index:99999} @media(max-width:720px){#aleo-tools.compact{display:none}} #aleo-tools h4{margin:0 0 8px;font-size:14px} #aleo-tools input,#aleo-tools button,#aleo-tools textarea{width:100%;margin:4px 0;padding:8px;border-radius:6px;border:1px solid #ddd;box-sizing:border-box} #aleo-seo-health{margin-top:8px;font-size:12px} </style> <script src='https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js' defer></script> <script type='text/javascript'> 10 && t.length<130), v: t.length}, {k:'description', ok: (len>50 && len<320), v: len}, {k:'canonical', ok: !!document.querySelector('link[rel="canonical"]'), v: location.href} ]; } // Render widget & chart function renderWidget(){ if(document.getElementById('aleo-tools')) return; const d = document.createElement('div'); d.id='aleo-tools'; d.className='compact'; d.innerHTML = '

SEO & Backlink โ€” ALEO

' + '' + '' + 'Tambah' + '
SEO Health:
' + '' + '
Data lokal + Google Sheets (optional).
' + 'Export CSV' + '
'; document.body.appendChild(d); function refreshHealth(){ const list = seoHealth(); const box = document.getElementById('a-health'); box.innerHTML = ''; list.forEach(it => { const el = document.createElement('div'); el.textContent = 'โ€ข ' + it.k + ': ' + (it.ok ? 'OK' : 'Periksa') + ' (' + it.v + ')'; box.appendChild(el); }); } refreshHealth(); document.getElementById('a-add').addEventListener('click', async function(){ const url = document.getElementById('a-url').value.trim(); const note = document.getElementById('a-note').value.trim(); if(!url){ alert('Masukkan URL target backlink.'); return; } await window.ALEO.add(url, note); document.getElementById('a-url').value=''; document.getElementById('a-note').value=''; refreshHealth(); redrawChart(); }); document.getElementById('a-exp').addEventListener('click', function(){ const s = window.ALEO.get(); const rows = ['url,added,notes']; s.targets.forEach(t => rows.push('"' + t.url + '","' + t.added + '","' + (t.notes||'') + '"')); const blob = new Blob([rows.join('\n')], {type:'text/csv'}); const u = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = u; a.download = 'aleo-backlinks.csv'; a.click(); URL.revokeObjectURL(u); }); // Chart draw function drawChart(){ try{ const s = window.ALEO.get(); const counts = {}; s.targets.forEach(t => { const m = (new Date(t.added)).toISOString().slice(0,7); counts[m] = (counts[m]||0)+1; }); const labels = Object.keys(counts).sort(); const data = labels.map(l=>counts[l]); const ctx = document.getElementById('a-chart').getContext('2d'); if(window.ALEO._chart){ try{ window.ALEO._chart.destroy(); }catch(e){} } window.ALEO._chart = new Chart(ctx, { type: 'line', data: { labels: labels, datasets: [{ label: 'Backlinks', data: data, fill: true, tension: 0.3 }] }, options:{ plugins:{ legend:{ display:false } }, scales:{ y:{ beginAtZero:true } } } }); }catch(e){} } function redrawChart(){ drawChart(); } drawChart(); window.ALEO.redrawChart = redrawChart; } if(document.readyState === 'loading') document.addEventListener('DOMContentLoaded', renderWidget); else renderWidget(); })(); ]]> </script> <script type='text/javascript'> window.addEventListener(evt, init, { once:true })); })(); ]]> </script> <script type='text/javascript'> -1) return; window.addEventListener('load', function(){ try{ var s = document.createElement('script'); s.src = '//translate.google.com/translate_a/element.js?cb=__gtInit'; s.type = 'text/javascript'; s.async = true; document.head.appendChild(s); }catch(e){} }); window.__gtInit = function(){ try{ new google.translate.TranslateElement({ pageLanguage: 'id', autoDisplay: false, layout: google.translate.TranslateElement.InlineLayout.SIMPLE }, 'google_translate_element'); var lang = (navigator.language || 'id').slice(0,2); document.cookie = 'googtrans=/id/' + lang + '; path=/;'; setTimeout(function(){ try{ var el = document.querySelector('.goog-te-combo'); if(el){ el.value = lang; el.dispatchEvent(new Event('change')); } }catch(e){} }, 700); }catch(e){} }; var d = document.createElement('div'); d.id = 'google_translate_element'; d.style.display = 'none'; document.addEventListener('DOMContentLoaded', function(){ document.body.appendChild(d); }); })(); ]]> </script>

/* Header ----------------------------------------------- */ .header-outer { background: $(header.background.color) $(header.background.gradient) repeat-x scroll top left; _background-image: none;

color: $(header.text.color);

-moz-border-radius: $(header.border.radius); -webkit-border-radius: $(header.border.radius); -goog-ms-border-radius: $(header.border.radius); border-radius: $(header.border.radius); }

.Header img, .Header #header-inner { -moz-border-radius: $(header.border.radius); -webkit-border-radius: $(header.border.radius); -goog-ms-border-radius: $(header.border.radius); border-radius: $(header.border.radius); }

.header-inner .Header .titlewrapper, .header-inner .Header .descriptionwrapper { padding-left: $(header.padding); padding-right: $(header.padding); }

.Header h1 { font: $(header.font); text-shadow: 1px 1px 3px rgba(0, 0, 0, 0.3); }

.Header h1 a { color: $(header.text.color); }

.Header .description { font-size: 130%; }

/* Tabs ----------------------------------------------- */ .tabs-inner { margin: .5em $(tabs.margin.sides) $(tabs.margin.bottom); padding: 0; }

.tabs-inner .section { margin: 0; }

.tabs-inner .widget ul { padding: 0;

background: $(tabs.background.color) $(tabs.background.gradient) repeat scroll bottom;

-moz-border-radius: $(tabs.border.radius); -webkit-border-radius: $(tabs.border.radius); -goog-ms-border-radius: $(tabs.border.radius); border-radius: $(tabs.border.radius); }

.tabs-inner .widget li { border: none; }

.tabs-inner .widget li a { display: inline-block;

padding: .5em 1em; margin-$endSide: $(tabs.spacing);

color: $(tabs.text.color); font: $(tabs.font);

-moz-border-radius: $(tab.border.radius) $(tab.border.radius) 0 0; -webkit-border-top-left-radius: $(tab.border.radius); -webkit-border-top-right-radius: $(tab.border.radius); -goog-ms-border-radius: $(tab.border.radius) $(tab.border.radius) 0 0; border-radius: $(tab.border.radius) $(tab.border.radius) 0 0;

background: $(tab.background);

border-$endSide: 1px solid $(tabs.separator.color); }

.tabs-inner .widget li:first-child a { padding-$startSide: 1.25em;

-moz-border-radius-top$startSide: $(tab.first.border.radius); -moz-border-radius-bottom$startSide: $(tabs.border.radius); -webkit-border-top-$startSide-radius: $(tab.first.border.radius); -webkit-border-bottom-$startSide-radius: $(tabs.border.radius); -goog-ms-border-top-$startSide-radius: $(tab.first.border.radius); -goog-ms-border-bottom-$startSide-radius: $(tabs.border.radius); border-top-$startSide-radius: $(tab.first.border.radius); border-bottom-$startSide-radius: $(tabs.border.radius); }

.tabs-inner .widget li.selected a, .tabs-inner .widget li a:hover { position: relative; z-index: 1;

background: $(tabs.selected.background.color) $(tab.selected.background.gradient) repeat scroll bottom; color: $(tabs.selected.text.color);

-moz-box-shadow: 0 0 $(region.shadow.spread) rgba(0, 0, 0, .15); -webkit-box-shadow: 0 0 $(region.shadow.spread) rgba(0, 0, 0, .15); -goog-ms-box-shadow: 0 0 $(region.shadow.spread) rgba(0, 0, 0, .15); box-shadow: 0 0 $(region.shadow.spread) rgba(0, 0, 0, .15); }

/* Headings ----------------------------------------------- */ h2 { font: $(widget.title.font); text-transform: $(widget.title.text.transform); color: $(widget.title.text.color); margin: .5em 0; }

/* Main ----------------------------------------------- */ .main-outer { background: $(main.background);

-moz-border-radius: $(main.border.radius.top) $(main.border.radius.top) 0 0; -webkit-border-top-left-radius: $(main.border.radius.top); -webkit-border-top-right-radius: $(main.border.radius.top); -webkit-border-bottom-left-radius: 0; -webkit-border-bottom-right-radius: 0; -goog-ms-border-radius: $(main.border.radius.top) $(main.border.radius.top) 0 0; border-radius: $(main.border.radius.top) $(main.border.radius.top) 0 0;

-moz-box-shadow: 0 $(region.shadow.offset) $(region.shadow.spread) rgba(0, 0, 0, .15); -webkit-box-shadow: 0 $(region.shadow.offset) $(region.shadow.spread) rgba(0, 0, 0, .15); -goog-ms-box-shadow: 0 $(region.shadow.offset) $(region.shadow.spread) rgba(0, 0, 0, .15); box-shadow: 0 $(region.shadow.offset) $(region.shadow.spread) rgba(0, 0, 0, .15); }

.main-inner { padding: 15px $(main.padding.sides) 20px; }

.main-inner .column-center-inner { padding: 0 0; }

.main-inner .column-left-inner { padding-left: 0; }

.main-inner .column-right-inner { padding-right: 0; }

/* Posts ----------------------------------------------- */ h3.post-title { margin: 0; font: $(post.title.font); }

.comments h4 { margin: 1em 0 0; font: $(post.title.font); }

.date-header span { color: $(date.header.color); }

.post-outer { background-color: $(post.background.color); border: solid 1px $(post.border.color);

-moz-border-radius: $(post.border.radius); -webkit-border-radius: $(post.border.radius); border-radius: $(post.border.radius); -goog-ms-border-radius: $(post.border.radius);

padding: 15px 20px; margin: 0 $(post.margin.sides) 20px; }

.post-body { line-height: 1.4; font-size: 110%; position: relative; }

.post-header { margin: 0 0 1.5em;

color: $(post.footer.text.color); line-height: 1.6; }

.post-footer { margin: .5em 0 0;

color: $(post.footer.text.color); line-height: 1.6; }

#blog-pager { font-size: 140% }

#comments .comment-author { padding-top: 1.5em;

border-top: dashed 1px #ccc; border-top: dashed 1px rgba(128, 128, 128, .5);

background-position: 0 1.5em; }

#comments .comment-author:first-child { padding-top: 0;

border-top: none; }

.avatar-image-container { margin: .2em 0 0; }

/* Comments ----------------------------------------------- */ .comments .comments-content .icon.blog-author { background-repeat: no-repeat; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9sLFwMeCjjhcOMAAAD+SURBVDjLtZSvTgNBEIe/WRRnm3U8RC1neQdsm1zSBIU9VVF1FkUguQQsD9ITmD7ECZIJSE4OZo9stoVjC/zc7ky+zH9hXwVwDpTAWWLrgS3QAe8AZgaAJI5zYAmc8r0G4AHYHQKVwII8PZrZFsBFkeRCABYiMh9BRUhnSkPTNCtVXYXURi1FpBDgArj8QU1eVXUzfnjv7yP7kwu1mYrkWlU33vs1QNu2qU8pwN0UpKoqokjWwCztrMuBhEhmh8bD5UDqur75asbcX0BGUB9/HAMB+r32hznJgXy2v0sGLBcyAJ1EK3LFcbo1s91JeLwAbwGYu7TP/3ZGfnXYPgAVNngtqatUNgAAAABJRU5ErkJggg==); }

.comments .comments-content .loadmore a { border-top: 1px solid $(link.hover.color); border-bottom: 1px solid $(link.hover.color); }

.comments .continue { border-top: 2px solid $(link.hover.color); }

/* Widgets ----------------------------------------------- */ .widget ul, .widget #ArchiveList ul.flat { padding: 0; list-style: none; }

.widget ul li, .widget #ArchiveList ul.flat li { border-top: dashed 1px #ccc; border-top: dashed 1px rgba(128, 128, 128, .5); }

.widget ul li:first-child, .widget #ArchiveList ul.flat li:first-child { border-top: none; }

.widget .post-body ul { list-style: disc; }

.widget .post-body ul li { border: none; }

/* Footer ----------------------------------------------- */ .footer-outer { color:$(footer.text.color); background: $(footer.background);

-moz-border-radius: $(footer.border.radius.top) $(footer.border.radius.top) $(footer.border.radius.bottom) $(footer.border.radius.bottom); -webkit-border-top-left-radius: $(footer.border.radius.top); -webkit-border-top-right-radius: $(footer.border.radius.top); -webkit-border-bottom-left-radius: $(footer.border.radius.bottom); -webkit-border-bottom-right-radius: $(footer.border.radius.bottom); -goog-ms-border-radius: $(footer.border.radius.top) $(footer.border.radius.top) $(footer.border.radius.bottom) $(footer.border.radius.bottom); border-radius: $(footer.border.radius.top) $(footer.border.radius.top) $(footer.border.radius.bottom) $(footer.border.radius.bottom);

-moz-box-shadow: 0 $(region.shadow.offset) $(region.shadow.spread) rgba(0, 0, 0, .15); -webkit-box-shadow: 0 $(region.shadow.offset) $(region.shadow.spread) rgba(0, 0, 0, .15); -goog-ms-box-shadow: 0 $(region.shadow.offset) $(region.shadow.spread) rgba(0, 0, 0, .15); box-shadow: 0 $(region.shadow.offset) $(region.shadow.spread) rgba(0, 0, 0, .15); }

.footer-inner { padding: 10px $(main.padding.sides) 20px; }

.footer-outer a { color: $(footer.link.color); }

.footer-outer a:visited { color: $(footer.link.visited.color); }

.footer-outer a:hover { color: $(footer.link.hover.color); }

.footer-outer .widget h2 { color: $(footer.widget.title.text.color); }

/* Mobile ----------------------------------------------- */ html body.mobile { height: auto; }

html body.mobile { min-height: 480px; background-size: 100% auto; }

.mobile .body-fauxcolumn-outer { background: $(mobile.background.overlay); }

html .mobile .mobile-date-outer, html .mobile .blog-pager { border-bottom: none; background: $(main.background); margin-bottom: 10px; }

.mobile .date-outer { background: $(main.background); }

.mobile .header-outer, .mobile .main-outer, .mobile .post-outer, .mobile .footer-outer { -moz-border-radius: 0; -webkit-border-radius: 0; -goog-ms-border-radius: 0; border-radius: 0; }

.mobile .content-outer, .mobile .main-outer, .mobile .post-outer { background: inherit; border: none; }

.mobile .content-outer { font-size: 100%; }

.mobile-link-button { background-color: $(link.color); }

.mobile-link-button a:link, .mobile-link-button a:visited { color: $(post.background.color); }

.mobile-index-contents { color: $(body.text.color); }

.mobile .tabs-inner .PageList .widget-content { background: $(tabs.selected.background.color) $(tab.selected.background.gradient) repeat scroll bottom; color: $(tabs.selected.text.color); }

.mobile .tabs-inner .PageList .widget-content .pagelist-arrow { border-$startSide: 1px solid $(tabs.separator.color); } ]]></b:skin>

<b:template-skin>
  <b:variable default='960px' name='content.width' type='length' value='700px'/>
  <b:variable default='100%' name='main.column.left.width' type='length' value='0px'/>
  <b:variable default='310px' name='main.column.right.width' type='length' value='0px'/>

  <![CDATA[
  body {
    min-width: $(content.width);
  }

  .content-outer, .content-fauxcolumn-outer, .region-inner {
    min-width: $(content.width);
    max-width: $(content.width);
    _width: $(content.width);
  }

  .main-inner .columns {
    padding-left: $(main.column.left.width);
    padding-right: $(main.column.right.width);
  }

  .main-inner .fauxcolumn-center-outer {
    left: $(main.column.left.width);
    right: $(main.column.right.width);
    /* IE6 does not respect left and right together */
    _width: expression(this.parentNode.offsetWidth -
        parseInt("$(main.column.left.width)") -
        parseInt("$(main.column.right.width)") + 'px');
  }

  .main-inner .fauxcolumn-left-outer {
    width: $(main.column.left.width);
  }

  .main-inner .fauxcolumn-right-outer {
    width: $(main.column.right.width);
  }

  .main-inner .column-left-outer {
    width: $(main.column.left.width);
    right: 100%;
    margin-left: -$(main.column.left.width);
  }

  .main-inner .column-right-outer {
    width: $(main.column.right.width);
    margin-right: -$(main.column.right.width);
  }

  #layout {
    min-width: 0;
  }

  #layout .content-outer {
    min-width: 0;
    width: 800px;
  }

  #layout .region-inner {
    min-width: 0;
    width: auto;
  }

  body#layout div.add_widget {
    padding: 8px;
  }

  body#layout div.add_widget a {
    margin-left: 32px;
  }
  ]]>
</b:template-skin>

<b:if cond='data:skin.vars.body_background.image.isResizable'>
  <b:include cond='not data:view.isPreview' data='{                          image: data:skin.vars.body_background.image,                          selector: &quot;body&quot;                        }' name='responsiveImageStyle'/>
</b:if>

<b:include data='blog' name='google-analytics'/>
<script type='text/javascript'> //document.querySelector('.analog-clock-footer .hand.hour').style.transform = rotate(${hour}deg) translate(-50%, -50%); document.querySelector('.analog-clock-footer .hand.minute').style.transform = rotate(${minute}deg) translate(-50%, -50%); document.querySelector('.analog-clock-footer .hand.second').style.transform = rotate(${second}deg) translate(-50%, -50%); }

setInterval(updateClockFooter, 1000); updateClockFooter(); //]]> </script>

<style> :root { --primary-color: #ffcc00; --subscribe-color: #ff0000; --light-bg: rgba(255,255,255,0.8); --light-text: #222; --dark-bg: rgba(20,20,20,0.8); --dark-text: #fff; }

/* Footer mungil lonjong */ footer.mini-footer { position: fixed; bottom: 58px; left: 50%; transform: translateX(-50%); background: var(--light-bg); color: var(--light-text); border-radius: 20px; padding: 3px 10px; font-size: 10px; font-family: Arial, sans-serif; box-shadow: 0 2px 6px rgba(0,0,0,0.15); z-index: 900; opacity: 0; animation: fadeUp 0.6s ease forwards; } @media (prefers-color-scheme: dark) { footer.mini-footer { background: var(--dark-bg); color: var(--dark-text); } }

/* Navbar mungil */ .mini-nav { position: fixed; bottom: 8px; left: 50%; transform: translateX(-50%); background: var(--light-bg); border-radius: 30px; display: flex; gap: 12px; padding: 4px 10px; box-shadow: 0 2px 8px rgba(0,0,0,0.15); z-index: 1000; opacity: 0; animation: fadeUp 0.8s ease forwards; } .mini-nav a { color: var(--light-text); font-size: 11px; text-decoration: none; display: flex; align-items: center; transition: all 0.2s ease; } .mini-nav a i { font-size: 13px; margin-right: 3px; } .mini-nav a:hover { color: var(--primary-color); } @media (prefers-color-scheme: dark) { .mini-nav { background: var(--dark-bg); } .mini-nav a { color: var(--dark-text); } }

/* Tombol Subscribe mungil dengan border pelangi + glow + floating */ .mini-subscribe { position: fixed; right: 12px; bottom: 100px; background: var(--subscribe-color); color: #fff; font-size: 11px; padding: 5px 12px; border-radius: 30px; text-decoration: none; font-weight: bold; z-index: 1100; display: inline-block !important; opacity: 0; animation: fadeUp 1s ease forwards, glowPulse 2s infinite, floatBounce 3s ease-in-out infinite; border: 2px solid transparent; background-clip: padding-box; position: relative; }

/* Border pelangi */ .mini-subscribe::before { content: ""; position: absolute; inset: -2px; border-radius: 30px; padding: 2px; background: linear-gradient(90deg, red, orange, yellow, green, blue, indigo, violet, red); background-size: 400%; -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); -webkit-mask-composite: xor; mask-composite: exclude; animation: rainbow 4s linear infinite; }

.mini-subscribe:hover { background: #cc0000; transform: scale(1.1); }

/* Animasi border pelangi */ @keyframes rainbow { 0% { background-position: 0% 50%; } 100% { background-position: 400% 50%; } }

/* Efek glow kedip */ @keyframes glowPulse { 0%, 100% { box-shadow: 0 0 6px rgba(255,0,0,0.6); } 50% { box-shadow: 0 0 14px rgba(255,0,0,0.9); } }

/* Animasi melayang naik-turun */ @keyframes floatBounce { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-8px); } }

/* Animasi muncul */ @keyframes fadeUp { from { opacity: 0; transform: translateY(15px) translateX(-50%); } to { opacity: 1; transform: translateY(0) translateX(-50%); } } </style>

<iframe height='0' src='https://www.googletagmanager.com/ns.html?id=GTM-T5PTHLRB' style='display:none;visibility:hidden' width='0'/> <iframe height='0' src='https://www.googletagmanager.com/ns.html?id=GTM-MKB9TPDR' style='display:none;visibility:hidden' width='0'/> <iframe height='0' src='https://www.googletagmanager.com/ns.html?id=GTM-WR546M4D&gtm_auth=7_SAhutJuvX_5wv88hZpYg&gtm_preview=env-10&gtm_cookies_win=x' style='display:none;visibility:hidden' width='0'/> <script type="text/javascript"> function setAttributeOnload(object, attribute, val) { if(window.addEventListener) { window.addEventListener('load', function(){ object[attribute] = val; }, false); } else { window.attachEvent('onload', function(){ object[attribute] = val; }); } } </script> <div id="navbar-iframe-container"></div> <script type="text/javascript" src="https://apis.google.com/js/platform.js"></script> <script type="text/javascript"> gapi.load("gapi.iframes:gapi.iframes.style.bubble", function() { if (gapi.iframes && gapi.iframes.getContext) { gapi.iframes.getContext().openChild({ url: 'https://draft.blogger.com/navbar/8956348688248328686?origin\x3dhttp://localhost:80', where: document.getElementById("navbar-iframe-container"), id: "navbar-iframe" }); } }); </script><script type="text/javascript"> (function() { var script = document.createElement('script'); script.type = 'text/javascript'; script.src = '//pagead2.googlesyndication.com/pagead/js/google_top_exp.js'; var head = document.getElementsByTagName('head')[0]; if (head) { head.appendChild(script); }})(); </script>

<b:if cond='data:blog.pageType == "index"'>

<b:if cond='data:blog.metaDescription'> </b:if>
</b:if>

<style> .linktree-mini { text-align: center; margin: 15px auto; background: transparent; }

/* Avatar efek api */ .avatar-fire { position: relative; display: inline-block; margin-bottom: 20px; } .avatar-fire img { width: 90px; height: 90px; border-radius: 50%; object-fit: cover; z-index: 3; position: relative; }

/* Lidah api */ .flame { position: absolute; top: -25px; left: -25px; right: -25px; bottom: -25px; border-radius: 50%; filter: blur(28px); z-index: 1; opacity: 0.7; animation: flicker 2s infinite ease-in-out alternate; } .flame1 { background: radial-gradient(circle, rgba(255,140,0,0.8) 20%, transparent 70%); animation-delay: 0s; } .flame2 { background: radial-gradient(circle, rgba(255,69,0,0.8) 15%, transparent 80%); animation-delay: 0.5s; } .flame3 { background: radial-gradient(circle, rgba(255,215,0,0.7) 10%, transparent 80%); animation-delay: 1s; }

@keyframes flicker { 0% { transform: scale(1) rotate(0deg); opacity: 0.7; } 50% { transform: scale(1.2) rotate(12deg); opacity: 1; } 100% { transform: scale(1) rotate(-12deg); opacity: 0.6; } }

/* Sparks (percikan api) */ .spark { position: absolute; width: 6px; height: 6px; background: radial-gradient(circle, #ffec85 20%, #ff9900 70%, transparent 100%); border-radius: 50%; animation: sparkFly 3s linear infinite; opacity: 0.8; z-index: 2; } .spark:nth-child(4) { top: 10%; left: 40%; animation-delay: 0s; } .spark:nth-child(5) { top: 30%; left: 70%; animation-delay: 0.5s; } .spark:nth-child(6) { top: 60%; left: 20%; animation-delay: 1s; } .spark:nth-child(7) { top: 80%; left: 50%; animation-delay: 1.5s; } .spark:nth-child(8) { top: 40%; left: 10%; animation-delay: 2s; }

@keyframes sparkFly { 0% { transform: translateY(0) scale(1); opacity: 0.9; } 50% { transform: translateY(-40px) scale(0.8); opacity: 1; } 100% { transform: translateY(-80px) scale(0.5); opacity: 0; } }

/* Tombol oval horizontal */ .btn-row { display: flex; justify-content: center; flex-wrap: wrap; gap: 10px; } .btn { display: inline-flex; align-items: center; gap: 6px; padding: 8px 14px; border-radius: 25px; font-size: 0.9rem; font-weight: 600; color: #fff; text-decoration: none; position: relative; overflow: hidden; z-index: 1; } .btn::before { content: ""; position: absolute; inset: -2px; border-radius: 30px; background: linear-gradient(90deg, red, orange, yellow, green, blue, violet); background-size: 400% 100%; animation: rainbowMove 6s linear infinite; z-index: -2; } .btn::after { content: ""; position: absolute; inset: 2px; border-radius: 25px; z-index: -1; } .btn-wa::after { background: #25D366; } .btn-yt::after { background: #FF0000; } .btn-ig::after { background: linear-gradient(45deg,#f58529,#dd2a7b,#8134af,#515bd4); } .btn-fb::after { background: #1877F2; } .btn-pin::after { background: #E60023; } .btn-th::after { background: #000; }

.btn i { font-size: 1rem; }

@keyframes rainbowMove { 0% { background-position: 0% 50%; } 100% { background-position: 100% 50%; } } </style>

<style> .aleo-monkey-widget { position: fixed; bottom: 12px; right: 12px; width: 78px; height: 84px; z-index: 99999; cursor: pointer; transition: transform 0.3s; } .aleo-monkey-widget:hover {transform: scale(1.18) rotate(-10deg);} .monkey-body { position: absolute; bottom: 5px; left: 15px; width: 50px; height: 45px; background: #d35400; border-radius: 50% 50% 30% 30% / 60% 60% 40% 40%; border: 3px solid #a0522d; animation: monkeyDance 2s infinite; } @keyframes monkeyDance { 0%,100%{transform:rotate(-3deg) scale(1);} 25%{transform:rotate(3deg) scale(1.03);} 75%{transform:rotate(-5deg) scale(0.97);} } .monkey-head { position: absolute; top: 5px; left: 20px; width: 45px; height: 47px; background: #d35400; border-radius: 50% 50% 40% 40% / 65% 65% 35% 35%; border: 3px solid #a0522d; display: flex; align-items: center; justify-content: center; font-size: 25px; animation: headBob 1.5s infinite; } @keyframes headBob {0%,100%{transform:translateY(0);}50%{transform:translateY(-7px);}} .monkey-arms {position: absolute; top: 26px; left: 4px; display: flex; gap: 50px;} .monkey-arms .arm { width: 18px; height: 25px; background: #d35400; border: 2px solid #a0522d; border-radius: 50px; transform-origin: top center; } .monkey-arms .arm.left {animation: armSwing 1.2s infinite;} .monkey-arms .arm.right {animation: armSwing 1.2s infinite reverse;} @keyframes armSwing {0%,100%{transform:rotate(-20deg);}50%{transform:rotate(25deg);}} .coconut { position: absolute; top: -5px; right: 5px; font-size: 15px; animation: coconutSpin 2.5s infinite; color: #8b4513; } @keyframes coconutSpin {0%,100%{transform:rotate(0deg);}100%{transform:rotate(360deg);}} .monkey-speech { position: absolute; right: 85px; bottom: 35px; background: #e74c3c; color: white; border-radius: 20px; font-size: 10px; padding: 7px 12px; font-family: Arial, sans-serif; white-space: nowrap; opacity: 0; transition: opacity 0.4s; box-shadow: 0 3px 15px rgba(231,76,60,0.4); animation: speechWiggle 3s infinite; pointer-events: none; } @keyframes speechWiggle {0%,100%{transform:rotate(0);}25%{transform:rotate(-2deg);}75%{transform:rotate(2deg);}} .monkey-speech:after { content: ''; position: absolute; left: 100%; top: 50%; transform: translateY(-50%); border: 5px solid transparent; border-left-color: #e74c3c; } .aleo-monkey-widget:hover .monkey-speech {opacity: 1;} </style>
๐Ÿต
๐ŸŒ
Ayo nonton vlog aku dong!
<script> const monkeyPhrases = { id: [ 'Ayo nonton vlog aku dong!', 'Subscribe dong!', 'Ikuti petualangan saya di sawit!', 'Jangan lupa like ya Tuan!', 'Tolong bantu aku jadi orang sukses ๐Ÿ™' ], en: [ 'Watch my vlogs!', 'Please subscribe!', 'Follow my palm oil adventures!', 'Don\'t forget to like!', 'Please help me become successful ๐Ÿ™' ], ms: [ 'Tengok vlog saya!', 'Subscribe lah!', 'Ikut adventure sawit!', 'Jangan lupa like!', 'Tolong bantu saya jadi orang berjaya ๐Ÿ™' ] }; let phraseIndex = 0; const lang = (navigator.language||'id').split('-')[0]; const phrases = monkeyPhrases[lang] || monkeyPhrases['id']; setInterval(() => { document.getElementById('monkeySpeech').textContent = phrases[phraseIndex]; phraseIndex = (phraseIndex + 1) % phrases.length; }, 3000); </script>
423 752 true true BEFORE_DESCRIPTION 752

<b:if cond='data:useImage'> <b:if cond='data:imagePlacement == "BEHIND"'> <b:if cond='data:mobile'>

<b:include name='title'/>

<b:include name='description'/>
<b:else/>

<b:include name='title'/>

<b:include name='description'/>
</b:if> <b:else/>
<b:if cond='data:imagePlacement == "BEFORE_DESCRIPTION"'> <b:include name='description'/> </b:if>
</b:if> <b:else/>

<b:include name='title'/>

<b:include name='description'/>
</b:if> </b:includable> <b:includable id='description'>

<div class='tabs-outer'>
<div class='tabs-cap-top cap-top'>
  <div class='cap-left'/>
  <div class='cap-right'/>
</div>
<div class='fauxborder-left tabs-fauxborder-left'>
<div class='fauxborder-right tabs-fauxborder-right'/>
<div class='region-inner tabs-inner'>
  <b:section class='tabs' id='crosscol' maxwidgets='1' name='Cross-Column' showaddelement='yes'>
    <b:widget id='HTML2' locked='false' title='' type='HTML'>
      <b:widget-settings>
        <b:widget-setting name='content'><![CDATA[<!-- ===============================

๐Ÿ  HOMEPAGE ALEOโ€™S TUBE ================================ --> <b:if cond='data:blog.pageType == "index"'> Aleoโ€™s Tube โ€” Daily Vlog Anak Rantau

๐ŸŒ Aleoโ€™s Tube Daily Vlog Anak Rantau

Gabungan cerita kehidupan, tutorial blogger, dan tools otomatis buatan Aleo.

Aleo's Tube
<span class="spark"></span>
<span class="spark"></span>
<span class="spark"></span>
<span class="spark"></span>
<span class="spark"></span>
O YT IG FB Pin XT
<style type="text/css"> #welcome-message { position: fixed; top: 20%; left: 50%; transform: translateX(-50%); background: rgba(255,255,255,0.9); padding: 15px 30px; border-radius: 15px; font-family: Poppins,sans-serif; font-size: 1.1rem; color: #222; text-align: center; opacity: 0; z-index: 9999; animation: fadeInOut 6s ease-in-out forwards; box-shadow:0 3px 10px rgba(0,0,0,0.15); } @keyframes fadeInOut { 0% {opacity:0; transform:translate(-50%,-10%);} 15% {opacity:1; transform:translate(-50%,0);} 85% {opacity:1; transform:translate(-50%,0);} 100% {opacity:0; transform:translate(-50%,10%);} } body.dark-mode #welcome-message { background: rgba(20,20,30,0.85); color:#fafafa; } </style> <script type="text/javascript"> // { // Dark mode otomatis const hour = new Date().getHours(); if(hour >= 18 || hour < 6) document.body.classList.add("dark-mode"); // Multi-bahasa const userLang = (navigator.language || 'id').split('-')[0]; const messages = { id: ["Selamat Datang di blog saya!","Halo! Terima kasih sudah mampir!"], en: ["Welcome to my blog!","Hello! Thanks for visiting!"], es: ["ยกBienvenidos a mi blog!","Hola! Gracias por visitar!"], fr: ["Bienvenue sur mon blog!","Salut! Merci pour votre visite!"], de: ["Willkommen auf meinem Blog!","Hallo! Danke fรผr den Besuch!"], ja: ["็งใฎใƒ–ใƒญใ‚ฐใธใ‚ˆใ†ใ“ใ๏ผ","ใ“ใ‚“ใซใกใฏ! ใ”่จชๅ•ใ‚ใ‚ŠใŒใจใ†ใ”ใ–ใ„ใพใ™ใ€‚"], zh: ["ๆฌข่ฟŽๆฅๅˆฐๆˆ‘็š„ๅšๅฎข๏ผ","ไฝ ๅฅฝ! ๆ„Ÿ่ฐข่ฎฟ้—ฎ!"], ko: ["์ œ ๋ธ”๋กœ๊ทธ์— ์˜ค์‹  ๊ฒƒ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!","์•ˆ๋…•ํ•˜์„ธ์š”! ๋ฐฉ๋ฌธํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!"], tet: ["Bondia senhรณr no senhรณra sira!","Hola! Favor fahi blog hau!"] }; const greetArray = messages[userLang] || messages.id; const greeting = greetArray[Math.floor(Math.random() * greetArray.length)]; // tampilkan pesan const msgBox = document.createElement("div"); msgBox.id = "welcome-message"; msgBox.innerText = greeting; document.body.appendChild(msgBox); // suara otomatis setTimeout(()=>{ try{ const synth = window.speechSynthesis; const utter = new SpeechSynthesisUtterance(greeting); const langMap = { tet:'pt-PT' }; utter.lang = langMap[userLang] || (userLang+'-'+userLang.toUpperCase()); utter.pitch=1; utter.rate=1; utter.volume=1; synth.speak(utter); }catch(e){} },500); // hapus pesan setelah animasi setTimeout(()=> msgBox.remove(),6000); }); //]]]]> </script> <style> /* ๐ŸŽจ Gaya Tombol Profesional */ .btn { display: inline-block; margin: 8px; padding: 12px 22px; font-size: 16px; font-weight: 600; text-decoration: none; color: #fff; border-radius: 12px; transition: all 0.25s ease-in-out; background: linear-gradient(135deg, #007bff, #00bfff); box-shadow: 0 4px 10px rgba(0,0,0,0.2); } .btn:hover { transform: translateY(-2px); background: linear-gradient(135deg, #0056b3, #0099cc); box-shadow: 0 6px 14px rgba(0,0,0,0.25); } .btn:active { transform: scale(0.97); } @media (max-width: 600px) { .btn { display: block; width: 100%; text-align: center; box-sizing: border-box; } } </style> <script> document.addEventListener("DOMContentLoaded", function() { const links = document.querySelectorAll("a[href='javascript:void(0);'][onclick*='trackAffiliate']"); links.forEach(a => { const onclickAttr = a.getAttribute("onclick"); const match = onclickAttr.match(/trackAffiliate\(['"]([^'"]+)['"],['"]([^'"]+)['"]\)/); if (match) { const productName = match[1]; const targetUrl = match[2]; // Ubah jadi SEO-friendly link a.setAttribute("href", targetUrl); a.setAttribute("onclick", `trackAffiliate('${productName}', this.href); return false;`); a.setAttribute("rel", "nofollow noopener noreferrer"); // Tambah kelas tombol (kalau belum ada) if (!a.classList.contains("btn")) a.classList.add("btn"); console.log("โœ… Diperbaiki:", productName, "โ†’", targetUrl); } }); }); </script> <script> function trackAffiliate(productName, url) { console.log("๐Ÿ“ˆ Tracking:", productName); // kamu bisa tambahkan pelacakan custom di sini ( <script async="async" src="https://www.googletagmanager.com/gtag/js?id=G-71BR09BJ1R"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-71BR09BJ1R'); </script>

, <b:if cond='data:blog.pageType != "preview"'>

<script type='text/javascript'> // </script> , dll) window.location.href = url; // redirect ke link tujuan }

๐Ÿš€ Skor Kecepatan Blog

Mobile
Memuat...
Desktop
Memuat...
๐Ÿ”— Lihat detail di PageSpeed Insights
<script> (async function(){ const blogUrl = 'https://aleos-tube-daily-vlog-anak-rantau.blogspot.com'; async function fetchScore(strategy){ const api = `https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=${blogUrl}&strategy=${strategy}`; const res = await fetch(api); const data = await res.json(); return Math.round(data.lighthouseResult.categories.performance.score * 100); } function colorFor(score){ if(score >= 90) return '#00c853'; // Hijau if(score >= 50) return '#ffb300'; // Oranye return '#d50000'; // Merah } async function updateUI(device){ const score = await fetchScore(device); const fill = document.getElementById(device + 'Fill'); const bar = document.getElementById(device + 'Bar'); const text = document.getElementById(device + 'Score'); fill.style.width = score + '%'; fill.style.background = colorFor(score); text.innerHTML = `${score}/100 (${device})`; text.style.color = colorFor(score); } updateUI('mobile'); updateUI('desktop'); })(); </script>

๐Ÿš€ Skor Kecepatan Blog

Mobile
Memuat...
Desktop
Memuat...
๐Ÿ”— Lihat detail di PageSpeed Insights
<script> (async function(){ const blogUrl = 'https://aleos-tube-daily-vlog-anak-rantau.blogspot.com'; async function fetchScore(strategy){ const api = `https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=${blogUrl}&strategy=${strategy}`; const res = await fetch(api); const data = await res.json(); return Math.round(data.lighthouseResult.categories.performance.score * 100); } function colorFor(score){ if(score >= 90) return '#00c853'; // Hijau if(score >= 50) return '#ffb300'; // Oranye return '#d50000'; // Merah } async function updateUI(device){ const score = await fetchScore(device); const fill = document.getElementById(device + 'Fill'); const bar = document.getElementById(device + 'Bar'); const text = document.getElementById(device + 'Score'); fill.style.width = score + '%'; fill.style.background = colorFor(score); text.innerHTML = `${score}/100 (${device})`; text.style.color = colorFor(score); } updateUI('mobile'); updateUI('desktop'); })(); </script>

<!doctype html>

SEO Status โ€” Aleo's Tube

<style> body{font-family:Segoe UI, Roboto, Arial; background:#f6f8fb; color:#0b1220; padding:28px;} .card{background:white;border-radius:12px;padding:18px;box-shadow:0 8px 28px rgba(13,41,77,0.06);max-width:920px;margin:0 auto;} h1{margin:0 0 12px;font-size:20px} .row{display:flex;gap:12px;align-items:center;margin-top:10px;flex-wrap:wrap} .badge{padding:8px 12px;border-radius:10px;background:linear-gradient(90deg,#ff6b00,#0077ff);color:#fff;font-weight:700} button{padding:8px 12px;border-radius:10px;border:none;background:#0077ff;color:#fff;cursor:pointer;font-weight:700} .muted{color:#5b6782;font-size:13px} pre{background:#0b1220;color:#dff4ff;padding:12px;border-radius:8px;overflow:auto} </style>

SEO Status โ€” Aleo's Tube

Halaman ini menampilkan status ping sitemap & consent lokal. Semua tindakan bersifat client-side dan tidak memerlukan akses server.
<div class="row" style="margin-top:18px">
  <div>
    <div class="muted">Consent analytics</div>
    <div id="consentStatus" class="badge">โ€”</div>
  </div>

  <div>
    <div class="muted">Last auto-ping</div>
    <div id="lastPing" style="padding:8px 12px;border-radius:8px;background:#f1f5f9;color:#0b1220;font-weight:700">โ€”</div>
  </div>

  <div style="margin-left:auto; display:flex; gap:8px;">
    <button id="manualPing">Ping Sekarang</button>
    <button id="clearPing" style="background:#ff4d4f">Reset</button>
  </div>
</div>

<section style="margin-top:18px;">
  <h3 style="margin:8px 0">Log Ringkas</h3>
  <div class="muted">Log di bawah hanya untuk debugging &amp; tersimpan sementara di sessionStorage.</div>
  <pre id="logArea" style="height:160px">โ€”</pre>
</section>

<section style="margin-top:16px;">
  <small class="muted">Catatan: Ping dilakukan via <code>fetch</code> ke endpoint publik (Google/Bing) dengan mode <code>no-cors</code>. Browser tidak menampilkan respons yang bisa dibaca โ€” operasi bersifat "fire-and-forget".</small>
</section>
<script> (function(){ var pingKey = 'gt_ping_v10_1'; var consentKey = 'gt_accept_v10_1'; var logArea = document.getElementById('logArea'); function appendLog(msg){ try { var now = new Date().toLocaleString(); var prev = sessionStorage.getItem('aleos_seo_log') || ''; var line = '['+ now +'] ' + msg + '\\n'; prev = line + prev; sessionStorage.setItem('aleos_seo_log', prev.slice(0, 5000)); logArea.textContent = prev || 'โ€”'; } catch(e){ console.warn(e); } } function updateUI(){ var last = localStorage.getItem(pingKey); document.getElementById('lastPing').textContent = last ? new Date(parseInt(last,10)).toLocaleString() : 'Belum pernah'; document.getElementById('consentStatus').textContent = localStorage.getItem(consentKey) ? 'Diterima' : 'Belum'; } function pingNow(){ try { var sitemap = location.origin + '/sitemap.xml'; appendLog('Mencoba ping Google & Bing untuk: ' + sitemap); // Google fetch('https://www.google.com/ping?sitemap=' + encodeURIComponent(sitemap), {mode:'no-cors'}).then(function(){ appendLog('Ping Google dikirim'); }).catch(function(e){ appendLog('Ping Google gagal'); }); // Bing fetch('https://www.bing.com/ping?sitemap=' + encodeURIComponent(sitemap), {mode:'no-cors'}).then(function(){ appendLog('Ping Bing dikirim'); }).catch(function(e){ appendLog('Ping Bing gagal'); }); localStorage.setItem(pingKey, String(Date.now())); updateUI(); } catch(e){ appendLog('Error ping: ' + (e && e.message ? e.message : e)); } } document.getElementById('manualPing').addEventListener('click', function(){ pingNow(); }, {passive:true}); document.getElementById('clearPing').addEventListener('click', function(){ localStorage.removeItem(pingKey); sessionStorage.removeItem('aleos_seo_log'); logArea.textContent = 'โ€”'; updateUI(); }, {passive:true}); // init try { logArea.textContent = sessionStorage.getItem('aleos_seo_log') || 'โ€”'; updateUI(); appendLog('Dashboard dibuka'); } catch(e){ console.warn(e); } })(); </script>

</!doctype>]]></b:widget-setting> </b:widget-settings> <b:includable id='main'>

<b:if cond='data:title != ""'>

data:title/

</b:if>

<b:include name='quickedit'/> </b:includable> </b:widget> </b:section> <b:section class='tabs' id='crosscol-overflow' name='Cross-Column 2' showaddelement='no'/>

<div class='main-outer'>
<div class='main-cap-top cap-top'>
  <div class='cap-left'/>
  <div class='cap-right'/>
</div>

<div class='fauxborder-left main-fauxborder-left'>
<div class='fauxborder-right main-fauxborder-right'/>
<div class='region-inner main-inner'>

  <div class='columns fauxcolumns'>

    <div class='fauxcolumn-outer fauxcolumn-center-outer'>
    <div class='cap-top'>
      <div class='cap-left'/>
      <div class='cap-right'/>
    </div>
    <div class='fauxborder-left'>
    <div class='fauxborder-right'/>
    <div class='fauxcolumn-inner'>
    </div>
    </div>
    <div class='cap-bottom'>
      <div class='cap-left'/>
      <div class='cap-right'/>
    </div>
    </div>

    <div class='fauxcolumn-outer fauxcolumn-left-outer'>
    <div class='cap-top'>
      <div class='cap-left'/>
      <div class='cap-right'/>
    </div>
    <div class='fauxborder-left'>
    <div class='fauxborder-right'/>
    <div class='fauxcolumn-inner'>
    </div>
    </div>
    <div class='cap-bottom'>
      <div class='cap-left'/>
      <div class='cap-right'/>
    </div>
    </div>

    <div class='fauxcolumn-outer fauxcolumn-right-outer'>
    <div class='cap-top'>
      <div class='cap-left'/>
      <div class='cap-right'/>
    </div>
    <div class='fauxborder-left'>
    <div class='fauxborder-right'/>
    <div class='fauxcolumn-inner'>
    </div>
    </div>
    <div class='cap-bottom'>
      <div class='cap-left'/>
      <div class='cap-right'/>
    </div>
    </div>

    <!-- corrects IE6 width calculation -->
    <div class='columns-inner'>

    <div class='column-center-outer'>
    <div class='column-center-inner'>
      <b:section class='main' id='main' name='Main' showaddelement='no'>
        <b:widget id='Blog1' locked='false' title='Postingan Blog' type='Blog' version='1'>
          <b:widget-settings>
            <b:widget-setting name='commentLabel'>comments</b:widget-setting>
            <b:widget-setting name='showShareButtons'>true</b:widget-setting>
            <b:widget-setting name='authorLabel'>By Aleo</b:widget-setting>
            <b:widget-setting name='style.unittype'>TextAndImage</b:widget-setting>
            <b:widget-setting name='timestampLabel'>at</b:widget-setting>
            <b:widget-setting name='reactionsLabel'/>
            <b:widget-setting name='showAuthorProfile'>true</b:widget-setting>
            <b:widget-setting name='style.layout'>1x1</b:widget-setting>
            <b:widget-setting name='showLocation'>false</b:widget-setting>
            <b:widget-setting name='showTimestamp'>true</b:widget-setting>
            <b:widget-setting name='postsPerAd'>1</b:widget-setting>
            <b:widget-setting name='style.bordercolor'>#ffffff</b:widget-setting>
            <b:widget-setting name='showDateHeader'>true</b:widget-setting>
            <b:widget-setting name='style.textcolor'>#ffffff</b:widget-setting>
            <b:widget-setting name='showCommentLink'>true</b:widget-setting>
            <b:widget-setting name='style.urlcolor'>#ffffff</b:widget-setting>
            <b:widget-setting name='postLocationLabel'>Location: Indonesia</b:widget-setting>
            <b:widget-setting name='showAuthor'>true</b:widget-setting>
            <b:widget-setting name='style.linkcolor'>#ffffff</b:widget-setting>
            <b:widget-setting name='style.bgcolor'>#ffffff</b:widget-setting>
            <b:widget-setting name='showLabels'>false</b:widget-setting>
            <b:widget-setting name='postLabelsLabel'>Labels: Daily Vlog Anak Rantau Indonesia,</b:widget-setting>
            <b:widget-setting name='showBacklinks'>false</b:widget-setting>
            <b:widget-setting name='showInlineAds'>false</b:widget-setting>
            <b:widget-setting name='showReactions'>false</b:widget-setting>
          </b:widget-settings>
          <b:includable id='main' var='top'>

<b:if cond='!data:mobile'>

  <b:include data='top' name='status-message'/>

  <b:loop values='data:posts' var='post'>
    <b:if cond='data:post.isDateStart and not data:post.isFirstPost'>
      &lt;/div&gt;&lt;/div&gt;
    </b:if>
    <b:if cond='data:post.isDateStart'>
      &lt;div class=&quot;date-outer&quot;&gt;
    </b:if>
    <b:if cond='data:post.dateHeader'>
      <h2 class='date-header'><span><data:post.dateHeader/></span></h2>
    </b:if>
    <b:if cond='data:post.isDateStart'>
      &lt;div class=&quot;date-posts&quot;&gt;
    </b:if>
    <div class='post-outer'>
      <b:include data='post' name='post'/>
      <b:include cond='data:blog.pageType in {&quot;static_page&quot;,&quot;item&quot;}' data='post' name='comment_picker'/>
    </div>

    <!-- Ad -->
    <b:if cond='data:post.includeAd'>
      <div class='inline-ad'>
        <data:adCode/>
      </div>
    </b:if>
  </b:loop>
  <b:if cond='data:numPosts != 0'>
    &lt;/div&gt;&lt;/div&gt;
  </b:if>
</div>

<!-- navigation -->
<b:include name='nextprev'/>

<!-- feed links -->
<b:include name='feedLinks'/>

<b:else/> <b:include name='mobile-main'/> </b:if> </b:includable> <b:includable id='backlinkDeleteIcon' var='backlink'/> <b:includable id='backlinks' var='post'/> <b:includable id='comment-form' var='post'>

:
  <b:if cond='data:post.commentPagingRequired'>
    <span class='paging-control-container'>
      <b:if cond='data:post.hasOlderLinks'>
        <a expr:class='data:post.oldLinkClass' expr:href='data:post.oldestLinkUrl'><data:post.oldestLinkText/></a>
          &#160;
        <a expr:class='data:post.oldLinkClass' expr:href='data:post.olderLinkUrl'><data:post.olderLinkText/></a>
          &#160;
      </b:if>

      <data:post.commentRangeText/>

      <b:if cond='data:post.hasNewerLinks'>
        &#160;
        <a expr:class='data:post.newLinkClass' expr:href='data:post.newerLinkUrl'><data:post.newerLinkText/></a>
        &#160;
        <a expr:class='data:post.newLinkClass' expr:href='data:post.newestLinkUrl'><data:post.newestLinkText/></a>
      </b:if>
    </span>
  </b:if>

  <div expr:id='data:widget.instanceId + &quot;_comments-block-wrapper&quot;'>
    <dl expr:class='data:post.avatarIndentClass' id='comments-block'>
      <b:loop values='data:post.comments' var='comment'>
        <dt expr:class='&quot;comment-author &quot; + data:comment.authorClass' expr:id='data:comment.anchorName'>
          <b:if cond='data:comment.favicon'>
            <img expr:src='data:comment.favicon' height='16px' style='margin-bottom:-2px;' width='16px'/>
          </b:if>
          <a expr:name='data:comment.anchorName'/>
          <b:if cond='data:blog.enabledCommentProfileImages'>
            <data:comment.authorAvatarImage/>
          </b:if>
          <b:if cond='data:comment.authorUrl'>
            <a expr:href='data:comment.authorUrl' rel='nofollow'><data:comment.author/></a>
          <b:else/>
            <data:comment.author/>
          </b:if>
          <data:commentPostedByMsg/>
        </dt>
        <dd class='comment-body' expr:id='data:widget.instanceId + data:comment.cmtBodyIdPostfix'>
          <b:if cond='data:comment.isDeleted'>
            <span class='deleted-comment'><data:comment.body/></span>
          <b:else/>
            <p>
              <data:comment.body/>
            </p>
          </b:if>
        </dd>
        <dd class='comment-footer'>
          <span class='comment-timestamp'>
            <a expr:href='data:comment.url' title='comment permalink'>
              <data:comment.timestamp/>
            </a>
            <b:include data='comment' name='commentDeleteIcon'/>
          </span>
        </dd>
      </b:loop>
    </dl>
  </div>

  <b:if cond='data:post.commentPagingRequired'>
    <span class='paging-control-container'>
      <a expr:class='data:post.oldLinkClass' expr:href='data:post.oldestLinkUrl'>
        <data:post.oldestLinkText/>
      </a>
      <a expr:class='data:post.oldLinkClass' expr:href='data:post.olderLinkUrl'>
        <data:post.olderLinkText/>
      </a>
      &#160;
      <data:post.commentRangeText/>
      &#160;
      <a expr:class='data:post.newLinkClass' expr:href='data:post.newerLinkUrl'>
        <data:post.newerLinkText/>
      </a>
      <a expr:class='data:post.newLinkClass' expr:href='data:post.newestLinkUrl'>
        <data:post.newestLinkText/>
      </a>
    </span>
  </b:if>

  <p class='comment-footer'>
    <b:if cond='data:post.embedCommentForm'>
      <b:if cond='data:post.allowNewComments'>
        <b:include data='post' name='comment-form'/>
      <b:else/>
        <data:post.noNewCommentsText/>
      </b:if>
    <b:elseif cond='data:post.allowComments'/>
      <a expr:href='data:post.addCommentUrl' expr:onclick='data:post.addCommentOnclick'><data:postCommentMsg/></a>
    </b:if>
  </p>
</b:if>
<b:if cond='data:showCmtPopup'>
  <div id='comment-popup'>
    <iframe allowtransparency='true' frameborder='0' id='comment-actions' name='comment-actions' scrolling='no'>
    </iframe>
  </div>
</b:if>

<b:else/>

<b:loop values='data:posts' var='post'> <b:include cond='data:post.allowComments and data:post.feedLinks' data='post.feedLinks' name='feedLinksBody'/> </b:loop>
</b:if> </b:includable> <b:includable id='feedLinksBody' var='links'>

()
<div class='mobile-post-outer'>
  <a expr:href='data:post.url'>
    <h3 class='mobile-index-title entry-title' itemprop='name'>
      <data:post.title/>
    </h3>

    <div class='mobile-index-arrow'>&amp;rsaquo;</div>

    <div class='mobile-index-contents'>
      <b:if cond='data:post.thumbnailUrl'>
        <div class='mobile-index-thumbnail'>
          <div class='Image'>
            <img expr:src='data:post.thumbnailUrl'/>
          </div>
        </div>
      </b:if>

      <div class='post-body'>
        <b:if cond='data:post.snippet'><data:post.snippet/></b:if>
      </div>
    </div>

    <div style='clear: both;'/>
  </a>

  <div class='mobile-index-comment'>
    <b:include cond='data:blog.pageType != &quot;static_page&quot;                          and data:post.allowComments                          and data:post.numComments != 0' data='post' name='comment_count_picker'/>
  </div>
</div>
  <b:include data='top' name='status-message'/>

  <b:if cond='data:blog.pageType == &quot;index&quot;'>
    <b:loop values='data:posts' var='post'>
      <b:include data='post' name='mobile-index-post'/>
    </b:loop>
  <b:else/>
    <b:loop values='data:posts' var='post'>
      <b:include data='post' name='mobile-post'/>
    </b:loop>
  </b:if>
</div>

<b:include name='mobile-nextprev'/> </b:includable> <b:includable id='mobile-nextprev'>

<b:if cond='data:olderPageUrl'>
  <div class='mobile-link-button' id='blog-pager-older-link'>
  <a class='blog-pager-older-link' expr:href='data:olderPageUrl' expr:id='data:widget.instanceId + &quot;_blog-pager-older-link&quot;' expr:title='data:olderPageTitle'>&amp;rsaquo;</a>
  </div>
</b:if>

<div class='mobile-link-button' id='blog-pager-home-link'>
<a class='home-link' expr:href='data:blog.homepageUrl'><data:homeMsg/></a>
</div>

<div class='mobile-desktop-link'>
  <a class='home-link' expr:href='data:desktopLinkUrl'><data:desktopLinkMsg/></a>
</div>

    <div class='post hentry uncustomized-post-template' itemscope='itemscope' itemtype='http://schema.org/BlogPosting'>
      <b:if cond='data:post.thumbnailUrl'>
        <meta expr:content='data:post.thumbnailUrl' itemprop='image_url'/>
      </b:if>
      <meta expr:content='data:blog.blogId' itemprop='blogId'/>
      <meta expr:content='data:post.id' itemprop='postId'/>

      <a expr:name='data:post.id'/>
      <b:if cond='data:post.title'>
        <h3 class='post-title entry-title' itemprop='name'>
          <b:if cond='data:post.link'>
            <a expr:href='data:post.link'><data:post.title/></a>
          <b:elseif cond='data:post.url and data:blog.url != data:post.url'/>
            <a expr:href='data:post.url'><data:post.title/></a>
          <b:else/>
            <data:post.title/>
          </b:if>
        </h3>
      </b:if>

      <div class='post-header'>
        <div class='post-header-line-1'/>
      </div>

      <div class='post-body entry-content' expr:id='&quot;post-body-&quot; + data:post.id' itemprop='articleBody'>
        <data:post.body/>
        <div style='clear: both;'/> <!-- clear for photos floats -->
      </div>            

      <div class='post-footer'>
        <div class='post-footer-line post-footer-line-1'>
          <span class='post-author vcard'>
            <b:if cond='data:top.showAuthor'>
              <b:if cond='data:post.authorProfileUrl'>
                <span class='fn' itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'>
                  <meta expr:content='data:post.authorProfileUrl' itemprop='url'/>
                  <a expr:href='data:post.authorProfileUrl' rel='author' title='author profile'>
                    <span itemprop='name'><data:post.author/></span>
                  </a>
                </span>
              <b:else/>
                <span class='fn' itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'>
                  <span itemprop='name'><data:post.author/></span>
                </span>
              </b:if>
            </b:if>
          </span>

          <span class='post-timestamp'>
            <b:if cond='data:top.showTimestamp'>
              <data:top.timestampLabel/>
              <b:if cond='data:post.url'>
                <meta expr:content='data:post.url.canonical' itemprop='url'/>
                <a class='timestamp-link' expr:href='data:post.url' rel='bookmark' title='permanent link'><abbr class='published' expr:title='data:post.timestampISO8601' itemprop='datePublished'><data:post.timestamp/></abbr></a>
              </b:if>
            </b:if>
          </span>

          <span class='post-comment-link'>
            <b:include cond='data:blog.pageType not in {&quot;item&quot;,&quot;static_page&quot;}                                  and data:post.allowComments' data='post' name='comment_count_picker'/>
          </span>
        </div>

        <div class='post-footer-line post-footer-line-2'>
          <b:if cond='data:top.showMobileShare'>
            <div class='mobile-link-button goog-inline-block' id='mobile-share-button'>
              <a href='javascript:void(0);'><data:shareMsg/></a>
            </div>
          </b:if>
        </div>

      </div>
    </div>

    <b:include cond='data:blog.pageType in {&quot;static_page&quot;,&quot;item&quot;}' data='post' name='comment_picker'/>
  </div>
</div>
<b:if cond='data:olderPageUrl'>
  <span id='blog-pager-older-link'>
  <a class='blog-pager-older-link' expr:href='data:olderPageUrl' expr:id='data:widget.instanceId + &quot;_blog-pager-older-link&quot;' expr:title='data:olderPageTitle'><data:olderPageTitle/></a>
  </span>
</b:if>

<a class='home-link' expr:href='data:blog.homepageUrl'><data:homeMsg/></a>

<b:if cond='data:mobileLinkUrl'>
  <div class='blog-mobile-link'>
    <a expr:href='data:mobileLinkUrl'><data:mobileLinkMsg/></a>
  </div>
</b:if>
<a expr:name='data:post.id'/>
<b:if cond='data:post.title'>
  <h3 class='post-title entry-title' itemprop='name'>
  <b:if cond='data:post.link or (data:post.url and data:blog.url != data:post.url)'>
    <a expr:href='data:post.link ? data:post.link : data:post.url'><data:post.title/></a>
  <b:else/>
    <data:post.title/>
  </b:if>
  </h3>
</b:if>

<div class='post-header'>
<div class='post-header-line-1'/>
</div>

<!-- Then use the post body as the schema.org description, for good G+/FB snippeting. -->
<div class='post-body entry-content' expr:id='&quot;post-body-&quot; + data:post.id' expr:itemprop='(data:blog.metaDescription ? &quot;&quot; : &quot;description &quot;) + &quot;articleBody&quot;'>
  <data:post.body/>
  <div style='clear: both;'/> <!-- clear for photos floats -->
</div>

<b:if cond='data:post.hasJumpLink'>
  <div class='jump-link'>
    <a expr:href='data:post.url + &quot;#more&quot;' expr:title='data:post.title'><data:post.jumpText/></a>
  </div>
</b:if>

<div class='post-footer'>
<div class='post-footer-line post-footer-line-1'>
  <span class='post-author vcard'>
    <b:if cond='data:top.showAuthor'>
      <data:top.authorLabel/>
        <b:if cond='data:post.authorProfileUrl'>
          <span class='fn' itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'>
            <meta expr:content='data:post.authorProfileUrl' itemprop='url'/>
            <a class='g-profile' expr:href='data:post.authorProfileUrl' rel='author' title='author profile'>
              <span itemprop='name'><data:post.author/></span>
            </a>
          </span>
        <b:else/>
          <span class='fn' itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'>
            <span itemprop='name'><data:post.author/></span>
          </span>
        </b:if>
    </b:if>
  </span>

  <span class='post-timestamp'>
    <b:if cond='data:top.showTimestamp'>
      <data:top.timestampLabel/>
      <b:if cond='data:post.url'>
        <meta expr:content='data:post.url.canonical' itemprop='url'/>
        <a class='timestamp-link' expr:href='data:post.url' rel='bookmark' title='permanent link'><abbr class='published' expr:title='data:post.timestampISO8601' itemprop='datePublished'><data:post.timestamp/></abbr></a>
      </b:if>
    </b:if>
  </span>

  <span class='post-comment-link'>
    <b:include cond='data:blog.pageType not in {&quot;item&quot;,&quot;static_page&quot;}                          and data:post.allowComments' data='post' name='comment_count_picker'/>
  </span>

  <span class='post-icons'>
    <!-- email post links -->
    <b:if cond='data:post.emailPostUrl'>
      <span class='item-action'>
      <a expr:href='data:post.emailPostUrl' expr:title='data:top.emailPostMsg'>
        <img alt='' class='icon-action' height='13' src='https://resources.blogblog.com/img/icon18_email.gif' width='18'/>
      </a>
      </span>
    </b:if>

    <!-- quickedit pencil -->
    <b:include data='post' name='postQuickEdit'/>
  </span>

  <!-- share buttons -->
  <div class='post-share-buttons goog-inline-block'>
    <b:include cond='data:post.sharePostUrl' data='post' name='shareButtons'/>
  </div>

  </div>

  <div class='post-footer-line post-footer-line-2'>
  <span class='post-labels'>
    <b:if cond='data:top.showPostLabels and data:post.labels'>
      <data:postLabelsLabel/>
      <b:loop values='data:post.labels' var='label'>
        <a expr:href='data:label.url' rel='tag'><data:label.name/></a><b:if cond='not data:label.isLast'>,</b:if>
      </b:loop>
    </b:if>
  </span>
  </div>

  <div class='post-footer-line post-footer-line-3'>
  <span class='post-location'>
    <b:if cond='data:top.showLocation and data:post.location'>
      <data:postLocationLabel/>
      <a expr:href='data:post.location.mapsUrl' target='_blank'><data:post.location.name/></a>
    </b:if>
  </span>
  </div>
  <b:if cond='data:post.authorAboutMe'>
    <div class='author-profile' itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'>
      <b:if cond='data:post.authorPhoto.url'>
        <img expr:src='data:post.authorPhoto.url' itemprop='image' width='50px'/>
      </b:if>
      <div>
        <a class='g-profile' expr:href='data:post.authorProfileUrl' itemprop='url' rel='author' title='author profile'>
          <span itemprop='name'><data:post.author/></span>
        </a>
      </div>
      <span itemprop='description'><data:post.authorAboutMe/></span>
    </div>
  </b:if>
</div>
<script async='async' expr:src='data:post.commentSrc' type='text/javascript'/> <script type='text/javascript'> (function() { var items = ; var msgs = ; var config = ; // 0) { cursor = parseInt(items[items.length - 1].timestamp) + 1; } var bodyFromEntry = function(entry) { var text = (entry && ((entry.content && entry.content.$t) || (entry.summary && entry.summary.$t))) || ''; if (entry && entry.gd$extendedProperty) { for (var k in entry.gd$extendedProperty) { if (entry.gd$extendedProperty[k].name == 'blogger.contentRemoved') { return '' + text + ''; } } } return text; } var parse = function(data) { cursor = null; var comments = []; if (data && data.feed && data.feed.entry) { for (var i = 0, entry; entry = data.feed.entry[i]; i++) { var comment = {}; // comment ID, parsed out of the original id format var id = /blog-(\d+).post-(\d+)/.exec(entry.id.$t); comment.id = id ? id[2] : null; comment.body = bodyFromEntry(entry); comment.timestamp = Date.parse(entry.published.$t) + ''; if (entry.author && entry.author.constructor === Array) { var auth = entry.author[0]; if (auth) { comment.author = { name: (auth.name ? auth.name.$t : undefined), profileUrl: (auth.uri ? auth.uri.$t : undefined), avatarUrl: (auth.gd$image ? auth.gd$image.src : undefined) }; } } if (entry.link) { if (entry.link[2]) { comment.link = comment.permalink = entry.link[2].href; } if (entry.link[3]) { var pid = /.*comments\/default\/(\d+)\?.*/.exec(entry.link[3].href); if (pid && pid[1]) { comment.parentId = pid[1]; } } } comment.deleteclass = 'item-control blog-admin'; if (entry.gd$extendedProperty) { for (var k in entry.gd$extendedProperty) { if (entry.gd$extendedProperty[k].name == 'blogger.itemClass') { comment.deleteclass += ' ' + entry.gd$extendedProperty[k].value; } else if (entry.gd$extendedProperty[k].name == 'blogger.displayTime') { comment.displayTime = entry.gd$extendedProperty[k].value; } } } comments.push(comment); } } return comments; }; var paginator = function(callback) { if (hasMore()) { var url = config.feed + '?alt=json&v=2&orderby=published&reverse=false&max-results=50'; if (cursor) { url += '&published-min=' + new Date(cursor).toISOString(); } window.bloggercomments = function(data) { var parsed = parse(data); cursor = parsed.length < 50 ? null : parseInt(parsed[parsed.length - 1].timestamp) + 1 callback(parsed); window.bloggercomments = null; } url += '&callback=bloggercomments'; var script = document.createElement('script'); script.type = 'text/javascript'; script.src = url; document.getElementsByTagName('head')[0].appendChild(script); } }; var hasMore = function() { return !!cursor; }; var getMeta = function(key, comment) { if ('iswriter' == key) { var matches = !!comment.author && comment.author.name == config.authorName && comment.author.profileUrl == config.authorUrl; return matches ? 'true' : ''; } else if ('deletelink' == key) { return config.baseUri + '/comment/delete/' + config.blogId + '/' + comment.id; } else if ('deleteclass' == key) { return comment.deleteclass; } return ''; }; var replybox = null; var replyUrlParts = null; var replyParent = undefined; var onReply = function(commentId, domId) { if (replybox == null) { // lazily cache replybox, and adjust to suit this style: replybox = document.getElementById('comment-editor'); if (replybox != null) { replybox.height = '250px'; replybox.style.display = 'block'; replyUrlParts = replybox.src.split('#'); } } if (replybox && (commentId !== replyParent)) { replybox.src = ''; document.getElementById(domId).insertBefore(replybox, null); replybox.src = replyUrlParts[0] + (commentId ? '&parentID=' + commentId : '') + '#' + replyUrlParts[1]; replyParent = commentId; } }; var hash = (window.location.hash || '#').substring(1); var startThread, targetComment; if (/^comment-form_/.test(hash)) { startThread = hash.substring('comment-form_'.length); } else if (/^c[0-9]+$/.test(hash)) { targetComment = hash.substring(1); } // Configure commenting API: var configJso = { 'maxDepth': config.maxThreadDepth }; var provider = { 'id': config.postId, 'data': items, 'loadNext': paginator, 'hasMore': hasMore, 'getMeta': getMeta, 'onReply': onReply, 'rendered': true, 'initComment': targetComment, 'initReplyThread': startThread, 'config': configJso, 'messages': msgs }; var render = function() { if (window.goog && window.goog.comments) { var holder = document.getElementById('comment-holder'); window.goog.comments.render(holder, provider); } }; // render now, or queue to render when library loads: if (window.goog && window.goog.comments) { render(); } else { window.goog = window.goog || {}; window.goog.comments = window.goog.comments || {}; window.goog.comments.loadQueue = window.goog.comments.loadQueue || []; window.goog.comments.loadQueue.push(render); } })(); // ]]> </script>

</b:includable> <b:includable id='threaded_comments' var='post'>

true false 0 true true

<b:include name='quickedit'/> </b:includable> <b:includable id='content'>

<style type='text/css'> .image { width: 100%; } </style>

</b:includable> </b:widget> <b:widget id='PopularPosts1' locked='false' title='' type='PopularPosts'> <b:widget-settings> <b:widget-setting name='numItemsToShow'>5</b:widget-setting> <b:widget-setting name='showThumbnails'>false</b:widget-setting> <b:widget-setting name='showSnippets'>true</b:widget-setting> <b:widget-setting name='timeRange'>ALL_TIME</b:widget-setting> </b:widget-settings> <b:includable id='main'> <b:if cond='data:title != ""'>

data:title/

</b:if>

    <div class='column-left-outer'>
    <div class='column-left-inner'>
      <aside>
      <macro:include id='main-column-left-sections' name='sections'>
        <macro:param default='0' name='num' value='0'/>
        <macro:param default='sidebar-left' name='idPrefix'/>
        <macro:param default='sidebar' name='class'/>
        <macro:param default='true' name='includeBottom'/>
      </macro:include>
      </aside>
    </div>
    </div>

    <div class='column-right-outer'>
    <div class='column-right-inner'>
      <aside>
      <macro:include id='main-column-right-sections' name='sections'>
        <macro:param default='2' name='num' value='0'/>
        <macro:param default='sidebar-right' name='idPrefix'/>
        <macro:param default='sidebar' name='class'/>
        <macro:param default='true' name='includeBottom'/>
      </macro:include>
      </aside>
    </div>
    </div>

    </div>

    <div style='clear: both'/>
  <!-- columns -->
  </div>

<!-- main -->
</div>
</div>
<div class='main-cap-bottom cap-bottom'>
  <div class='cap-left'/>
  <div class='cap-right'/>
</div>
</div>

<footer>
<div class='footer-outer'>
<div class='footer-cap-top cap-top'>
  <div class='cap-left'/>
  <div class='cap-right'/>
</div>
<div class='fauxborder-left footer-fauxborder-left'>
<div class='fauxborder-right footer-fauxborder-right'/>
<div class='region-inner footer-inner'>
  <macro:include id='footer-sections' name='sections'>
    <macro:param default='2' name='num' value='3'/>
    <macro:param default='footer' name='idPrefix'/>
    <macro:param default='foot' name='class'/>
    <macro:param default='false' name='includeBottom'/>
  </macro:include>
  <!-- outside of the include in order to lock Attribution widget -->
  <b:section class='foot' id='footer-3' name='Footer' showaddelement='no'>
    <b:widget id='Attribution1' locked='false' title='' type='Attribution'>
      <b:widget-settings>
        <b:widget-setting name='copyright'><![CDATA[ยฉ 2025 Aleo&#39;s Tube. All Rights Reserved.]]></b:widget-setting>
      </b:widget-settings>
      <b:includable id='main'>
<div class='widget-content' style='text-align: center;'>
  <b:if cond='data:attribution != &quot;&quot;'>
   <data:attribution/>
  </b:if>
</div>

<b:include name='quickedit'/>

</b:includable> </b:widget> </b:section>

<script type='text/javascript'> window.setTimeout(function() { document.body.className = document.body.className.replace('loading', ''); }, 10); </script> <iframe height='0' src='https://www.googletagmanager.com/ns.html?id=GTM-TRBCNSHZ&env=1&auth=XlVCJiNF15b9I-YIWjI4Dg' style='display:none;visibility:hidden' width='0'/> <iframe height='0' src='https://www.googletagmanager.com/ns.html?id=GTM-WR546M4D' style='display:none;visibility:hidden' width='0'/> <iframe height='0' src='https://www.googletagmanager.com/ns.html?id=GTM-MKB9TPDR' style='display:none;visibility:hidden' width='0'/> <script async="async" src="https://www.googletagmanager.com/gtag/js?id=G-2F6SD6VRNM"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config','G-2F6SD6VRNM'); </script> <script> (function(){ const consentKey='gt_accept_v10_3'; const pingKey='gt_ping_v10_3'; const sitemap=location.origin+'/sitemap.xml'; function runPing(){ try{ const now=Date.now(); const last=localStorage.getItem(pingKey); if(!last||(now-parseInt(last,10)>86400000)){ fetch('https://www.google.com/ping?sitemap='+encodeURIComponent(sitemap),{mode:'no-cors'}); fetch('https://www.bing.com/ping?sitemap='+encodeURIComponent(sitemap),{mode:'no-cors'}); localStorage.setItem(pingKey,String(now)); console.log('[SEO MAX v10.3] Ping sent.'); } }catch(e){console.warn('Ping error',e);} } if(!localStorage.getItem(consentKey)){ const box=document.createElement('div'); box.id='seoConsent'; box.innerHTML='
Aktifkan SEO MAX v10.3
Izinkan analytics & ping otomatis
Terima
'; document.body.appendChild(box); document.getElementById('seoAccept').addEventListener('click',()=>{ localStorage.setItem(consentKey,'1'); document.getElementById('seoConsent').remove(); runPing(); }); }else{ runPing(); } })(); </script> <script type="application/ld+json"> { "@context": "https://schema.org", "@graph": [ { "@type": "WebSite", "@id": "https://aleos-tube-daily-vlog-anak-rantau.blogspot.com/#website", "url": "https://aleos-tube-daily-vlog-anak-rantau.blogspot.com/", "name": "Aleoโ€™s Tube Daily Vlog Anak Rantau", "description": "Kisah, pengalaman, dan keseharian anak rantau โ€“ Aleoโ€™s Tube Daily Vlog.", "publisher": { "@id": "#organization" }, "inLanguage": "id-ID", "potentialAction": { "@type": "SearchAction", "target": "https://aleos-tube-daily-vlog-anak-rantau.blogspot.com/search?q={search_term_string}", "query-input": "required name=search_term_string" } }, { "@type": "Organization", "@id": "#organization", "name": "Aleoโ€™s Tube", "url": "https://aleos-tube-daily-vlog-anak-rantau.blogspot.com/", "logo": { "@type": "ImageObject", "url": "https://blogger.googleusercontent.com/img/b/logo.png", "width": 512, "height": 512 }, "sameAs": [ "https://www.youtube.com/channel/UCTHGlP7T12oHv2QHDuw0C3g", "https://www.instagram.com/aleos_tube/", "https://www.facebook.com/aleostube" ] } ] } </script>

<b:if cond='data:blog.pageType == "item"'> <script type="application/ld+json"> { "@context": "https://schema.org", "@type": "BlogPosting", "mainEntityOfPage": { "@type": "WebPage", "@id": "data:post.url/" }, "headline": "data:post.title.escaped/", "description": "data:post.snippet/", "image": { "@type": "ImageObject", "url": "data:post.firstImageUrl/" }, "author": { "@type": "Person", "name": "data:post.author/", "url": "https://aleos-tube-daily-vlog-anak-rantau.blogspot.com/" }, "publisher": { "@type": "Organization", "name": "Aleoโ€™s Tube", "logo": { "@type": "ImageObject", "url": "https://blogger.googleusercontent.com/img/b/logo.png" } }, "datePublished": "data:post.date.iso8601/", "dateModified": "data:post.dateLastUpdated.iso8601/", "inLanguage": "id-ID" } </script> </b:if>

<style> @media(prefers-color-scheme:dark){ body{background:#0b0d12;color:#eee;} } </style>

]]> </b:if>

<script type='text/javascript'> // #aleos-grid-aff { font-family: Inter, system-ui; background: ${THEME.grad}; padding: 16px; border-radius: 18px; margin: 18px 0; box-shadow: 0 4px 14px rgba(0,0,0,.08); overflow: hidden; color: #0f172a; opacity: 0; transform: translateY(10px); animation: fadeInUp .9s ease-out forwards; } @keyframes fadeInUp { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } @media (prefers-color-scheme: dark) { #aleos-grid-aff { background: linear-gradient(135deg,#0b1325,#111b2f); color: #e6eef8; } } #aleos-grid-aff h3 { margin: 0 0 10px; font-size: 1.05rem; font-weight: 600; display: flex; align-items: center; gap: 8px; } .scroll-box { display: flex; overflow-x: auto; gap: 14px; padding-bottom: 6px; scroll-behavior: smooth; scrollbar-width: thin; animation: fadeIn .8s ease-out forwards; } @keyframes fadeIn { from { opacity: 0 } to { opacity: 1 } } .scroll-box::-webkit-scrollbar { height: 6px; } .scroll-box::-webkit-scrollbar-thumb { background: rgba(0,0,0,.2); border-radius: 4px; } .ao-item { flex: 0 0 180px; background: #fff; border-radius: 14px; overflow: hidden; box-shadow: 0 4px 10px rgba(0,0,0,.06); transition: transform .25s ease, box-shadow .25s; opacity: 0; animation: fadeInCard .6s ease forwards; } @keyframes fadeInCard { from { opacity: 0; transform: scale(.97); } to { opacity: 1; transform: scale(1); } } .ao-item:hover { transform: translateY(-4px); box-shadow: 0 6px 14px rgba(0,0,0,.1); } .ao-thumb { width: 100%; aspect-ratio: 1/1; object-fit: cover; display: block; } .ao-title { font-size: 13px; font-weight: 600; margin: 8px 10px; color: #111827; line-height: 1.3; min-height: 36px; } .ao-cta { margin: 0 10px 12px; padding: 7px; text-align: center; border-radius: 8px; color: #fff; text-decoration: none; font-weight: 700; display: block; transition: opacity .2s; } .ao-cta:hover { opacity: 0.85; } .blue { background: #2563eb; } .orange { background: #f97316; } .red { background: #ef4444; } @media (max-width: 480px) { .ao-item { flex: 0 0 150px; } h3 { font-size: .95rem; } } </style>

${THEME.icon} Memuat...

`;

const grid = document.getElementById('scroll-box'); const titleEl = document.getElementById('labelTitle'); titleEl.textContent = ${THEME.icon} ${LABEL} Terbaru dari Aleoโ€™s Tube;

const FALLBACK = [ {title:"Aleo's Tube โ€” Premium Business Program", img:"https://www.digistore24-app.com/pb/img/merchant_371937/image/product/UOW66CMM.jpg", href:"https://www.digistore24.com/redir/472943/Aleostube/"}, {title:"InGenius Wave โ€” Audio Focus", img:"https://www.digistore24-app.com/pb/img/merchant_3646207/image/product/A6KAKV3T.png", href:"https://ingeniuswave.com/DSvsl/#aff=Aleostube"}, {title:"Pineal10X โ€” Mindset", img:"https://www.digistore24-app.com/pb/img/merchant_1632947/image/product/CWSY9T6E.png", href:"https://pineal10x.com/pnl10-index.php#aff=Aleostube"}, {title:"Superhuman At 70 โ€” Supplement", img:"https://www.digistore24-app.com/pb/img/merchant_2005677/image/product/H4VEJAAT.gif", href:"https://www.advancedbionutritionals.com/DS24/Nitric-Oxide-Supplements/Superhuman-At-70/HD.htm#aff=Aleostube"}, {title:"Meridian Acupressure Mat", img:"https://www.digistore24-app.com/pb/img/merchant_771978/image/product/2WY9BT3X.png", href:"https://andbalanced.com/pages/meridian-acupressure-mat-and-pillow-set-dg#aff=Aleostube"} ];

function makeNode(item,i){ const color=['blue','orange','red'][i%3]; const el=document.createElement('div'); el.className='ao-item'; el.innerHTML=<img class="ao-thumb" loading="lazy" src="${item.img}" alt="${item.title}"> <div class="ao-title">${item.title}</div> <a class="ao-cta ${color}" href="${item.href}" target="_blank" rel="nofollow noopener">Lihat</a>; el.style.animationDelay = (i * 0.12) + 's'; return el; }

async function loadData(){ grid.innerHTML=''; try{ const res=await fetch(FEED_URL,{cache:'no-store'}); const txt=await res.text(); const json=JSON.parse(txt.slice(txt.indexOf('{'),txt.lastIndexOf('}')+1)); const entries=json.feed.entry||[]; if(entries.length){ entries.forEach((p,i)=>{ const title=p.title?.$t||"Tanpa Judul"; const href=(p.link?.find(l=>l.rel==="alternate")||{}).href||BLOG_URL; let img=p.media$thumbnail?.url; if(!img&&p.content?.$t){ const m=p.content.$t.match(/<img[^>]+src="([^">]+)/i); if(m) img=m[1]; } img=img||"https://via.placeholder.com/400x400?text=Aleo+Offer"; grid.appendChild(makeNode({title,img,href},i)); }); } else FALLBACK.forEach((f,i)=>grid.appendChild(makeNode(f,i))); }catch(e){ FALLBACK.forEach((f,i)=>grid.appendChild(makeNode(f,i))); } }

// ๐ŸŒˆ Auto-scroll lembut function autoScroll(el){ let speed = 0.5; let pause = false; function step(){ if(!pause){ el.scrollLeft += speed; if(el.scrollLeft >= el.scrollWidth - el.clientWidth){ el.scrollLeft = 0; } } requestAnimationFrame(step); } el.addEventListener('mouseenter', ()=>pause = true); el.addEventListener('mouseleave', ()=>pause = false); step(); }

await loadData(); autoScroll(grid); setInterval(loadData, 60000); })(); //]]> </script>

<style> :root { --widget-bg: #ffffff; --widget-text: #000000; --widget-accent: #ff66cc; --widget-shadow: rgba(0,0,0,0.3); } @media (prefers-color-scheme: dark) { :root { --widget-bg: #121212; --widget-text: #ffffff; --widget-accent: #ff99dd; --widget-shadow: rgba(255,255,255,0.2); } } #virtualsign-widget { position: fixed; bottom: 100px; right: 200px; z-index: 9999; width: 320px; height: 240px; box-shadow: 0 0 12px var(--widget-shadow); border-radius: 15px; overflow: hidden; opacity: 0; visibility: hidden; transition: all 0.5s ease; background: var(--widget-bg); } #virtualsign-widget.show {opacity: 1; visibility: visible;} .access-btn { position: fixed; bottom: 30px; z-index: 10000; border: none; border-radius: 50%; width: 60px; height: 60px; font-size: 28px; cursor: pointer; color: #fff; box-shadow: 0 0 10px var(--widget-shadow); transition: transform 0.3s ease, background 0.3s ease; } .access-btn:hover {transform: scale(1.1);} #toggle-sign { right: 200px; background: var(--widget-accent); } #toggle-voice { right: 275px; background: #00cc99; } #sign-label { position: fixed; bottom: 95px; right: 200px; background: rgba(0,0,0,0.8); color: #fff; padding: 6px 12px; border-radius: 10px; font-size: 15px; font-weight: 500; opacity: 0; visibility: hidden; z-index: 10001; transition: opacity 0.4s ease; } #sign-label.show {opacity: 1; visibility: visible;} #voice-select { position: fixed; bottom: 100px; right: 340px; z-index: 10002; background: var(--widget-bg); color: var(--widget-text); border-radius: 10px; border: 1px solid #ccc; font-size: 14px; padding: 6px 10px; display: none; } #voice-select.show {display: block;} @media (max-width: 768px) { #virtualsign-widget { width: 260px; height: 200px; bottom: 90px; left: 20px; right: auto; } #toggle-sign { left: 20px; right: auto; } #toggle-voice { left: 95px; right: auto; } #sign-label { left: 20px; right: auto; } #voice-select { left: 160px; right: auto; } } </style>
<iframe allowfullscreen='true' frameborder='0' height='100%' id='sign-iframe' src='https://www.virtualsign.net/embed' title='Virtual Sign Language Widget' width='100%'/>
Bahasa Isyarat Aktif ๐ŸคŸ
๐ŸคŸ ๐Ÿผ ๐Ÿ‡ฎ๐Ÿ‡ฉ Indonesia ๐Ÿ‡ฌ๐Ÿ‡ง English ๐Ÿ‡ช๐Ÿ‡ธ Espaรฑol ๐Ÿ‡ฏ๐Ÿ‡ต ๆ—ฅๆœฌ่ชž ๐Ÿ‡ธ๐Ÿ‡ฆ ุงู„ุนุฑุจูŠุฉ <script type='text/javascript'> // 2){ visible = true; widget.classList.add('show'); label.classList.add('show'); voiceSelect.classList.add('show'); iframe.src = 'https://www.virtualsign.net/embed?text=' + encodeURIComponent(selectedText); speakText(selectedText, currentLang); } }); })(); //]]> </script> <script> (function(){ const blogURL = "https://aleos-tube-daily-vlog-anak-rantau.blogspot.com"; const canonical = document.querySelector('link[rel="canonical"]'); const pageURL = canonical ? canonical.href : window.location.href; const isPostPage = /\/20\d{2}\//.test(pageURL); // ๐Ÿ”‘ Key generator (gunakan nilai acak sebagai key sementara) const defaultKey = "aleostube-" + Math.random().toString(36).substring(2,10); // Simpan tanggal terakhir ping const today = new Date().toISOString().split("T")[0]; const lastPingKey = "AleoPing_" + pageURL; const lastPingDate = localStorage.getItem(lastPingKey); if (isPostPage & lastPingDate !== today) { const pingURLs = [ "https://www.google.com/ping?sitemap=" + encodeURIComponent(blogURL + "/sitemap.xml"), "https://www.bing.com/ping?sitemap=" + encodeURIComponent(blogURL + "/sitemap.xml"), "https://yandex.com/ping?sitemap=" + encodeURIComponent(blogURL + "/sitemap.xml"), "https://api.indexnow.org/indexnow?url=" + encodeURIComponent(pageURL) + "&key=" + defaultKey, "https://duckduckgo.com/ping?sitemap=" + encodeURIComponent(blogURL + "/sitemap.xml") ]; console.groupCollapsed("๐ŸŒ ALEOโ€™S TUBE SEO MAX v10.1 PRO โ€” Auto Ping Log"); pingURLs.forEach(url=>{ fetch(url,{method:"GET",mode:"no-cors"}) .then(()=>console.log("โœ… Ping terkirim ke:",url)) .catch(err=>console.warn("โš ๏ธ Gagal ping:",url,err)); }); console.groupEnd(); localStorage.setItem(lastPingKey, today); } else { console.log("๐Ÿ›ก๏ธ Ping sudah dilakukan hari ini untuk:", pageURL); } })(); </script>

<macro:includable id='sections' var='col'> <macro:if cond='data:col.num == 0'> macro:else/ <b:section mexpr:class='data:col.class' mexpr:id='data:col.idPrefix + "-1"' preferred='yes' showaddelement='yes'/>

<macro:if cond='data:col.num &gt;= 2'>
  <table border='0' cellpadding='0' cellspacing='0' mexpr:class='&quot;section-columns columns-&quot; + data:col.num'>
  <tbody>
  <tr>
    <td class='first columns-cell'>
      <b:section mexpr:class='data:col.class' mexpr:id='data:col.idPrefix + &quot;-2-1&quot;'/>
    </td>

    <td class='columns-cell'>
      <b:section mexpr:class='data:col.class' mexpr:id='data:col.idPrefix + &quot;-2-2&quot;'/>
    </td>

    <macro:if cond='data:col.num &gt;= 3'>
      <td class='columns-cell'>
        <b:section mexpr:class='data:col.class' mexpr:id='data:col.idPrefix + &quot;-2-3&quot;'/>
      </td>
    </macro:if>

    <macro:if cond='data:col.num &gt;= 4'>
      <td class='columns-cell'>
        <b:section mexpr:class='data:col.class' mexpr:id='data:col.idPrefix + &quot;-2-4&quot;'/>
      </td>
    </macro:if>
  </tr>
  </tbody>
  </table>

  <macro:if cond='data:col.includeBottom'>
    <b:section mexpr:class='data:col.class' mexpr:id='data:col.idPrefix + &quot;-3&quot;' showaddelement='no'/>
  </macro:if>
</macro:if>

</macro:if> </macro:includable>

<b:section-contents id='footer-1'> <b:widget id='HTML18' locked='false' title='' type='HTML'> <b:widget-settings> <b:widget-setting name='content'><![CDATA[

<style> /* ============================================================ ๐Ÿ’  ALEOTUBE FLEX HEADER v10 โ€” RESPONSIVE PREMIUM EDITION ============================================================ */ .header-outer { display: flex; flex-direction: column; align-items: center; justify-content: center; width: 100%; box-sizing: border-box; text-align: center; position: relative; overflow: hidden; background: rgba(255,255,255,0.08); backdrop-filter: blur(10px); border-bottom: 2px solid rgba(255,255,255,0.1); padding: 1.5rem 1rem; } .header-outer::before { content: ""; position: absolute; inset: 0; background: linear-gradient(135deg, rgba(255,140,0,0.3) 0%, rgba(0,123,255,0.25) 35%, rgba(255,0,0,0.25) 70%, rgba(255,255,255,0.1) 100%); z-index: 0; } .Header img { position: relative; z-index: 1; max-width: 180px; height: auto; border-radius: 12px; margin-bottom: 0.5rem; transition: transform 0.4s ease; } .Header img:hover { transform: scale(1.05); } .Header h1 { position: relative; z-index: 1; font-size: clamp(1.8rem, 4vw, 2.8rem); color: #fff; text-shadow: 1px 1px 8px rgba(0,0,0,0.4); margin: 0.3rem 0; font-weight: 700; letter-spacing: 1px; } .Header .description { position: relative; z-index: 1; font-size: clamp(1rem, 2.5vw, 1.2rem); color: rgba(255,255,255,0.85); margin-top: 0.2rem; font-weight: 400; } /* Tabs / Menu */ .tabs-inner { display: flex; flex-wrap: wrap; justify-content: center; align-items: center; width: 100%; gap: 8px; margin: 1rem auto 0.5rem; padding: 0.5rem 0; position: relative; z-index: 2; } .tabs-inner ul { display: flex; flex-wrap: wrap; justify-content: center; list-style: none; margin: 0; padding: 0; gap: 6px; } .tabs-inner li a { display: inline-block; padding: 0.5rem 1rem; border-radius: 9999px; background: rgba(255,255,255,0.15); color: #fff; text-decoration: none; font-weight: 500; font-size: 0.95rem; letter-spacing: 0.5px; transition: all 0.3s ease; border: 1px solid rgba(255,255,255,0.15); } .tabs-inner li a:hover, .tabs-inner li.active a { background: linear-gradient(90deg, #ff7b00, #007bff, #ff003c); background-size: 200% 200%; animation: gradientMove 2s ease infinite; color: #fff; transform: translateY(-2px); border-color: transparent; } @keyframes gradientMove { 0% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; } } /* Responsive */ @media (max-width: 768px) { .Header img { max-width: 150px; } .Header h1 { font-size: 1.9rem; } .Header .description { font-size: 1rem; } .tabs-inner li a { padding: 0.45rem 0.9rem; font-size: 0.9rem; } } @media (max-width: 480px) { .header-outer { padding: 1rem 0.5rem; } .Header img { max-width: 130px; } .Header h1 { font-size: 1.6rem; } .tabs-inner { flex-direction: column; gap: 5px; } .tabs-inner li a { width: 100%; text-align: center; } } </style>
Aleo's Tube Logo

Aleoโ€™s Tube Daily Vlog Anak Rantau

Berbagi kisah, pengalaman, dan keseharian penuh warna ๐ŸŒ

]]>

<b:include name='quickedit'/> </b:includable> </b:widget> <b:widget id='HTML5' locked='false' title='' type='HTML'> <b:widget-settings> <b:widget-setting name='content'><![CDATA[

<script> (function() { const base = "https://aleos-tube-daily-vlog-anak-rantau.blogspot.com/"; const langs = ['id','en','tet','pt','es','fr','de','ja','zh','ko','tl','ms','vi','th','ar','ru']; const pages = [ '', 'about', 'contact', 'produk', 'travel', 'vlog', 'inspirasi', 'tips-hidup-mandiri', 'promo', 'review' ]; // Buat sitemap XML let xml = '\nxmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n'; langs.forEach(lang => { pages.forEach(page => { xml += ` \n`; xml += ` ${base}${lang === 'id' ? '' : lang + '/'}${page}\n`; xml += ` weekly\n`; xml += ` 0.8\n`; xml += ` \n`; }); }); xml += ''; // Buat sitemap JSON const json = { site: base, updated: new Date().toISOString(), languages: langs, urls: langs.map(lang => ({ lang, pages: pages.map(p => base + (lang === 'id' ? '' : lang + '/') + p) })) }; // Deteksi bot (Google, Bing, Yandex) const agent = navigator.userAgent.toLowerCase(); if (agent.includes('googlebot') || agent.includes('bingbot') || agent.includes('yandex')) { // Buat tampilan XML untuk bot const blob = new Blob([xml], { type: 'application/xml' }); const link = document.createElement('a'); link.href = URL.createObjectURL(blob); link.download = 'sitemap.xml'; document.body.appendChild(link); } else { // Buat sitemap viewer kecil untuk manusia const box = document.createElement('div'); box.style = "font-family:Arial;padding:15px;margin:15px;background:#fff;border-radius:10px;box-shadow:0 3px 8px rgba(0,0,0,0.2);"; box.innerHTML = `

๐ŸŒ Aleo's Tube Multilingual Sitemap

Diperbarui otomatis: ${new Date().toLocaleString()}

Lihat Sitemap JSON
${JSON.stringify(json, null, 2)}
  </details>
`;
document.body.appendChild(box);

} })(); </script>]]></b:widget-setting> </b:widget-settings> <b:includable id='main'>

<b:if cond='data:title != ""'>

data:title/

</b:if>

<b:include name='quickedit'/> </b:includable> </b:widget> <b:widget id='HTML3' locked='false' title='' type='HTML'> <b:widget-settings> <b:widget-setting name='content'><![CDATA[

Aleo's Tube
<span class="spark"></span>
<span class="spark"></span>
<span class="spark"></span>
<span class="spark"></span>
<span class="spark"></span>
<a 

href="https://youtube.com/UCTHGlP7T12oHv2QHDuw0C3g" class="btn btn-yt"> YT IG FB Pin XT

<style> .linktree-mini { text-align: center; margin: 15px auto; background: transparent; }

/* Avatar efek api */ .avatar-fire { position: relative; display: inline-block; margin-bottom: 20px; } .avatar-fire img { width: 90px; height: 90px; border-radius: 50%; object-fit: cover; z-index: 3; position: relative; }

/* Lidah api */ .flame { position: absolute; top: -25px; left: -25px; right: -25px; bottom: -25px; border-radius: 50%; filter: blur(28px); z-index: 1; opacity: 0.7; animation: flicker 2s infinite ease-in-out alternate; } .flame1 { background: radial-gradient(circle, rgba(255,140,0,0.8) 20%, transparent 70%); animation-delay: 0s; } .flame2 { background: radial-gradient(circle, rgba(255,69,0,0.8) 15%, transparent 80%); animation-delay: 0.5s; } .flame3 { background: radial-gradient(circle, rgba(255,215,0,0.7) 10%, transparent 80%); animation-delay: 1s; }

@keyframes flicker { 0% { transform: scale(1) rotate(0deg); opacity: 0.7; } 50% { transform: scale(1.2) rotate(12deg); opacity: 1; } 100% { transform: scale(1) rotate(-12deg); opacity: 0.6; } }

/* Sparks (percikan api) */ .spark { position: absolute; width: 6px; height: 6px; background: radial-gradient(circle, #ffec85 20%, #ff9900 70%, transparent 100%); border-radius: 50%; animation: sparkFly 3s linear infinite; opacity: 0.8; z-index: 2; } .spark:nth-child(4) { top: 10%; left: 40%; animation-delay: 0s; } .spark:nth-child(5) { top: 30%; left: 70%; animation-delay: 0.5s; } .spark:nth-child(6) { top: 60%; left: 20%; animation-delay: 1s; } .spark:nth-child(7) { top: 80%; left: 50%; animation-delay: 1.5s; } .spark:nth-child(8) { top: 40%; left: 10%; animation-delay: 2s; }

@keyframes sparkFly { 0% { transform: translateY(0) scale(1); opacity: 0.9; } 50% { transform: translateY(-40px) scale(0.8); opacity: 1; } 100% { transform: translateY(-80px) scale(0.5); opacity: 0; } }

/* Tombol oval horizontal */ .btn-row { display: flex; justify-content: center; flex-wrap: wrap; gap: 10px; } .btn { display: inline-flex; align-items: center; gap: 6px; padding: 8px 14px; border-radius: 25px; font-size: 0.9rem; font-weight: 600; color: #fff; text-decoration: none; position: relative; overflow: hidden; z-index: 1; } .btn::before { content: ""; position: absolute; inset: -2px; border-radius: 30px; background: linear-gradient(90deg, red, orange, yellow, green, blue, violet); background-size: 400% 100%; animation: rainbowMove 6s linear infinite; z-index: -2; } .btn::after { content: ""; position: absolute; inset: 2px; border-radius: 25px; z-index: -1; } .btn-wa::after { background: #25D366; } .btn-yt::after { background: #FF0000; } .btn-ig::after { background: linear-gradient(45deg,#f58529,#dd2a7b,#8134af,#515bd4); } .btn-fb::after { background: #1877F2; } .btn-pin::after { background: #E60023; } .btn-th::after { background: #000; }

.btn i { font-size: 1rem; }

@keyframes rainbowMove { 0% { background-position: 0% 50%; } 100% { background-position: 100% 50%; } } </style>]]></b:widget-setting> </b:widget-settings> <b:includable id='main'>

<b:if cond='data:title != ""'>

data:title/

</b:if>

<b:include name='quickedit'/> </b:includable> </b:widget> <b:widget id='ReportAbuse1' locked='false' title='' type='ReportAbuse'> <b:includable id='main'> <b:include name='reportAbuse'/> </b:includable> </b:widget> <b:widget id='Label1' locked='false' title='Label' type='Label'> <b:widget-settings> <b:widget-setting name='sorting'>FREQUENCY</b:widget-setting> <b:widget-setting name='display'>CLOUD</b:widget-setting> <b:widget-setting name='selectedLabelsList'/> <b:widget-setting name='showType'>ALL</b:widget-setting> <b:widget-setting name='showFreqNumbers'>true</b:widget-setting> </b:widget-settings> <b:includable id='main'> <b:if cond='data:title != ""'>

data:title/

</b:if>

  • ()
()
MENU yyyy true MMMM yyyy MMM dd MM/dd true false DAILY

  • ()
  • ()
()
โ–ผย  โ—„ย  โ–บย  true true

<b:else/> <!-- normal blog profile -->

  <b:if cond='data:photo.url != &quot;&quot;'>
    <a expr:href='data:userUrl'><img class='profile-img' expr:alt='data:messages.myPhoto' expr:height='data:photo.height' expr:src='data:photo.url' expr:width='data:photo.width'/></a>
  </b:if>

  <dl class='profile-datablock'>
    <dt class='profile-data'>
      <a class='profile-name-link g-profile' expr:href='data:userUrl' expr:style='&quot;background-image: url(&quot; + data:profileLogo + &quot;);&quot;' rel='author'>
        <data:displayname/>
      </a>
    </dt>

    <b:if cond='data:showlocation'>
      <dd class='profile-data'><data:location/></dd>
    </b:if>

    <b:if cond='data:aboutme != &quot;&quot;'><dd class='profile-textblock'><data:aboutme/></dd></b:if>
  </dl>
  <a class='profile-link' expr:href='data:userUrl' rel='author'><data:viewProfileMsg/></a>
</b:if>

 <b:include name='quickedit'/>
</div>

</b:includable> </b:widget> <b:widget id='BlogSearch1' locked='false' title='Cari Blog Ini' type='BlogSearch'> <b:includable id='main'> <b:if cond='data:title != ""'>

data:title/

</b:if>

<div class='widget-content'>
  <div expr:id='data:widget.instanceId + &quot;_form&quot;'>
    <form class='gsc-search-box' expr:action='data:blog.searchUrl'>
      <b:attr cond='not data:view.isPreview' name='target' value='_top'/>
      <table cellpadding='0' cellspacing='0' class='gsc-search-box'>
        <tbody>
          <tr>
            <td class='gsc-input'>
              <input autocomplete='off' class='gsc-input' expr:value='data:view.isSearch ? data:view.search.query.escaped : &quot;&quot;' name='q' size='10' title='search' type='text'/>
            </td>
            <td class='gsc-search-button'>
              <input class='gsc-search-button' expr:value='data:messages.search' title='search' type='submit'/>
            </td>
          </tr>
        </tbody>
      </table>
    </form>
  </div>
</div>

<b:include name='quickedit'/>

</b:includable> </b:widget> <b:widget id='PageList1' locked='false' title='' type='PageList'> <b:widget-settings> <b:widget-setting name='pageListJson'></b:widget-setting> <b:widget-setting name='homeTitle'>Beranda</b:widget-setting> </b:widget-settings> <b:includable id='main'> <b:if cond='data:title != ""'>

data:title/

</b:if>

&#9660;
๐ŸŒ Bahasa: Mendeteksi...
<script type="text/javascript"> /* ๐ŸŒ Google Auto Translate */ function googleTranslateElementInit() { new google.translate.TranslateElement({ pageLanguage: 'id', // Ganti sesuai bahasa utama blog layout: google.translate.TranslateElement.InlineLayout.SIMPLE, autoDisplay: true }, 'google_translate_element'); } // Load Google Translate Script (function() { const gt = document.createElement('script'); gt.type = 'text/javascript'; gt.async = true; gt.src = '//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit'; const s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(gt, s); })(); /* ๐ŸŒ Deteksi bahasa + tampilkan nama & bendera */ const langToFlag = { id: "๐Ÿ‡ฎ๐Ÿ‡ฉ", en: "๐Ÿ‡บ๐Ÿ‡ธ", tet: "๐Ÿ‡น๐Ÿ‡ฑ", pt: "๐Ÿ‡ต๐Ÿ‡น", es: "๐Ÿ‡ช๐Ÿ‡ธ", fr: "๐Ÿ‡ซ๐Ÿ‡ท", de: "๐Ÿ‡ฉ๐Ÿ‡ช", ja: "๐Ÿ‡ฏ๐Ÿ‡ต", zh: "๐Ÿ‡จ๐Ÿ‡ณ", ko: "๐Ÿ‡ฐ๐Ÿ‡ท", ar: "๐Ÿ‡ธ๐Ÿ‡ฆ", ru: "๐Ÿ‡ท๐Ÿ‡บ", it: "๐Ÿ‡ฎ๐Ÿ‡น", tl: "๐Ÿ‡ต๐Ÿ‡ญ", my: "๐Ÿ‡ฒ๐Ÿ‡ฒ", th: "๐Ÿ‡น๐Ÿ‡ญ", vi: "๐Ÿ‡ป๐Ÿ‡ณ", ms: "๐Ÿ‡ฒ๐Ÿ‡พ", hi: "๐Ÿ‡ฎ๐Ÿ‡ณ", nl: "๐Ÿ‡ณ๐Ÿ‡ฑ", tr: "๐Ÿ‡น๐Ÿ‡ท", fa: "๐Ÿ‡ฎ๐Ÿ‡ท", pl: "๐Ÿ‡ต๐Ÿ‡ฑ", uk: "๐Ÿ‡บ๐Ÿ‡ฆ", sv: "๐Ÿ‡ธ๐Ÿ‡ช", fi: "๐Ÿ‡ซ๐Ÿ‡ฎ", no: "๐Ÿ‡ณ๐Ÿ‡ด", da: "๐Ÿ‡ฉ๐Ÿ‡ฐ", ro: "๐Ÿ‡ท๐Ÿ‡ด", el: "๐Ÿ‡ฌ๐Ÿ‡ท", he: "๐Ÿ‡ฎ๐Ÿ‡ฑ", hu: "๐Ÿ‡ญ๐Ÿ‡บ", cs: "๐Ÿ‡จ๐Ÿ‡ฟ", sk: "๐Ÿ‡ธ๐Ÿ‡ฐ", sr: "๐Ÿ‡ท๐Ÿ‡ธ", bg: "๐Ÿ‡ง๐Ÿ‡ฌ", hr: "๐Ÿ‡ญ๐Ÿ‡ท", sl: "๐Ÿ‡ธ๐Ÿ‡ฎ", sq: "๐Ÿ‡ฆ๐Ÿ‡ฑ", lt: "๐Ÿ‡ฑ๐Ÿ‡น", lv: "๐Ÿ‡ฑ๐Ÿ‡ป", et: "๐Ÿ‡ช๐Ÿ‡ช", sw: "๐Ÿ‡ฐ๐Ÿ‡ช", af: "๐Ÿ‡ฟ๐Ÿ‡ฆ", ne: "๐Ÿ‡ณ๐Ÿ‡ต", ur: "๐Ÿ‡ต๐Ÿ‡ฐ", ps: "๐Ÿ‡ฆ๐Ÿ‡ซ", km: "๐Ÿ‡ฐ๐Ÿ‡ญ", lo: "๐Ÿ‡ฑ๐Ÿ‡ฆ", mn: "๐Ÿ‡ฒ๐Ÿ‡ณ", ta: "๐Ÿ‡ฎ๐Ÿ‡ณ", te: "๐Ÿ‡ฎ๐Ÿ‡ณ", si: "๐Ÿ‡ฑ๐Ÿ‡ฐ", bn: "๐Ÿ‡ง๐Ÿ‡ฉ", kn: "๐Ÿ‡ฎ๐Ÿ‡ณ" ang:"๐Ÿ‡ฆ๐Ÿ‡ด", }; const userLang = (navigator.language || navigator.userLanguage).split('-')[0]; const langNames = new Intl.DisplayNames(['id'], { type: 'language' }); const detectedLangName = langNames.of(userLang) || userLang; // Isi widget document.getElementById('detected-lang').textContent = detectedLangName; document.getElementById('flag').textContent = langToFlag[userLang] || "๐ŸŒ"; // Animasi muncul lembut const widget = document.getElementById('lang-widget'); setTimeout(() => { widget.style.opacity = '1'; widget.style.transform = 'translateY(0)'; }, 800); // ๐ŸŒ— Tema Otomatis const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches; if (prefersDark) { widget.style.setProperty('--widget-bg', '#1e1e1ed9'); widget.style.setProperty('--widget-text', '#fff'); } else { widget.style.setProperty('--widget-bg', '#ffffffd9'); widget.style.setProperty('--widget-text', '#111'); } // Hover animasi lembut widget.addEventListener('mouseenter', () => { widget.style.transform = 'scale(1.05)'; }); widget.addEventListener('mouseleave', () => { widget.style.transform = 'scale(1)'; }); </script>
๐ŸŒ Bahasa: Mendeteksi...
<script type="text/javascript"> /* ๐ŸŒ Google Auto Translate */ function googleTranslateElementInit() { new google.translate.TranslateElement({ pageLanguage: 'id', // Ganti sesuai bahasa utama blog layout: google.translate.TranslateElement.InlineLayout.SIMPLE, autoDisplay: true }, 'google_translate_element'); } // Load Google Translate Script (function() { const gt = document.createElement('script'); gt.type = 'text/javascript'; gt.async = true; gt.src = '//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit'; const s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(gt, s); })(); /* ๐ŸŒ Deteksi bahasa + tampilkan nama & bendera */ const langToFlag = { id: "๐Ÿ‡ฎ๐Ÿ‡ฉ", en: "๐Ÿ‡บ๐Ÿ‡ธ", tet: "๐Ÿ‡น๐Ÿ‡ฑ", pt: "๐Ÿ‡ต๐Ÿ‡น", es: "๐Ÿ‡ช๐Ÿ‡ธ", fr: "๐Ÿ‡ซ๐Ÿ‡ท", de: "๐Ÿ‡ฉ๐Ÿ‡ช", ja: "๐Ÿ‡ฏ๐Ÿ‡ต", zh: "๐Ÿ‡จ๐Ÿ‡ณ", ko: "๐Ÿ‡ฐ๐Ÿ‡ท", ar: "๐Ÿ‡ธ๐Ÿ‡ฆ", ru: "๐Ÿ‡ท๐Ÿ‡บ", it: "๐Ÿ‡ฎ๐Ÿ‡น", tl: "๐Ÿ‡ต๐Ÿ‡ญ", my: "๐Ÿ‡ฒ๐Ÿ‡ฒ", th: "๐Ÿ‡น๐Ÿ‡ญ", vi: "๐Ÿ‡ป๐Ÿ‡ณ", ms: "๐Ÿ‡ฒ๐Ÿ‡พ", hi: "๐Ÿ‡ฎ๐Ÿ‡ณ", nl: "๐Ÿ‡ณ๐Ÿ‡ฑ", tr: "๐Ÿ‡น๐Ÿ‡ท", fa: "๐Ÿ‡ฎ๐Ÿ‡ท", pl: "๐Ÿ‡ต๐Ÿ‡ฑ", uk: "๐Ÿ‡บ๐Ÿ‡ฆ", sv: "๐Ÿ‡ธ๐Ÿ‡ช", fi: "๐Ÿ‡ซ๐Ÿ‡ฎ", no: "๐Ÿ‡ณ๐Ÿ‡ด", da: "๐Ÿ‡ฉ๐Ÿ‡ฐ", ro: "๐Ÿ‡ท๐Ÿ‡ด", el: "๐Ÿ‡ฌ๐Ÿ‡ท", he: "๐Ÿ‡ฎ๐Ÿ‡ฑ", hu: "๐Ÿ‡ญ๐Ÿ‡บ", cs: "๐Ÿ‡จ๐Ÿ‡ฟ", sk: "๐Ÿ‡ธ๐Ÿ‡ฐ", sr: "๐Ÿ‡ท๐Ÿ‡ธ", bg: "๐Ÿ‡ง๐Ÿ‡ฌ", hr: "๐Ÿ‡ญ๐Ÿ‡ท", sl: "๐Ÿ‡ธ๐Ÿ‡ฎ", sq: "๐Ÿ‡ฆ๐Ÿ‡ฑ", lt: "๐Ÿ‡ฑ๐Ÿ‡น", lv: "๐Ÿ‡ฑ๐Ÿ‡ป", et: "๐Ÿ‡ช๐Ÿ‡ช", sw: "๐Ÿ‡ฐ๐Ÿ‡ช", af: "๐Ÿ‡ฟ๐Ÿ‡ฆ", ne: "๐Ÿ‡ณ๐Ÿ‡ต", ur: "๐Ÿ‡ต๐Ÿ‡ฐ", ps: "๐Ÿ‡ฆ๐Ÿ‡ซ", km: "๐Ÿ‡ฐ๐Ÿ‡ญ", lo: "๐Ÿ‡ฑ๐Ÿ‡ฆ", mn: "๐Ÿ‡ฒ๐Ÿ‡ณ", ta: "๐Ÿ‡ฎ๐Ÿ‡ณ", te: "๐Ÿ‡ฎ๐Ÿ‡ณ", si: "๐Ÿ‡ฑ๐Ÿ‡ฐ", bn: "๐Ÿ‡ง๐Ÿ‡ฉ", kn: "๐Ÿ‡ฎ๐Ÿ‡ณ" ang:"๐Ÿ‡ฆ๐Ÿ‡ด", }; const userLang = (navigator.language || navigator.userLanguage).split('-')[0]; const langNames = new Intl.DisplayNames(['id'], { type: 'language' }); const detectedLangName = langNames.of(userLang) || userLang; // Isi widget document.getElementById('detected-lang').textContent = detectedLangName; document.getElementById('flag').textContent = langToFlag[userLang] || "๐ŸŒ"; // Animasi muncul lembut const widget = document.getElementById('lang-widget'); setTimeout(() => { widget.style.opacity = '1'; widget.style.transform = 'translateY(0)'; }, 800); // ๐ŸŒ— Tema Otomatis const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches; if (prefersDark) { widget.style.setProperty('--widget-bg', '#1e1e1ed9'); widget.style.setProperty('--widget-text', '#fff'); } else { widget.style.setProperty('--widget-bg', '#ffffffd9'); widget.style.setProperty('--widget-text', '#111'); } // Hover animasi lembut widget.addEventListener('mouseenter', () => { widget.style.transform = 'scale(1.05)'; }); widget.addEventListener('mouseleave', () => { widget.style.transform = 'scale(1)'; }); </script>]]>
</b:widget-settings>
<b:includable id='main'>

<b:if cond='data:title != ""'>

data:title/

</b:if>

<b:include name='quickedit'/> </b:includable> </b:widget> <b:widget id='HTML13' locked='false' title='' type='HTML'> <b:widget-settings> <b:widget-setting name='content'><![CDATA[# Creating a single-file HTML for "Premium v8.3 Pulse Edition" (Page Mode) with:

- Auto affiliate scanning (digistore24, shopee, tokopedia)

- Sitemap HTML + XML generator

- Auto-translate (Google Translate widget hidden + auto-select)

- Subscribe popup linking to provided YouTube channel

- Dark mode auto by visitor time + prefers-color-scheme fallback

html = """<!doctype html>

Pulse Edition v8.3 โ€” Promo & Sitemap (Page Mode)

<style> :root{ --pulse-orange:#ff7a18; --pulse-blue:#1e90ff; --pulse-red:#ff3b30; --bg-dark:#0f1115; --bg-light:#f6f7fb; --card-radius:12px; --maxw:1100px; --shadow: 0 8px 30px rgba(2,6,23,0.18); --font: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial; } *{box-sizing:border-box} html,body{height:100%;margin:0;font-family:var(--font);-webkit-font-smoothing:antialiased} .container{max-width:var(--maxw);margin:18px auto;padding:18px} .page-card{border-radius:var(--card-radius);padding:18px;box-shadow:var(--shadow);overflow:hidden;border:1px solid rgba(255,255,255,0.04)} .header{display:flex;align-items:center;justify-content:space-between;gap:12px} .title{font-size:20px;font-weight:800;margin:0;color:var(--pulse-orange)} .subtitle{font-size:13px;color:rgba(255,255,255,0.75)} .grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;margin-top:14px} .card{background:linear-gradient(180deg, rgba(255,255,255,0.02), rgba(255,255,255,0.01));border-radius:12px;overflow:hidden;border:1px solid rgba(255,255,255,0.03)} .thumb{width:100%;height:140px;object-fit:cover;background:#111;display:block} .meta{padding:12px} .title-sm{font-weight:700;font-size:14px;margin:0 0 6px} .desc{font-size:13px;color:rgba(255,255,255,0.8);margin:0 0 10px} .btn{display:inline-block;padding:8px 12px;border-radius:10px;background:linear-gradient(135deg,var(--pulse-orange),var(--pulse-blue));color:#fff;text-decoration:none;font-weight:700} .small{font-size:12px;color:rgba(255,255,255,0.7)} .controls{display:flex;gap:10px;align-items:center;margin-top:12px;flex-wrap:wrap} /* sitemap */ .sitemap-list{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:6px} .sitemap-list a{text-decoration:none;padding:8px;border-radius:8px;color:var(--pulse-blue);display:block} /* modal subscribe */ .modal{position:fixed;inset:0;background:rgba(2,6,23,0.55);display:flex;align-items:center;justify-content:center;z-index:9999;padding:18px} .modal-inner{width:100%;max-width:420px;background:linear-gradient(180deg,#0b0c0f,#0f1115);padding:18px;border-radius:12px;position:relative;box-shadow:0 12px 40px rgba(2,6,23,0.5);text-align:center} .modal-close{position:absolute;right:10px;top:8px;border:0;background:transparent;color:#fff;font-size:18px;cursor:pointer} .subscribe-btn{display:inline-block;padding:10px 14px;border-radius:10px;background:var(--pulse-red);color:#fff;text-decoration:none;font-weight:800;margin-top:12px} /* hidden utility */ .hidden{display:none !important} /* LIGHT THEME */ .light body, .light .page-card{background:var(--bg-light);color:#111} .light .page-card{border:1px solid rgba(2,6,23,0.06)} .light .subtitle{color:rgba(0,0,0,0.6)} .light .desc{color:rgba(0,0,0,0.7)} /* accessibility */ @media (prefers-reduced-motion: no-preference){ .card{transition:transform .28s cubic-bezier(.22,.9,.24,1)} .card:hover{transform:translateY(-6px)} } /* hide Google Translate UI when it loads */ .goog-te-banner-frame.skiptranslate{display:none !important} .goog-te-gadget-icon{display:none !important} #google_translate_element{display:none} </style>

Pulse Edition v8.3 โ€” Promo & Sitemap

Auto-affiliate, HTML & XML sitemap, auto-translate, dan ajakan subscribe Aleo's Tube.
Warna: orange ยท biru ยท merah ยท transparan
<div class="controls">
  <button id="openSitemapBtn" class="btn" style="background:transparent;border:1px solid rgba(255,255,255,0.06);color:var(--pulse-blue)">Tampilkan Sitemap</button>
  <button id="generateXmlBtn" class="btn">Generate XML Sitemap</button>
  <span class="small">Widget otomatis memindai posting untuk link afiliasi (digistore24, shopee, tokopedia).</span>
</div>

<div id="cardGrid" class="grid" aria-live="polite" style="margin-top:14px">
  <!-- cards injected -->
</div>

<div id="sitemapSection" class="hidden" style="margin-top:16px">
  <h3 style="margin:0 0 8px">HTML Sitemap</h3>
  <div id="sitemapOut" class="small sitemap-list">Sedang memuatโ€ฆ</div>
</div>
โœ•

Dukung Aleo's Tube โค๏ธ

Jika suka konten, klik subscribe ke channel YouTube Aleo's Tube untuk update video terbaru.

Subscribe
Tidak ingin melihat lagi? Kamu bisa menutup popup ini.
<script> (async function(){ 'use strict'; // CONFIG const AFF_DOMAINS = ['digistore24.com','shopee.co.id','shopee.com','tokopedia.com']; const MAX_ITEMS = 9999; const BLOG_FEED = location.origin + '/feeds/posts/default?alt=json&max-results=9999'; const YT_SUBSCRIBE = 'https://www.youtube.com/channel/UCTHGlP7T12oHv2QHDuw0C3g'; // from user const pageCard = document.getElementById('pageCard'); const grid = document.getElementById('cardGrid'); const sitemapOut = document.getElementById('sitemapOut'); const sitemapSection = document.getElementById('sitemapSection'); const openSitemapBtn = document.getElementById('openSitemapBtn'); const generateXmlBtn = document.getElementById('generateXmlBtn'); const subscribeModal = document.getElementById('subscribeModal'); const subscribeLink = document.getElementById('subscribeLink'); const closeSubscribe = document.getElementById('closeSubscribe'); subscribeLink.href = YT_SUBSCRIBE; // small util const strip = s => (s||'').replace(/<[^>]+>/g,'').trim(); // fetch blog feed async function fetchFeed(){ try { const r = await fetch(BLOG_FEED, {cache: 'no-cache'}); const j = await r.json(); return j.feed && j.feed.entry ? j.feed.entry : []; } catch(e){ console.warn('feed error', e); return []; } } function extractImage(entry){ if(entry.media$thumbnail && entry.media$thumbnail.url) return entry.media$thumbnail.url.replace(/\\/s72-c\\//,'/s640/'); const content = entry.content && entry.content.$t || entry.summary && entry.summary.$t || ''; const m = content.match(/]+src=['"]([^'"]+)['"]/i); if(m) return m[1]; return null; } function findAffiliates(entry){ const html = (entry.content && entry.content.$t) || (entry.summary && entry.summary.$t) || ''; const urls = []; const re = /]+href=['"]([^'"]+)['"]/g; let m; while((m=re.exec(html))!==null){ try { const u = new URL(m[1], location.origin).href; for(const d of AFF_DOMAINS){ if(u.includes(d)) urls.push(u); } } catch(e){} } return Array.from(new Set(urls)); } function makeCard({title,desc,img,link}){ const el = document.createElement('div'); el.className = 'card'; el.innerHTML = ` ${ img ? `${title}` : `
` }
${title}
${desc}
Beli / Lihat
`; return el; } // render UI async function render(){ const entries = await fetchFeed(); const found = []; const sitemapItems = []; for(const e of entries){ const links = findAffiliates(e); const title = (e.title && e.title.$t) || 'Untitled'; const url = (e.link || []).find(l=>l.rel==='alternate')?.href || ''; sitemapItems.push({title,url,updated: e.published ? e.published.$t : (e.updated && e.updated.$t) || ''}); if(links.length){ found.push({ title: strip(title), desc: strip((e.summary && e.summary.$t) || '').slice(0,140) || 'Produk afiliasi dari posting terkait', img: extractImage(e) || '', link: links[0] }); } } // populate grid grid.innerHTML = ''; if(found.length === 0){ grid.innerHTML = '
Belum ada link afiliasi terdeteksi pada posting. Pastikan link afiliasi muncul di konten posting dan domain terdaftar.
'; } else { found.forEach(f=>grid.appendChild(makeCard(f))); } // sitemap out sitemapOut.innerHTML = sitemapItems.map(i=>`\${i.title||i.url}`).join(''); // attach to global for XML window.__pulse_sitemap = sitemapItems; } // generate XML function generateXML(items){ const xmlItems = items.map(i=>{ const loc = i.url; const lastmod = (i.updated) ? new Date(i.updated).toISOString() : new Date().toISOString(); return `\${loc}\${lastmod}weekly`; }).join(''); const xml = `\\n\\n\${xmlItems}\\n`; const w = window.open(); w.document.open(); w.document.write('
' + escapeHtml(xml) + '
');
w.document.close();

}

function escapeHtml(s){ return (s||'').replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>'); }

openSitemapBtn.addEventListener('click', ()=>{ sitemapSection.classList.toggle('hidden'); if(!sitemapSection.classList.contains('hidden')) window.scrollTo({top: sitemapSection.offsetTop - 20, behavior: 'smooth'}); });

generateXmlBtn.addEventListener('click', ()=> generateXML(window.__pulse_sitemap || []));

// show subscribe modal after scroll 20% (once) let subShown = false; function onScrollShowSubscribe(){ const scrolled = window.scrollY || window.pageYOffset; const docH = document.documentElement.scrollHeight - window.innerHeight; const ratio = docH>0 ? scrolled/docH : 0; if(ratio > 0.20 && !subShown){ subShown = true; subscribeModal.classList.remove('hidden'); window.removeEventListener('scroll', onScrollShowSubscribe); } } window.addEventListener('scroll', onScrollShowSubscribe);

closeSubscribe.addEventListener('click', ()=> subscribeModal.classList.add('hidden'));

// init await render(); // refresh while open (low cost) setInterval(render, 1000 * 60 * 10);

// ========================= // Auto-translate (hidden UI) // We'll load Google Translate element and programmatically set target language to visitor language. // Note: this uses Google's public translate widget. window.googleTranslateElementInit = function() { try { new google.translate.TranslateElement({ pageLanguage: 'id', layout: google.translate.TranslateElement.InlineLayout.SIMPLE, autoDisplay: false }, 'google_translate_element');

  // small delay then auto-select language matching navigator.language
  setTimeout(()=>{
    try {
      const lang = (navigator.language || navigator.userLanguage || 'en').split('-')[0];
      // find select within the iframe
      const frame = document.querySelector('.goog-te-menu-frame');
      if(frame){
        // attempt to change language via queryParameter trick (best-effort)
        // fallback: add url param to use translate.googleapis if possible
        // Many browsers block direct interaction; we attempt select change on the widget select if present
        const sel = document.querySelector('select.goog-te-combo');
        if(sel){
          sel.value = lang;
          sel.dispatchEvent(new Event('change'));
        }
      } else {
        const sel = document.querySelector('select.goog-te-combo');
        if(sel){
          sel.value = lang;
          sel.dispatchEvent(new Event('change'));
        }
      }
    } catch(e){/*fail silently*/ }
  }, 900);
} catch(e){}

}; (function(){ var gt = document.createElement('script'); gt.type='text/javascript'; gt.async=true; gt.src = 'https://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit'; document.head.appendChild(gt); })();

// ========================= // Auto dark/light mode based on visitor local time (00-06 light, 07-18 light, else dark) + prefers-color-scheme fallback function applyThemeByTime(){ try { const now = new Date(); const h = now.getHours(); // default: day 7-18 => light, else dark const isLight = (h >= 7 && h <= 18); if(window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches){ // respect user preference if system set to dark // but still apply time-based as primary (user preference will override if we invert) } if(isLight){ document.documentElement.classList.add('light'); } else { document.documentElement.classList.remove('light'); } } catch(e){} } applyThemeByTime();

// accessibility: respects prefers-reduced-motion already via CSS })(); </script>

"""

write file

path = "/mnt/data/v8p_pulse_v8_3_pagemode.html" with open(path, "w", encoding="utf-8") as f: f.write(html)

print("File written to:", path) print("Download link: sandbox:" + path)</!doctype>]]></b:widget-setting> </b:widget-settings> <b:includable id='main'>

<b:if cond='data:title != ""'>

data:title/

</b:if>

<b:include name='quickedit'/> </b:includable> </b:widget> <b:widget id='HTML4' locked='false' title='' type='HTML'> <b:widget-settings> <b:widget-setting name='content'><![CDATA[<style> .mini-subscribe { position: fixed; right: 20px; bottom: 90px; background: red; color: #fff; font-size: 14px; padding: 6px 14px; border-radius: 30px; text-decoration: none; font-weight: bold; z-index: 9999; display: inline-block !important; } </style>

Subscribe ]]></b:widget-setting> </b:widget-settings> <b:includable id='main'>

<b:if cond='data:title != ""'>

data:title/

</b:if>

<b:include name='quickedit'/> </b:includable> </b:widget> <b:widget id='HTML6' locked='false' title='' type='HTML'> <b:widget-settings> <b:widget-setting name='content'><![CDATA[

<iframe src="https://www.youtube.com/embed/videoseries?list=PLSBXhP3KAxsDygkrgu8roI7YsOeUEUA4w&autoplay=1&mute=1&controls=0" frameborder="0" allow="autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen> </iframe>
<style> .yt-floating-mini { position: fixed; bottom: 15px; /* jarak dari bawah layar */ right: 70px; /* jarak dari kanan layar */ width: 100px; /* mirip tombol subscribe */ border-radius: 30px; padding: 2px; background: linear-gradient(90deg, red, orange, yellow, green, cyan, blue, violet, red); background-size: 400% 400%; animation: rainbow 6s linear infinite, glow 2s ease-in-out infinite alternate; z-index: 9999; box-shadow: 0 2px 8px rgba(0,0,0,0.35); } .yt-floating-mini iframe { width: 100%; height: 40px; /* tinggi kecil seperti tombol */ border: none; border-radius: 30px; display: block; } @keyframes rainbow { 0% {background-position: 0% 50%;} 50% {background-position: 100% 50%;} 100% {background-position: 0% 50%;} } @keyframes glow { 0% {box-shadow: 0 0 4px rgba(255,255,255,0.3);} 100% {box-shadow: 0 0 15px rgba(255,255,255,0.9);} } </style>]]>
</b:widget-settings>
<b:includable id='main'>

<b:if cond='data:title != ""'>

data:title/

</b:if>

<b:include name='quickedit'/> </b:includable> </b:widget> </b:section-contents><b:section-contents id='footer-2-1'> <b:widget id='PageList2' locked='false' title='Halaman' type='PageList'> <b:widget-settings> <b:widget-setting name='pageListJson'></b:widget-setting> <b:widget-setting name='homeTitle'>Beranda</b:widget-setting> </b:widget-settings> <b:includable id='main'> <b:if cond='data:title != ""'>

data:title/

</b:if>

&#9660;



*

*
<textarea class='contact-form-email-message' cols='25' expr:id='data:widget.instanceId + "_contact-form-email-message"' name='email-message' rows='5'/>

10 true true ALL_TIME

<script> (async function(){ const FEED_URL = 'https://www.youtube.com/feeds/videos.xml?channel_id=UCTHGlP7T12oHv2QHDuw0C3g'; const PROXY = 'https://api.allorigins.win/get?url=' + encodeURIComponent(FEED_URL); const container = document.getElementById('ytVideos');

try { const res = await fetch(PROXY); const data = await res.json(); const parser = new DOMParser(); const xml = parser.parseFromString(data.contents, 'application/xml'); const entries = xml.getElementsByTagName('entry');

const maxVideos = 6;
container.innerHTML = '';

for (let i = 0; i < Math.min(entries.length, maxVideos); i++) {
  const entry = entries[i];
  const title = entry.getElementsByTagName('title')[0].textContent;
  const link = entry.getElementsByTagName('link')[0].getAttribute('href');
  const idFull = entry.getElementsByTagName('id')[0].textContent;
  const videoId = idFull.split(':').pop();
  const thumb = `https://img.youtube.com/vi/${videoId}/hqdefault.jpg`;

  const videoCard = document.createElement('div');
  videoCard.style.cssText = `
    border-radius:12px;
    overflow:hidden;
    background:#f8f9fa;
    box-shadow:0 0 8px rgba(0,0,0,0.1);
    transition:transform 0.3s ease, box-shadow 0.3s ease;
  `;
  videoCard.innerHTML = `
    <a href="${link}" target="_blank" style="text-decoration:none;color:inherit;">
      <img src="${thumb}" alt="${title}" style="width:100%;display:block;">
      <div style="padding:10px;">
        <h4 style="font-size:15px;margin:0;">${title}</h4>
      </div>
    </a>
  `;
  videoCard.onmouseover = () => videoCard.style.transform = 'scale(1.03)';
  videoCard.onmouseout = () => videoCard.style.transform = 'scale(1)';
  container.appendChild(videoCard);
}

} catch (err) { container.innerHTML = '

Gagal memuat video ๐Ÿ˜ข

'; console.error('Feed error:', err); } })(); </script>]]></b:widget-setting> </b:widget-settings> <b:includable id='main'>

<b:if cond='data:title != ""'>

data:title/

</b:if>

<b:include name='quickedit'/> </b:includable> </b:widget> <b:widget id='Subscribe1' locked='false' title='Langganan' type='Subscribe'> <b:includable id='main'>

      <div expr:class='&quot;subscribe expanded subscribe-type-&quot; + data:feed.type' expr:id='&quot;SW_READER_LIST_&quot; + data:widgetId + data:feed.type' style='display:none;'>
        <div class='top'>
          <span class='inner' expr:onclick='&quot;return(_SW_toggleReaderList(event, \&quot;&quot; + data:widgetId +data:feed.type + &quot;\&quot;));&quot;'>
            <img class='subscribe-dropdown-arrow' expr:src='data:arrowDropdownImg'/>
            <img align='absmiddle' alt='' border='0' class='feed-icon' expr:src='data:feedIconImg'/>
            <data:feed.title/>
          </span>

          <div class='feed-reader-links'>
            <a class='feed-reader-link' expr:href='&quot;https://www.netvibes.com/subscribe.php?url=&quot; + data:feed.encodedUrl' target='_blank'>
              <img expr:src='data:imagePathBase + &quot;subscribe-netvibes.png&quot;'/>
            </a>
            <a class='feed-reader-link' expr:href='&quot;https://add.my.yahoo.com/content?url=&quot; + data:feed.encodedUrl' target='_blank'>
              <img expr:src='data:imagePathBase + &quot;subscribe-yahoo.png&quot;'/>
            </a>
            <a class='feed-reader-link' expr:href='data:feed.url' target='_blank'>
              <img align='absmiddle' class='feed-icon' expr:src='data:feedIconImg'/>
              Atom
            </a>
          </div>

        </div>
        <div class='bottom'/>
      </div>

      <div class='subscribe' expr:id='&quot;SW_READER_LIST_CLOSED_&quot; + data:widgetId +data:feed.type' expr:onclick='&quot;return(_SW_toggleReaderList(event, \&quot;&quot; + data:widgetId +data:feed.type + &quot;\&quot;));&quot;'>
        <div class='top'>
           <span class='inner'>
             <img class='subscribe-dropdown-arrow' expr:src='data:arrowDropdownImg'/>
             <span expr:onclick='&quot;return(_SW_toggleReaderList(event, \&quot;&quot; + data:widgetId +data:feed.type + &quot;\&quot;));&quot;'>
               <img align='absmiddle' alt='' border='0' class='feed-icon' expr:src='data:feedIconImg'/>
               <data:feed.title/>
             </span>
           </span>
         </div>
        <div class='bottom'/>
      </div>

    </div>
  </b:loop>

  <div style='clear:both'/>

</div>

<b:include name='quickedit'/> </b:includable> </b:widget> <b:widget id='Stats1' locked='false' title='Total Tayangan Halaman' type='Stats'> <b:widget-settings> <b:widget-setting name='showGraphicalCounter'>false</b:widget-setting> <b:widget-setting name='showAnimatedCounter'>false</b:widget-setting> <b:widget-setting name='showSparkline'>true</b:widget-setting> <b:widget-setting name='sparklineStyle'>BLACK_TRANSPARENT</b:widget-setting> <b:widget-setting name='timeRange'>ALL_TIME</b:widget-setting> </b:widget-settings> <b:includable id='main'> <b:if cond='data:title != ""'>

data:title/

</b:if>

<script src='https://www.gstatic.com/charts/loader.js' type='text/javascript'/>
<style> :root { --primary-color: #2196f3; --bg: #ffffff; --text: #222; --muted: #666; --radius: 10px; --shadow: 0 6px 20px rgba(33,33,33,0.08); --max-width: 820px; } body.dark-mode { --bg: #121212; --text: #eee; --muted: #bbb; --shadow: 0 6px 18px rgba(0,0,0,0.4); } #aleo-chat-root { max-width: var(--max-width); margin: 28px auto; font-family: system-ui, -apple-system, "Segoe UI", Roboto, Arial; color: var(--text); position: relative; } .aleo-chat { border-radius: var(--radius); box-shadow: var(--shadow); overflow: hidden; border: 1px solid rgba(0,0,0,0.05); display: flex; flex-direction: column; background: var(--bg); } .aleo-header { display: flex; justify-content: space-between; align-items: center; padding: 14px 16px; background: linear-gradient(90deg, var(--primary-color), rgba(0,0,0,0.1)); color: white; } .aleo-header h3 { margin:0; font-size:16px; font-weight:600; } .aleo-header .btns { display:flex; gap:8px; align-items:center; } .aleo-header button, .aleo-header a.subscribe { background: rgba(255,255,255,0.15); color: white; border: none; border-radius: 6px; padding: 6px 10px; font-size: 12px; cursor: pointer; text-decoration: none; display:inline-flex; align-items:center; gap:8px; } .aleo-header button:hover, .aleo-header a.subscribe:hover { background: rgba(255,255,255,0.28); } .aleo-body { padding: 14px; min-height: 140px; max-height: 420px; overflow-y: auto; background: linear-gradient(180deg, rgba(0,0,0,0.02), transparent); } .msg { margin-bottom: 12px; display:flex; gap:8px; align-items:flex-end; } .msg.user { justify-content: flex-end; } .bubble { max-width: 84%; padding: 10px 12px; border-radius: 12px; line-height: 1.35; font-size: 14px; word-break: break-word; } .bubble.user { background: var(--primary-color); color: white; border-bottom-right-radius: 6px; } .bubble.bot { background: #f5f7fb; color: var(--text); border-bottom-left-radius: 6px; } body.dark-mode .bubble.bot { background: #1e1e1e; color: #eee; } .aleo-input { display:flex; gap:8px; padding: 12px; border-top: 1px solid rgba(0,0,0,0.04); background: var(--bg); } .aleo-input input[type="text"]{ flex:1; padding:10px 12px; border-radius: 8px; border:1px solid #e6e9ef; font-size:14px; background: var(--bg); color: var(--text); } body.dark-mode .aleo-input input { border-color: #333; } .aleo-input button { background: var(--primary-color); color: white; border: none; padding: 9px 14px; border-radius: 8px; font-weight:600; cursor: pointer; } .aleo-footer { font-size:12px; color: var(--muted); padding: 8px 12px; text-align: right; background: var(--bg); } /* floating mini button (optional) */ .aleo-floating { position: fixed; right: 18px; bottom: 18px; z-index: 9999; } .aleo-toggle { width:56px;height:56px;border-radius:50%;display:flex;align-items:center;justify-content:center; background:var(--primary-color);color:#fff;border:none;box-shadow:var(--shadow);cursor:pointer;font-weight:700; border: 3px solid rgba(255,255,255,0.06); } /* responsive */ @media (max-width:600px) { #aleo-chat-root { margin: 16px; } .aleo-body { max-height: 320px; } } </style> <script> (function(){ // ---------- CONFIG ---------- // Public channel link - converted from the studio link you gave const youtubeChannel = "https://www.youtube.com/channel/UCTHGlP7T12oHv2QHDuw0C3g"; const youtubeSubscribeText = "Dukung Aleo's Tube di YouTube โ€” klik Subscribe!"; // Q&A const qaList = [ { q: ["apa itu aleo's tube","tentang aleo","siapa aleo"], a: "Aleo's Tube adalah blog vlog anak rantau Indonesia โ€” tempat berbagi kisah, pengalaman, dan keseharian hidup di luar negeri." }, { q: ["siapa pemilik blog","siapa yang buat blog ini"], a: "Blog ini dikelola oleh Aleo, anak rantau Indonesia yang suka berbagi cerita dan tips hidup mandiri." }, { q: ["tinggal di mana","lokasi aleo"], a: "Aleo sedang merantau di luar negeri dan sering berbagi pengalaman dari sana." }, { q: ["jadwal upload","posting baru","kapan update"], a: "Biasanya ada posting atau vlog baru setiap minggu. Cek bagian 'Posting Terbaru' ya!" }, { q: ["kategori konten","isi blog"], a: "Konten blog ini mencakup vlog harian, motivasi hidup, pengalaman merantau, dan tips menarik." }, { q: ["komentar tidak muncul","cara komentar"], a: "Pastikan kamu login dengan akun Google sebelum berkomentar. Kadang butuh waktu untuk moderasi." }, { q: ["follow","subscribe","langganan"], a: "Kamu bisa berlangganan lewat tombol 'Ikuti' di sidebar atau tombol Subscribe di channel YouTube kami." }, { q: ["share","bagikan"], a: "Gunakan tombol share di bawah postingan untuk membagikan ke media sosial." }, { q: ["lemot","error","tidak bisa dibuka"], a: "Coba muat ulang halaman atau hapus cache browser kamu. Jika masih error, laporkan di halaman Kontak." }, { q: ["tema blog","desain"], a: "Tema blog ini berdesain minimalis, cepat, dan responsif di semua perangkat." }, { q: ["kerjasama","endorse","afiliasi"], a: "Untuk kerja sama, silakan kirim email ke kontak@aleostube.com (ubah dengan email kamu sendiri)." }, { q: ["kontak","hubungi","email"], a: "Hubungi Aleo lewat halaman Kontak di menu atas atau kirim email langsung ke kontak ๐Ÿ‘‰aleostube@gmail.com." }, { q: ["dukungan","donasi","support"], a: "Kamu bisa dukung blog ini dengan share, komentar positif, atau subscribe ke channel YouTube kami ๐Ÿ™" }, { q: ["motivasi hidup","semangat"], a: "Terus semangat! Hidup adalah perjalanan yang berharga, nikmati setiap langkahnya โœจ" }, { q: ["terima kasih","makasih"], a: "Sama-sama! Terima kasih sudah mampir ke Aleoโ€™s Tube ๐Ÿ’™" }, { q: ["bye","dadah","sampai jumpa"], a: "Sampai jumpa lagi! Jangan lupa mampir ke postingan terbaru ya ๐Ÿ‘‹" } ]; const defaultAnswer = "Maaf, saya belum punya jawaban untuk itu ๐Ÿ˜…. Coba tanyakan hal lain atau kunjungi halaman Kontak untuk info lebih lengkap."; const storageKey = "aleo_chat_history_v6"; // ---------- UTIL ---------- function normalize(text){ return (text||"").toLowerCase().replace(/[^\w\s']/g, "").trim(); } function findAnswer(text){ const t = normalize(text); for (const item of qaList){ for (const kw of item.q){ if (t.includes(normalize(kw))) return item.a; } } return null; } // ---------- TTS (santai & natural) ---------- function speak(text){ if (!window.speechSynthesis) return; const u = new SpeechSynthesisUtterance(text); u.lang = "id-ID"; u.pitch = 1.05; u.rate = 1.0; u.volume = 1; const voices = speechSynthesis.getVoices(); const voice = voices.find(v => v.lang && v.lang.startsWith("id")) || voices[0]; if (voice) u.voice = voice; window.speechSynthesis.cancel(); window.speechSynthesis.speak(u); } // ---------- BUILD UI ---------- const root = document.getElementById('aleo-chat-root'); root.innerHTML = `

Aleoโ€™s Tube โ€” Chat Bantuan

Kirim
๐ŸŽ™๏ธ Chat otomatis โ€” suara santai โ€ข Auto-translate tersedia
AT
`; const chatWrap = root.querySelector('#aleo-chat'); const bodyEl = root.querySelector('#chat-body'); const inputEl = root.querySelector('#chat-input'); const sendBtn = root.querySelector('#chat-send'); const clearBtn = root.querySelector('#clearChat'); const subscribeBtn = root.querySelector('#subscribeBtn'); const floating = root.querySelector('#aleo-floating'); const openBtn = root.querySelector('#aleo-open'); // ---------- HISTORY ---------- function saveHistory(){ localStorage.setItem(storageKey, bodyEl.innerHTML); } function loadHistory(){ const saved = localStorage.getItem(storageKey); if (saved) bodyEl.innerHTML = saved; else { appendBot("Halo ๐Ÿ‘‹! Saya asisten santai Aleoโ€™s Tube. Mau tanya apa hari ini?", true, false); // after greeting, show subscribe nudge setTimeout(()=> appendBot(youtubeSubscribeText + " โ€” klik tombol Subscribe di atas.", true), 900); } } function clearHistory(){ localStorage.removeItem(storageKey); bodyEl.innerHTML = ""; appendBot("Percakapan dihapus. Yuk mulai chat baru ๐Ÿ‘‹", true, false); } // ---------- MESSAGES ---------- function appendUser(text){ const wrap = document.createElement('div'); wrap.className = 'msg user'; const b = document.createElement('div'); b.className='bubble user'; b.innerText = text; wrap.appendChild(b); bodyEl.appendChild(wrap); bodyEl.scrollTop = bodyEl.scrollHeight; saveHistory(); } function appendBot(text, speakNow=true, save=true){ const wrap = document.createElement('div'); wrap.className = 'msg bot'; const b = document.createElement('div'); b.className='bubble bot'; b.innerText = text; wrap.appendChild(b); bodyEl.appendChild(wrap); bodyEl.scrollTop = bodyEl.scrollHeight; if (speakNow) speak(text); if (save) saveHistory(); } // ---------- SEND HANDLER ---------- function handleSend(){ const t = inputEl.value.trim(); if (!t) return; appendUser(t); inputEl.value = ''; // special: if user asks to subscribe or mentions youtube const tl = normalize(t); if (tl.includes("subscribe") || tl.includes("youtube") || tl.includes("channel")) { setTimeout(()=> appendBot("Makasih! Kamu bisa subscribe di sini: " + youtubeChannel + " โ€” terima kasih atas dukungannya! ๐Ÿ™"), 400); return; } const ans = findAnswer(t) || defaultAnswer; setTimeout(()=> appendBot(ans, true), 450 + Math.random()*300); } sendBtn.addEventListener('click', handleSend); inputEl.addEventListener('keydown', e => { if (e.key === 'Enter') handleSend(); }); clearBtn.addEventListener('click', clearHistory); // Floating open/close let collapsed = false; function showFloating(){ floating.style.display = ''; chatWrap.style.display = 'none'; collapsed = true; } function showChat(){ chatWrap.style.display = ''; floating.style.display = 'none'; collapsed = false; } openBtn && openBtn.addEventListener('click', ()=> showChat()); // If screen small, show floating toggle if (window.innerWidth <= 900) { showFloating(); } // ---------- AUTO TRANSLATE (Google Translate widget) ---------- // We'll load the Google Translate element and try to auto-select visitor language. // NOTE: This uses the official Google Translate website widget (client-side). function loadGoogleTranslate(){ if (window.google && window.google.translate) return initGTranslate(); const s = document.createElement('script'); s.src = "//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"; s.async = true; document.head.appendChild(s); window.googleTranslateElementInit = initGTranslate; } function initGTranslate(){ try { new google.translate.TranslateElement({ pageLanguage: 'id', autoDisplay: false }, 'google_translate_element'); // attempt to auto-select the user's language from navigator.language const userLang = (navigator.language || navigator.userLanguage || 'en').split('-')[0]; setTimeout(()=> trySetTranslateLang(userLang), 600); } catch(e){ // ignore if widget blocked console.warn("Google Translate init failed", e); } } function trySetTranslateLang(lang){ // widget creates a select in iframe; try to find and set it const interval = setInterval(()=>{ const gtFrame = document.querySelector('iframe.goog-te-menu-frame'); if (!gtFrame) return; try { const doc = gtFrame.contentDocument || gtFrame.contentWindow.document; const select = doc.querySelector('select.goog-te-combo'); if (select) { // map two-letter to available select options const opt = Array.from(select.options).find(o => o.value.indexOf(lang) === 0 || o.value.indexOf(lang+'-') === 0); if (opt) { select.value = opt.value; // dispatch change const ev = doc.createEvent('HTMLEvents'); ev.initEvent('change', true, true); select.dispatchEvent(ev); clearInterval(interval); } } } catch(err){ // cross-origin may block until iframe loaded; ignore } }, 500); // Stop trying after 8s setTimeout(()=> clearInterval(interval), 8000); } // Expose a small API to toggle translate manually window.AleoChatTranslate = { enable: loadGoogleTranslate }; // ---------- INIT ---------- loadHistory(); // Auto-load Google Translate (try) loadGoogleTranslate(); // small helpful nudge: when chat loads, show subscribe call-to-action in UI (accessible) subscribeBtn.addEventListener('click', function(){ // Also announce in chat appendBot("Makasih! Kalau sudah subscribe, tulis 'sudah subscribe' ya โ€” biar saya tahu kamu dukung channel ini ๐Ÿ™‚", false); }); // ensure voices list loaded for some browsers if (typeof speechSynthesis !== "undefined" && speechSynthesis.onvoiceschanged !== undefined) { speechSynthesis.onvoiceschanged = () => {}; } // accessibility: focus input on ctrl/cmd+k document.addEventListener('keydown', function(e){ if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === 'k') { e.preventDefault(); inputEl.focus(); } }); })(); </script>]]>
</b:widget-settings>
<b:includable id='main'>

<b:if cond='data:title != ""'>

data:title/

</b:if>

<b:include name='quickedit'/> </b:includable> </b:widget> <b:widget id='HTML9' locked='false' title='' type='HTML'> <b:widget-settings> <b:widget-setting name='content'><![CDATA[

<style type='text/css'></style>
ร—

๐ŸŒŸ Ikuti Blog Ini!

๐ŸŒด
Aleoโ€™s Tube Daily Vlog
Cerita keseharian anak rantau di perkebunan sawit & petualangan seru di desa!
๐Ÿ“งIkuti Blog <script> ๐Ÿ‘‹ </script>
]]>

<b:include name='quickedit'/> </b:includable> </b:widget> <b:widget id='HTML10' locked='false' title='' type='HTML'> <b:widget-settings> <b:widget-setting name='content'><![CDATA[<style> /* Wrapper grid */ .aleo-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 20px; max-width: 1200px; margin: 0 auto; padding: 20px; }

/* Card styling */ .aleo-card { background: #11152a; border-radius: 12px; padding: 16px; color: #f1f1f1; box-shadow: 0 4px 15px rgba(0,180,255,0.2); transition: transform 0.3s, box-shadow 0.3s; }

.aleo-card:hover { transform: translateY(-5px); box-shadow: 0 8px 25px rgba(0,180,255,0.4); }

.aleo-card img { max-width: 100%; border-radius: 8px; display: block; margin-bottom: 12px; }

.aleo-card h2 { font-size: 1.2rem; margin: 0 0 10px 0; color: #00b0ff; }

.aleo-card p { font-size: 0.95rem; line-height: 1.4; } </style>

<script> // Ambil semua post-body dan title dari blog const posts = document.querySelectorAll('.post'); const grid = document.getElementById('aleoGrid'); posts.forEach(post => { const card = document.createElement('div'); card.className = 'aleo-card'; // Ambil judul const title = post.querySelector('.post-title')?.innerHTML || ''; const body = post.querySelector('.post-body')?.innerHTML || ''; card.innerHTML = `

${title}

${body}
`; grid.appendChild(card); }); // Sembunyikan postingan asli supaya tidak dobel posts.forEach(p => p.style.display = 'none'); </script>]]>
</b:widget-settings>
<b:includable id='main'>

<b:if cond='data:title != ""'>

data:title/

</b:if>

<b:include name='quickedit'/> </b:includable> </b:widget> </b:section-contents>

๐ŸŒ Terhubung dengan Blog Resmi

Kode ini disinkronkan langsung dengan blog Aleoโ€™s Tube Store
yang menampilkan cerita, vlog, dan komentar dari Aleoโ€™s Tube Daily Vlog Anak Rantau.

๐Ÿ’ฌ Sistem komentar Blogger dioptimalkan dan dihubungkan melalui file HTML berikut: /Aleo's-Tube-Daily-Vlog-Anak-Rantau/comments.html


ยฉ 2025 Aleoโ€™s Tube Store โ€” Semua hak dilindungi
Dibangun dengan โค๏ธ oleh komunitas vlog anak rantau.