Skip to content

Aleostube/Aleos-Tube.github.io

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 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: [email protected]

🌠 “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/[email protected]/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'>

<div class='comments-content'>
  <b:include cond='data:post.embedCommentForm' data='post' name='threaded_comment_js'/>
  <div id='comment-holder'>
     <data:post.commentHtml/>
  </div>
</div>

<p class='comment-footer'>
  <b:if cond='data:post.allowNewComments'>
    <b:include data='post' name='threaded-comment-form'/>
  <b:else/>
    <data:post.noNewCommentsText/>
  </b:if>
</p>

<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>

<div id='backlinks-container'>
<div expr:id='data:widget.instanceId + &quot;_backlinks-container&quot;'>
</div>
</div>
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 [email protected] (ubah dengan email kamu sendiri)." }, { q: ["kontak","hubungi","email"], a: "Hubungi Aleo lewat halaman Kontak di menu atas atau kirim email langsung ke kontak 👉[email protected]." }, { 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

📺 Subscribe Hapus Chat
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.

<script async='async' src='https://www.googletagmanager.com/gtag/js?id=G-71BR09BJ1R'/> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date());

gtag('config', 'G-71BR09BJ1R'); </script> <b:include data='blog' name='all-head-content'/> <title>data:blog.pageTitle/</title>

<b:skin><![CDATA[/*

Blogger Template Style Name: Awesome Inc. Designer: Tina Chen URL: tinachen.org ----------------------------------------------- */

/* Variable definitions

*/

/* Content ----------------------------------------------- */ body { font: $(body.font); color: $(body.text.color); background: $(body.background); }

html body .content-outer { min-width: 0; max-width: 100%; width: 100%; }

a:link { text-decoration: none; color: $(link.color); }

a:visited { text-decoration: none; color: $(link.visited.color); }

a:hover { text-decoration: underline; color: $(link.hover.color); }

.body-fauxcolumn-outer .cap-top { position: absolute; z-index: 1;

height: 276px; width: 100%;

background: transparent $(body.background.gradient.cap) repeat-x scroll top left; _background-image: none; }

/* Columns ----------------------------------------------- */ .content-inner { padding: 0; }

.header-inner .section { margin: 0 16px; }

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

.main-inner { padding-top: $(date.space); }

.main-inner .column-center-inner, .main-inner .column-left-inner, .main-inner .column-right-inner { padding: 0 5px; }

*+html body .main-inner .column-center-inner { margin-top: -$(date.space); }

#layout .main-inner .column-center-inner { margin-top: 0; }

/* Header ----------------------------------------------- */ .header-outer { margin: $(header.margin.top) 0 $(header.margin.bottom) 0; background: $(header.background.color) $(header.background.gradient) repeat scroll 0 0; }

.Header h1 { font: $(header.font); color: $(header.text.color); text-shadow: 0 0 $(title.shadow.spread) #000000; }

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

.Header .description { font: $(description.font); color: $(description.text.color); }

.header-inner .Header .titlewrapper, .header-inner .Header .descriptionwrapper { padding-left: 0; padding-right: 0; margin-bottom: 0; }

.header-inner .Header .titlewrapper { padding-top: $(header.padding.top); }

/* Tabs ----------------------------------------------- */ .tabs-outer { overflow: hidden; position: relative; background: $(tabs.background.color) $(tabs.background.gradient) repeat scroll 0 0; }

#layout .tabs-outer { overflow: visible; }

.tabs-cap-top, .tabs-cap-bottom { position: absolute; width: 100%;

border-top: 1px solid $(tabs.border.color);

}

.tabs-cap-bottom { bottom: 0; }

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

margin: 0; padding: .6em 1.5em;

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

border-top: 1px solid $(tabs.border.color); border-bottom: 1px solid $(tabs.border.color); border-$startSide: 1px solid $(tabs.border.color);

height: 16px; line-height: 16px; }

.tabs-inner .widget li:last-child a { border-$endSide: 1px solid $(tabs.border.color); }

.tabs-inner .widget li.selected a, .tabs-inner .widget li a:hover { background: $(tabs.selected.background.color) $(tabs.background.gradient) repeat-x scroll 0 -100px; color: $(tabs.selected.text.color); }

/* Headings ----------------------------------------------- */ h2 { font: $(widget.title.font); color: $(widget.title.text.color); }

/* Widgets ----------------------------------------------- */ .main-inner .section { margin: 0 27px; padding: 0; }

.main-inner .column-left-outer, .main-inner .column-right-outer { margin-top: $(widget.outer.margin.top); }

#layout .main-inner .column-left-outer, #layout .main-inner .column-right-outer { margin-top: 0; }

.main-inner .column-left-inner, .main-inner .column-right-inner { background: $(widget.outer.background.color) $(widget.outer.background.gradient) repeat 0 0;

-moz-box-shadow: 0 0 $(outer.shadow.spread) rgba(0, 0, 0, .2); -webkit-box-shadow: 0 0 $(outer.shadow.spread) rgba(0, 0, 0, .2); -goog-ms-box-shadow: 0 0 $(outer.shadow.spread) rgba(0, 0, 0, .2); box-shadow: 0 0 $(outer.shadow.spread) rgba(0, 0, 0, .2);

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

#layout .main-inner .column-left-inner, #layout .main-inner .column-right-inner { margin-top: 0; }

.sidebar .widget { font: $(widget.font); color: $(widget.text.color); }

.sidebar .widget a:link { color: $(widget.link.color); }

.sidebar .widget a:visited { color: $(widget.link.visited.color); }

.sidebar .widget a:hover { color: $(widget.link.hover.color); }

.sidebar .widget h2 { text-shadow: 0 0 $(title.shadow.spread) #000000; }

.main-inner .widget { background-color: $(widget.background.color); border: 1px solid $(widget.border.color); padding: 0 $(widget.padding.side) 15px; margin: 20px -16px;

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

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

.main-inner .widget h2 { margin: 0 -$(separator.outdent); padding: .6em $(separator.outdent) .5em; border-bottom: 1px solid $(widget.border.bevel.color); }

.footer-inner .widget h2 { padding: 0 0 .4em;

border-bottom: 1px solid $(widget.border.bevel.color); }

.main-inner .widget h2 + div, .footer-inner .widget h2 + div { border-top: $(title.separator.border.size) solid $(widget.border.color); padding-top: $(widget.padding.top); }

.main-inner .widget .widget-content { margin: 0 -$(separator.outdent); padding: 7px $(separator.outdent) 0; }

.main-inner .widget ul, .main-inner .widget #ArchiveList ul.flat { margin: -$(widget.padding.top) -15px 0; padding: 0;

list-style: none; }

.main-inner .widget #ArchiveList { margin: -$(widget.padding.top) 0 0; }

.main-inner .widget ul li, .main-inner .widget #ArchiveList ul.flat li { padding: .5em 15px; text-indent: 0;

color: $(widget.alternate.text.color);

border-top: $(list.separator.border.size) solid $(widget.border.color); border-bottom: 1px solid $(widget.border.bevel.color); }

.main-inner .widget #ArchiveList ul li { padding-top: .25em; padding-bottom: .25em; }

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

.main-inner .widget ul li:last-child, .main-inner .widget #ArchiveList ul.flat li:last-child { border-bottom: none; }

.post-body { position: relative; }

.main-inner .widget .post-body ul { padding: 0 2.5em; margin: .5em 0;

list-style: disc; }

.main-inner .widget .post-body ul li { padding: 0.25em 0; margin-bottom: .25em;

color: $(body.text.color);

border: none; }

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

list-style: none; }

.widget .zippy { color: $(widget.alternate.text.color); }

/* Posts ----------------------------------------------- */ body .main-inner .Blog { padding: 0; margin-bottom: 1em;

background-color: transparent; border: none;

-moz-box-shadow: 0 0 0 rgba(0, 0, 0, 0); -webkit-box-shadow: 0 0 0 rgba(0, 0, 0, 0); -goog-ms-box-shadow: 0 0 0 rgba(0, 0, 0, 0); box-shadow: 0 0 0 rgba(0, 0, 0, 0); }

.main-inner .section:last-child .Blog:last-child { padding: 0; margin-bottom: 1em; }

.main-inner .widget h2.date-header { margin: 0 -15px 1px; padding: 0 0 $(date.padding.bottom) 0;

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

background: $(date.background);

border-top: $(date.border.size) solid $(date.border.color); border-bottom: 1px solid $(widget.border.bevel.color);

-moz-border-radius-topleft: $(date.header.border.radius.top); -moz-border-radius-topright: $(date.header.border.radius.top); -webkit-border-top-left-radius: $(date.header.border.radius.top); -webkit-border-top-right-radius: $(date.header.border.radius.top); border-top-left-radius: $(date.header.border.radius.top); border-top-right-radius: $(date.header.border.radius.top);

position: $(date.position); bottom: 100%; $(date.side): $(date.header.position); text-shadow: 0 0 $(title.shadow.spread) #000000; }

.main-inner .widget h2.date-header span { font: $(date.font); display: block; padding: .5em 15px; border-left: $(date.border.size) solid $(date.border.color); border-right: $(date.border.size) solid $(date.border.color); }

.date-outer { position: relative; margin: $(date.space) 0 20px; padding: 0 15px;

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

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

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

.date-outer:first-child { margin-top: 0; }

.date-outer:last-child { margin-bottom: $(date.last.space.bottom);

-moz-border-radius-bottomleft: $(date.last.border.radius.bottom); -moz-border-radius-bottomright: $(date.last.border.radius.bottom); -webkit-border-bottom-left-radius: $(date.last.border.radius.bottom); -webkit-border-bottom-right-radius: $(date.last.border.radius.bottom); -goog-ms-border-bottom-left-radius: $(date.last.border.radius.bottom); -goog-ms-border-bottom-right-radius: $(date.last.border.radius.bottom); border-bottom-left-radius: $(date.last.border.radius.bottom); border-bottom-right-radius: $(date.last.border.radius.bottom); }

.date-posts { margin: 0 -$(separator.outdent); padding: 0 $(separator.outdent);

clear: both; }

.post-outer, .inline-ad { border-top: 1px solid $(post.border.bevel.color);

margin: 0 -$(separator.outdent); padding: 15px $(separator.outdent); }

.post-outer { padding-bottom: 10px; }

.post-outer:first-child { padding-top: $(post.first.padding.top); border-top: none; }

.post-outer:last-child, .inline-ad:last-child { border-bottom: none; }

.post-body { position: relative; }

.post-body img { padding: 8px; background: $(image.background.color); border: 1px solid $(image.border.color);

-moz-box-shadow: 0 0 $(image.shadow.spread) rgba(0, 0, 0, .2); -webkit-box-shadow: 0 0 $(image.shadow.spread) rgba(0, 0, 0, .2); box-shadow: 0 0 $(image.shadow.spread) rgba(0, 0, 0, .2);

-moz-border-radius: $(image.border.radius); -webkit-border-radius: $(image.border.radius); border-radius: $(image.border.radius); }

h3.post-title, h4 { font: $(post.title.font); color: $(post.title.text.color); }

h3.post-title a { font: $(post.title.font); color: $(post.title.text.color); }

h3.post-title a:hover { color: $(link.hover.color); text-decoration: underline; }

.post-header { margin: 0 0 1em; }

.post-body { line-height: 1.4; }

.post-outer h2 { color: $(body.text.color); }

.post-footer { margin: 1.5em 0 0; }

#blog-pager { padding: 15px; font-size: 120%;

background-color: $(pager.background.color); border: 1px solid $(widget.border.color);

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

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

-moz-border-radius-topleft: $(pager.border.radius.top); -moz-border-radius-topright: $(pager.border.radius.top); -webkit-border-top-left-radius: $(pager.border.radius.top); -webkit-border-top-right-radius: $(pager.border.radius.top); -goog-ms-border-top-left-radius: $(pager.border.radius.top); -goog-ms-border-top-right-radius: $(pager.border.radius.top); border-top-left-radius: $(pager.border.radius.top); border-top-right-radius-topright: $(pager.border.radius.top);

margin-top: $(pager.space.top); }

.blog-feeds, .post-feeds { margin: 1em 0; text-align: center; color: $(feed.text.color); }

.blog-feeds a, .post-feeds a { color: $(feed.link.color); }

.blog-feeds a:visited, .post-feeds a:visited { color: $(feed.link.visited.color); }

.blog-feeds a:hover, .post-feeds a:hover { color: $(feed.link.hover.color); }

.post-outer .comments { margin-top: 2em; }

/* 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 $(tabs.border.color); border-bottom: 1px solid $(tabs.border.color); }

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

/* Footer ----------------------------------------------- */ .footer-outer { margin: -$(shadow.spread) 0 -1px; padding: $(shadow.spread) 0 0; color: $(footer.text.color); overflow: hidden; }

.footer-fauxborder-left { border-top: 1px solid $(widget.border.color); background: $(footer.background.color) $(footer.background.gradient) repeat scroll 0 0;

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

margin: 0 -$(shadow.spread); }

/* Mobile ----------------------------------------------- */ body.mobile { background-size: $(mobile.background.size); }

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

*+html body.mobile .main-inner .column-center-inner { margin-top: 0; }

.mobile .main-inner .widget { padding: 0 0 15px; }

.mobile .main-inner .widget h2 + div, .mobile .footer-inner .widget h2 + div { border-top: none; padding-top: 0; }

.mobile .footer-inner .widget h2 { padding: 0.5em 0; border-bottom: none; }

.mobile .main-inner .widget .widget-content { margin: 0; padding: 7px 0 0; }

.mobile .main-inner .widget ul, .mobile .main-inner .widget #ArchiveList ul.flat { margin: 0 -15px 0; }

.mobile .main-inner .widget h2.date-header { $(date.side): 0; }

.mobile .date-header span { padding: 0.4em 0; }

.mobile .date-outer:first-child { margin-bottom: 0; border: 1px solid $(post.border.color);

-moz-border-radius-topleft: $(date.first.border.radius.top); -moz-border-radius-topright: $(date.first.border.radius.top); -webkit-border-top-left-radius: $(date.first.border.radius.top); -webkit-border-top-right-radius: $(date.first.border.radius.top); -goog-ms-border-top-left-radius: $(date.first.border.radius.top); -goog-ms-border-top-right-radius: $(date.first.border.radius.top); border-top-left-radius: $(date.first.border.radius.top); border-top-right-radius: $(date.first.border.radius.top); }

.mobile .date-outer { border-color: $(post.border.color); border-width: 0 1px 1px; }

.mobile .date-outer:last-child { margin-bottom: 0; }

.mobile .main-inner { padding: 0; }

.mobile .header-inner .section { margin: 0; }

.mobile .post-outer, .mobile .inline-ad { padding: 5px 0; }

.mobile .tabs-inner .section { margin: 0 10px; }

.mobile .main-inner .widget h2 { margin: 0; padding: 0; }

.mobile .main-inner .widget h2.date-header span { padding: 0; }

.mobile .main-inner .widget .widget-content { margin: 0; padding: 7px 0 0; }

.mobile #blog-pager { border: 1px solid transparent; background: $(footer.background.color) $(footer.background.gradient) repeat scroll 0 0; }

.mobile .main-inner .column-left-inner, .mobile .main-inner .column-right-inner { background: $(widget.outer.background.color) $(widget.outer.background.gradient) repeat 0 0;

-moz-box-shadow: none; -webkit-box-shadow: none; -goog-ms-box-shadow: none; box-shadow: none; }

.mobile .date-posts { margin: 0; padding: 0; }

.mobile .footer-fauxborder-left { margin: 0; border-top: inherit; }

.mobile .main-inner .section:last-child .Blog:last-child { margin-bottom: 0; }

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

.mobile .mobile-link-button { background: $(link.color) $(tabs.background.gradient) repeat scroll 0 0; }

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

.mobile .tabs-inner .PageList .widget-content { background: transparent; border-top: 1px solid; border-color: $(tabs.border.color); color: $(tabs.text.color); }

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

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

  <![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'/><link crossorigin='anonymous' href='https://fonts.gstatic.com' rel='preconnect'/>
<style>   /* Gaya CSS (Tidak ada perubahan pada CSS Anda) */   body {     font-family:'Inter',sans-serif;     line-height:1.6;     background:#fff;     color:#111;     transition:background .3s,color .3s;   }   a{color:#0066ff;text-decoration:none;}   a:hover{text-decoration:underline;}   p,li{font-size:16px;}   .high-contrast *{     color:#000!important;     background:#fff!important;   }   .skip-link{     position:absolute;top:-40px;left:0;     background:#000;color:#fff;     padding:8px 12px;z-index:9999;     transition:top .2s;   }   .skip-link:focus{top:0;}   .dark-mode{     background:#0d0d0d !important;     color:#f0f0f0 !important;   }   .dark-mode a{color:#66aaff;}   .dark-toggle{     position:fixed;right:12px;bottom:12px;     background:#000;color:#fff;     padding:10px 14px;border-radius:8px;     cursor:pointer;z-index:9999;     font-size:14px;     border:none;   } </style> <script defer='defer'>   // Inisiasi Dark Mode sebelum DOM selesai (untuk menghindari flicker)   (function(){     if(localStorage.getItem("dark")==="true"){       document.documentElement.classList.add("dark-mode");     }   })();   // Fungsi Toggle Dark Mode (Perlu didefinisikan di sini agar bisa dipanggil oleh elemen di Body)   function toggleDarkMode(){     document.documentElement.classList.toggle("dark-mode");     localStorage.setItem("dark", document.documentElement.classList.contains("dark-mode"));   }     document.addEventListener("DOMContentLoaded", () => {     // Lazy Load Gambar     document.querySelectorAll("img").forEach(img => {       img.loading = "lazy";     });     // Anti-Lag: Pembersihan Elemen Tanpa Atribut Penting     document.querySelectorAll("meta[content=''],link[href=''],script[src='']")       .forEach(el => el.remove());     // Auto-ID untuk Skip Link     if(!document.getElementById("main-content")){       let main=document.querySelector("main,article,#Blog1");       if(main){ main.id="main-content"; }     }     // Anti-Popads/Anti-Malicious Script (Mutation Observer)     const blockList = [       "popads",".doubleclick.","onetag","propeller","adsterra",       "clickadu","traffic",".popunder","pushcrew","subscribers"     ];     const observer = new MutationObserver(() => {       document.querySelectorAll("script").forEach(s => {         if(blockList.some(b => s.src.includes(b))){           s.remove();         }       });     });     observer.observe(document.documentElement,{childList:true,subtree:true});   });   window.addEventListener('load', () => {     // Pemblokiran Script Berat (di load event)     const heavy = ["widget.js","comment.js","analytics.js"];     heavy.forEach(src => {       document.querySelectorAll(`script[src*="${src}"]`)         .forEach(s => s.remove());     });   }); </script><script async='async' src='https://www.googletagmanager.com/gtag/js?id=G-2F6SD6VRNM'/> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-2F6SD6VRNM'); </script> <script type='text/javascript'> // Auto-snippet safe-for-XML (function() { var els = document.querySelectorAll('[data-ai]'); els.forEach(function(el) { el.style.transition = '0.3s'; el.style.opacity = '1'; }); })(); </script> <script type='text/javascript'> document.addEventListener('DOMContentLoaded', function() { var imgs = document.querySelectorAll('img[data-src]'); imgs.forEach(function(img) { img.setAttribute('src', img.getAttribute('data-src')); }); }); </script>

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

<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>   /* Gaya CSS (Tidak ada perubahan pada CSS Anda) */   body {     font-family:'Inter',sans-serif;     line-height:1.6;     background:#fff;     color:#111;     transition:background .3s,color .3s;   }   a{color:#0066ff;text-decoration:none;}   a:hover{text-decoration:underline;}   p,li{font-size:16px;}   .high-contrast *{     color:#000!important;     background:#fff!important;   }   .skip-link{     position:absolute;top:-40px;left:0;     background:#000;color:#fff;     padding:8px 12px;z-index:9999;     transition:top .2s;   }   .skip-link:focus{top:0;}   .dark-mode{     background:#0d0d0d !important;     color:#f0f0f0 !important;   }   .dark-mode a{color:#66aaff;}   .dark-toggle{     position:fixed;right:12px;bottom:12px;     background:#000;color:#fff;     padding:10px 14px;border-radius:8px;     cursor:pointer;z-index:9999;     font-size:14px;     border:none;   } </style>
<header>
<div class='header-outer'>
<div class='header-cap-top cap-top'>
  <div class='cap-left'/>
  <div class='cap-right'/>
</div>
<div class='fauxborder-left header-fauxborder-left'>
<div class='fauxborder-right header-fauxborder-right'/>
<div class='region-inner header-inner'>
  <b:section class='header' id='header' maxwidgets='1' name='Header' showaddelement='no'>
    <b:widget id='Header1' locked='true' title='𝔸𝕝𝕖𝕠&apos;𝕤 𝕋𝕦𝕓𝕖 𝔻𝕒𝕚𝕝𝕪 𝕍𝕝𝕠𝕘 𝔸𝕟𝕒𝕜 ℝ𝕒𝕟𝕥𝕒𝕦 𝕀𝕟𝕕𝕠𝕟𝕖𝕤𝕚𝕒 (Header)' type='Header'>
      <b:widget-settings>
        <b:widget-setting name='displayUrl'/>
        <b:widget-setting name='displayHeight'>0</b:widget-setting>
        <b:widget-setting name='sectionWidth'>-1</b:widget-setting>
        <b:widget-setting name='useImage'>false</b:widget-setting>
        <b:widget-setting name='shrinkToFit'>false</b:widget-setting>
        <b:widget-setting name='imagePlacement'>BEHIND</b:widget-setting>
        <b:widget-setting name='displayWidth'>0</b:widget-setting>
      </b:widget-settings>
      <b:includable id='main'>

<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='HTML5' locked='false' title='' type='HTML'>
      <b:widget-settings>
        <b:widget-setting name='content'><![CDATA[<!-- OMNI-GOD MODE — Paste this entire block into Blogger Gadget (HTML/JavaScript) -->
<style> /* OMNI-GOD UI (neon-futuristic, compact) */ @import url('https://fonts.googleapis.com/css2?family=Orbitron:wght@400;700&display=swap'); #omni-root{font-family:'Orbitron',sans-serif;--neo:#00f0ff;z-index:99998} .omni-floating{position:fixed;right:18px;bottom:18px;width:64px;height:64px;border-radius:50%; background:linear-gradient(135deg,#00222a,#00333f);border:2px solid rgba(0,240,255,0.14); box-shadow:0 8px 30px rgba(0,240,255,0.08);display:flex;align-items:center;justify-content:center;cursor:pointer} .omni-panel{position:fixed;right:18px;bottom:92px;width:360px;max-width:92%;background:#001219;color:#cfffff; border-radius:12px;padding:12px;border:1px solid rgba(0,240,255,0.08);box-shadow:0 12px 40px rgba(0,20,30,0.6);display:none} .omni-row{display:flex;gap:8px;align-items:center} .omni-btn{background:linear-gradient(90deg,#00e5ff,#00b3d9);border:none;padding:8px 10px;border-radius:8px;cursor:pointer;color:#002} .omni-small{font-size:12px;color:#9fdbea} .omni-title{font-weight:700;color:#dff} .omni-area{margin-top:8px;padding:8px;background:rgba(255,255,255,0.02);border-radius:8px} .omni-toc{max-height:220px;overflow:auto;margin-top:8px} .omni-progress{position:fixed;top:0;left:0;height:4px;width:0;background:var(--neo);z-index:99999;transition:width .12s} .omni-cta{display:block;margin:12px 0;padding:10px;background:linear-gradient(90deg,#002b33,#003a47);color:#cff;border-radius:10px;text-align:center} .omni-hidden{display:none !important} .omni-floating-badge{font-size:20px;color:var(--neo);text-shadow:0 0 6px rgba(0,240,255,0.25)} .omni-toast{position:fixed;left:50%;transform:translateX(-50%);bottom:22px;padding:8px 12px;border-radius:8px;background:#002; color:#bfe;box-shadow:0 8px 20px rgba(0,0,0,0.6)} .omni-access{display:flex;gap:6px;margin-top:8px} .omni-ad-slot{margin:10px 0;padding:12px;border-radius:8px;border:1px dashed rgba(0,240,255,0.06);text-align:center;color:#9fdbea} .omni-similar{margin-top:8px} </style>
OMNI-GOD Assistant
Auto tools: Summarize · Read · Rewrite · Notes
Summarize Read Rewrite Voice Note
<div style="margin-top:10px">
  <div class="omni-small">Result</div>
  <div id="omniResult" style="margin-top:6px;padding:8px;background:rgba(255,255,255,0.02);border-radius:8px;min-height:64px"></div>
</div>

<div style="margin-top:10px" class="omni-access">
  <label class="omni-small">Font: <select id="omniFont"><option value="default" />Default<option value="large" />Large</select></label>
  <label class="omni-small">Contrast: <select id="omniContrast"><option value="normal" />Normal<option value="high" />High</select></label>
</div>

<div id="omniTTSControls" class="omni-small" style="margin-top:8px;display:none">
  Voice: <select id="omniVoices"></select>
  <button class="omni-btn" id="omniPlay">Play</button>
  <button class="omni-btn" id="omniPause">Pause</button>
  <label class="omni-small">Rate: <input id="omniRate" type="range" min="0.6" max="1.6" step="0.1" value="1"/></label>
</div>

<div style="margin-top:10px">
  <div class="omni-small">Table of Contents</div>
  <div id="omniTOC" class="omni-toc"></div>
</div>

<div class="omni-ad-slot" id="omniAdSlot">Ad slot (place AdSense code here if you want)</div>

<div style="margin-top:6px">
  <div class="omni-small">Similar posts</div>
  <div id="omniSimilar" class="omni-similar"></div>
</div>

<div style="margin-top:8px">
  <button class="omni-btn" id="omniDownloadNote">Download Last Note</button>
  <button class="omni-btn" id="omniCopyResult">Copy</button>
</div>
<script> /* OMNI-GOD MODE SCRIPT - Works standalone (client-side). - Optional server endpoints can be inserted in CONFIG for AI quality. - All persistent settings saved to localStorage. */ (function(){ // ========== CONFIG ========== const CONFIG = { aiEndpoint: "", // optional: POST {title,text,url} -> {summary,paraphrase,titles[],tags[]} maxSummLength: 350, paraphraseFallbackRatio: 0.7, copyWarnThreshold: 240, // characters to trigger anti-copy warning }; // ========== STATE ========== const state = { voices: [], utter: null, lastNoteBlob: null }; // ========== DOM ========== const bubble = document.getElementById('omniBubble'); const panel = document.getElementById('omniPanel'); const closeBtn = document.getElementById('omniClose'); const summarizeBtn = document.getElementById('omniSummarize'); const readBtn = document.getElementById('omniRead'); const paraphraseBtn = document.getElementById('omniParaphrase'); const noteBtn = document.getElementById('omniNote'); const resultEl = document.getElementById('omniResult'); const ttsControls = document.getElementById('omniTTSControls'); const voicesSelect = document.getElementById('omniVoices'); const playBtn = document.getElementById('omniPlay'); const pauseBtn = document.getElementById('omniPause'); const rateInput = document.getElementById('omniRate'); const tocContainer = document.getElementById('omniTOC'); const similarContainer = document.getElementById('omniSimilar'); const progressBar = document.getElementById('omniProgress'); const toast = document.getElementById('omniToast'); const downloadNoteBtn = document.getElementById('omniDownloadNote'); const copyResultBtn = document.getElementById('omniCopyResult'); const fontSelect = document.getElementById('omniFont'); const contrastSelect = document.getElementById('omniContrast'); // ========== HELPERS ========== function showPanel(){ panel.style.display = 'block'; panel.setAttribute('aria-hidden','false'); } function hidePanel(){ panel.style.display = 'none'; panel.setAttribute('aria-hidden','true'); } function toastMsg(txt, ms=2000){ toast.textContent = txt; toast.classList.remove('omni-hidden'); setTimeout(()=> toast.classList.add('omni-hidden'), ms); } function getMainEl(){ const sel = ['article.post','.post','.entry-content','.post-body','main']; for(const s of sel){ const e=document.querySelector(s); if(e) return e; } return document.body; } function getPlainText(maxLen=100000){ const el = getMainEl(); return (el && el.innerText) ? el.innerText.trim().slice(0,maxLen) : document.body.innerText.slice(0,maxLen); } function safeFetch(url, opts){ if(!url) return Promise.reject(new Error('no-endpoint')); return fetch(url, opts).then(r=>r.ok?r.json():Promise.reject(r)); } // ========== TOC GENERATOR ========== function buildTOC(){ tocContainer.innerHTML = ''; const root = getMainEl(); if(!root) { tocContainer.innerHTML = '
No content.
'; return; } const headers = root.querySelectorAll('h1,h2,h3,h4'); if(!headers.length){ tocContainer.innerHTML = '
No headings found.
'; return; } headers.forEach((h,i)=>{ if(!h.id) h.id = 'omni-h-'+i; const a = document.createElement('a'); a.href = '#'+h.id; a.textContent = (h.tagName+' • '+h.innerText).slice(0,80); a.style.display='block'; a.style.color='#bff'; a.style.textDecoration='none'; a.style.padding='6px 4px'; a.addEventListener('click', e=>{ e.preventDefault(); document.getElementById(h.id).scrollIntoView({behavior:'smooth'}); }); tocContainer.appendChild(a); }); } // ========== SIMILAR POSTS (client-side lightweight) ========== function findSimilar(){ similarContainer.innerHTML = ''; const text = getPlainText(6000).toLowerCase(); const tokens = text.split(/\s+/).filter(w=>w.length>5); const freq = {}; tokens.forEach(t=>freq[t]=(freq[t]||0)+1); const top = Object.keys(freq).sort((a,b)=>freq[b]-freq[a]).slice(0,10); // create search links to blog (Blogger search) top.slice(0,6).forEach(k=>{ const a = document.createElement('a'); a.href = `${location.origin}/search/label/${encodeURIComponent(k)}`; a.textContent = k; a.style.display='inline-block'; a.style.margin='4px'; a.style.padding='6px'; a.style.borderRadius='8px'; a.style.background='rgba(0,240,255,0.04)'; a.style.color='#bff'; a.style.textDecoration='none'; similarContainer.appendChild(a); }); } // ========== SUMMARIZER ========== async function summarize(){ const text = getPlainText(4000); if(!text){ resultEl.textContent = 'Tidak ada konten untuk disummarize.'; return; } resultEl.textContent = 'Merangkum…'; // try server AI if(CONFIG.aiEndpoint){ try{ const resp = await safeFetch(CONFIG.aiEndpoint, {method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({action:'summarize',title:document.title,text, url: location.href})}); if(resp && resp.summary){ resultEl.textContent = resp.summary.slice(0, CONFIG.maxSummLength); return; } }catch(e){ console.warn('AI summarize failed', e); } } // fallback local: naive extractive (first sentences) const sentences = text.match(/[^\.!\?]+[\.!\?]+/g) || [text]; const pick = sentences.slice(0, Math.min(6, sentences.length)).join(' ').slice(0, CONFIG.maxSummLength); resultEl.textContent = pick; } // ========== PARAPHRASE/REWRITE ========== async function paraphrase(){ const text = getPlainText(2000); if(!text){ resultEl.textContent='Tidak ada konten.'; return; } resultEl.textContent = 'Menyusun ulang…'; if(CONFIG.aiEndpoint){ try{ const resp = await safeFetch(CONFIG.aiEndpoint, {method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({action:'paraphrase',title:document.title,text, url: location.href})}); if(resp && resp.paraphrase){ resultEl.textContent = resp.paraphrase; return; } }catch(e){ console.warn('AI paraphrase failed', e); } } // fallback local simple paraphrase (swap phrases, synonyms approximations) const map = {'mudah':'simple','cara':'method','produk':'product','terbaik':'top','tutorial':'guide'}; let out = text.slice(0,800); Object.keys(map).forEach(k=>{ out = out.replace(new RegExp('\\b'+k+'\\b','gi'), map[k]); }); resultEl.textContent = out.slice(0,1000); } // ========== TEXT-TO-SPEECH ========== function initVoices(){ if(!window.speechSynthesis) return; const voices = speechSynthesis.getVoices(); state.voices = voices; voicesSelect.innerHTML = ''; voices.forEach((v,i)=> { const o = document.createElement('option'); o.value = i; o.textContent = v.name + ' ('+v.lang+')'; voicesSelect.appendChild(o); }); ttsControls.style.display = voices.length ? 'block' : 'none'; } function speak(text){ if(!window.speechSynthesis) { toastMsg('Browser tidak mendukung TTS'); return; } if(state.utter) try{ speechSynthesis.cancel(); }catch(e){} const u = new SpeechSynthesisUtterance(text); const v = state.voices[voicesSelect.value] || state.voices[0]; if(v) u.voice = v; u.rate = parseFloat(rateInput.value || 1); state.utter = u; speechSynthesis.speak(u); } playBtn.addEventListener('click', ()=> { const t = resultEl.textContent || getPlainText(1000); speak(t); }); pauseBtn.addEventListener('click', ()=> { if(window.speechSynthesis) speechSynthesis.cancel(); }); // try load voices async if(window.speechSynthesis){ window.speechSynthesis.onvoiceschanged = initVoices; setTimeout(initVoices,300); } // ========== VOICE NOTES (Record) ========== let mediaRecorder = null, recordedChunks = []; noteBtn.addEventListener('click', async ()=>{ if(!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia){ toastMsg('Microphone not available'); return; } if(mediaRecorder && mediaRecorder.state === 'recording'){ mediaRecorder.stop(); return; } try{ const stream = await navigator.mediaDevices.getUserMedia({audio:true}); mediaRecorder = new MediaRecorder(stream); recordedChunks = []; mediaRecorder.ondataavailable = e => { if(e.data.size>0) recordedChunks.push(e.data); }; mediaRecorder.onstop = ()=> { const blob = new Blob(recordedChunks, {type:'audio/webm'}); state.lastNoteBlob = blob; toastMsg('Voice note recorded — klik Download'); }; mediaRecorder.start(); toastMsg('Recording... click again to stop', 4000); }catch(e){ toastMsg('Izin mic ditolak atau error'); console.error(e); } }); downloadNoteBtn.addEventListener('click', ()=>{ if(!state.lastNoteBlob){ toastMsg('Belum ada catatan suara'); return; } const url = URL.createObjectURL(state.lastNoteBlob); const a = document.createElement('a'); a.href = url; a.download = 'omni-voice-note.webm'; document.body.appendChild(a); a.click(); a.remove(); URL.revokeObjectURL(url); }); // ========== ANTI-COPY (warn & watermark) ========== document.addEventListener('copy', e=>{ const sel = document.getSelection().toString(); if(sel && sel.length > CONFIG.copyWarnThreshold){ e.preventDefault(); const warn = `Kutipan panjang terdeteksi (${sel.length} karakter). Mohon sertakan sumber: ${location.href}\n\nAleo • ${document.title}`; e.clipboardData.setData('text/plain', warn); toastMsg('Konten disalin dengan atribusi otomatis'); } }); // ========== PROGRESS BAR ========== window.addEventListener('scroll', ()=>{ const s = document.documentElement.scrollTop || document.body.scrollTop; const h = (document.documentElement.scrollHeight || document.body.scrollHeight) - window.innerHeight; const p = h>0 ? (s/h)*100 : 0; progressBar.style.width = Math.min(100, Math.max(0,p)) + '%'; }); // ========== COPY RESULT & Download ========== copyResultBtn.addEventListener('click', async ()=>{ const txt = resultEl.textContent || ''; if(!txt){ toastMsg('Tidak ada hasil untuk disalin'); return; } try{ await navigator.clipboard.writeText(txt); toastMsg('Tersalin ke clipboard'); }catch(e){ toastMsg('Salin gagal'); } }); // ========== UI EVENTS ========== bubble.addEventListener('click', ()=> { if(panel.style.display==='block') hidePanel(); else { showPanel(); buildTOC(); findSimilar(); } }); closeBtn.addEventListener('click', hidePanel); summarizeBtn.addEventListener('click', summarize); paraphraseBtn.addEventListener('click', paraphrase); readBtn.addEventListener('click', ()=> { const t = resultEl.textContent || getPlainText(1200); if(!t){ toastMsg('Tidak ada yang dibacakan'); return; } speak(t); }); // font + contrast fontSelect.addEventListener('change', e=>{ if(e.target.value==='large') document.body.style.fontSize='18px'; else document.body.style.fontSize=''; }); contrastSelect.addEventListener('change', e=>{ if(e.target.value==='high') document.body.style.backgroundColor='#000', document.body.style.color='#cfe'; else document.body.style.backgroundColor='', document.body.style.color=''; }); // ========== INITIALIZE (deferred minimal) ========== function initDeferred(){ buildTOC(); findSimilar(); // lazy init TTS voices if(window.speechSynthesis) setTimeout(() => initVoices(), 400); // simple ad placeholder action const adSlot = document.getElementById('omniAdSlot'); adSlot.addEventListener('click', ()=> toastMsg('Pasang AdSense ID di CONFIG bila mau aktif')); toastMsg('OMNI-GOD siap • Klik badge ⚡ untuk buka panel', 2200); } // small accessibility: keyboard shortcut (g) window.addEventListener('keydown', e=> { if(e.key==='g' && (e.ctrlKey||e.metaKey)) { bubble.click(); } }); // run init after DOM ready if(document.readyState === 'loading') document.addEventListener('DOMContentLoaded', initDeferred); else initDeferred(); // expose API for advanced user window.OMNI = { summarize, paraphrase, speak, downloadLastNote: ()=> { if(state.lastNoteBlob){ const a=document.createElement('a'); a.href=URL.createObjectURL(state.lastNoteBlob); a.download='omni-note.webm'; document.body.appendChild(a); a.click(); a.remove(); } } }; })(); </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>

<script> (function() { const userLang = navigator.language || navigator.userLanguage || "en"; const langShort = userLang.split('-')[0]; const supported = ["id","en","es","fr","de","pt","it","nl","ru","ja","ko","ar","hi"]; const finalLang = supported.includes(langShort) ? langShort : "en"; const m1 = document.createElement("meta"); m1.name = "content-language"; m1.content = finalLang; document.head.appendChild(m1); const m2 = document.createElement("meta"); m2.setAttribute("http-equiv", "content-language"); m2.content = finalLang; document.head.appendChild(m2); const m3 = document.createElement("meta"); m3.name = "supported-languages"; m3.content = supported.join(","); document.head.appendChild(m3); })(); </script> <script> (function(){ const words = document.body.innerText.toLowerCase().split(/\W+/).filter(w=>w.length>4); const count = {}; words.forEach(w => count[w] = (count[w]||0) + 1); const top = Object.entries(count).sort((a,b)=>b[1]-a[1]).slice(0,10).map(x=>x[0]); const meta = document.createElement("meta"); meta.name = "ai-snippet-keywords"; meta.content = top.join(","); document.head.appendChild(meta); const intent = document.createElement("meta"); intent.name = "ai-intent-level"; intent.content = "answer, definition, list, steps, summary"; document.head.appendChild(intent); })(); </script> <style> .ai-snippet-box, .key-answer, .fast-facts { border-left: 4px solid #0080ff; padding: 10px; margin: 15px 0; font-weight: 600; } </style> <script> (function(){ const meta = document.createElement("meta"); meta.name = "ai-geo-compat"; meta.content = "global, multi-region, any-language"; document.head.appendChild(meta); })(); </script>

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

</b:if>

<style type="text/css"> body { font-family: 'Inter', sans-serif; margin: 0; padding: 0; } </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> <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='true' title='Postingan Blog' type='Blog'>
          <b:widget-settings>
            <b:widget-setting name='showDateHeader'>true</b:widget-setting>
            <b:widget-setting name='style.textcolor'>#ffffff</b:widget-setting>
            <b:widget-setting name='showShareButtons'>true</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='showAuthor'>false</b:widget-setting>
            <b:widget-setting name='style.linkcolor'>#ffffff</b:widget-setting>
            <b:widget-setting name='style.unittype'>TextAndImage</b:widget-setting>
            <b:widget-setting name='style.bgcolor'>#ffffff</b:widget-setting>
            <b:widget-setting name='reactionsLabel'/>
            <b:widget-setting name='showAuthorProfile'>false</b:widget-setting>
            <b:widget-setting name='style.layout'>1x1</b:widget-setting>
            <b:widget-setting name='showLabels'>true</b:widget-setting>
            <b:widget-setting name='showLocation'>true</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='showBacklinks'>false</b:widget-setting>
            <b:widget-setting name='style.bordercolor'>#ffffff</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 6317733356345244269 true false

<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='AdSense1' locked='false' title='' type='AdSense'> <b:includable id='main'>

2 true true LAST_YEAR

    <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'/>
        <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'/>
        <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'/>
    <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='true' title='' type='Attribution'>
      <b:widget-settings>
        <b:widget-setting name='copyright'><![CDATA[Aleo's Tube Daily Vlog Anak Rantau Indonesia]]></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>Skip to Content
🌙/☀️

<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='sidebar-right-1'> <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='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;
<style> #aleo-widget-toggle{position:fixed;right:18px;bottom:18px;z-index:99999; width:60px;height:60px;border-radius:999px;background:linear-gradient(135deg,#06b6d4,#0ea5a4); color:#fff;display:flex;align-items:center;justify-content:center;font-size:26px;box-shadow:0 8px 28px rgba(2,6,23,0.2); cursor:pointer} #aleo-widget {position:fixed;right:18px;bottom:88px;z-index:99999;width:380px;max-width:92%; border-radius:14px;background:#fff;box-shadow:0 18px 50px rgba(2,6,23,0.18);overflow:hidden;font-family:system-ui,Segoe UI,Roboto,Arial} #aleo-header{background:linear-gradient(90deg,#06b6d4,#0ea5a4);color:#fff;padding:12px 14px;display:flex;align-items:center;gap:8px} #aleo-header .title{font-weight:700} #aleo-messages{height:310px;overflow:auto;padding:12px;background:linear-gradient(180deg,#fbfdfe,#fff);font-size:14px} .msg{margin:8px 0;display:flex} .msg .bubble{padding:10px 12px;border-radius:12px;max-width:78%;line-height:1.35} .msg.user{justify-content:flex-end} .msg.user .bubble{background:#06b6d4;color:#fff;border-bottom-right-radius:6px} .msg.bot{justify-content:flex-start} .msg.bot .bubble{background:#f1f5f9;color:#111;border-bottom-left-radius:6px} #aleo-input-row{display:flex;border-top:1px solid #eef2f7;padding:10px;gap:8px;background:#fff} #aleo-input{flex:1;padding:10px;border-radius:10px;border:1px solid #e6eef6;outline:none} #aleo-send{background:#06b6d4;color:#fff;border:none;padding:10px 12px;border-radius:10px;cursor:pointer} #aleo-meta{font-size:12px;padding:8px 12px;color:#475569;background:#fff;border-top:1px solid #eef2f7;display:flex;gap:8px;align-items:center} #aleo-meta a{color:#0ea5a4;text-decoration:none} .small-btn{background:transparent;border:1px solid rgba(10,10,10,0.06);padding:6px 8px;border-radius:8px;cursor:pointer;font-size:13px} .loading-dot{display:inline-block; width:10px; height:10px; border-radius:50%; margin-left:8px; animation: dot 1s infinite;} @keyframes dot{0%{transform:scale(.6);opacity:.5}50%{transform:scale(1);opacity:1}100%{transform:scale(.6);opacity:.5}} </style>
AleoBot
Chat pintar blog
Kirim
Re-index
Aleo • Pintar dari isi blog
💬
<script> (function(){ const REPLIT_URL = "https://replit.com/@aleostube/ChatbotBlogSync"; // <-- GANTI INI: https://your-repl-username.repl.co const CHAT_API = REPLIT_URL + "/api/chat"; const INDEX_API = REPLIT_URL + "/api/index-blog"; const toggle = document.getElementById("aleo-widget-toggle"); const widget = document.getElementById("aleo-widget"); const msgs = document.getElementById("aleo-messages"); const input = document.getElementById("aleo-input"); const send = document.getElementById("aleo-send"); const reindex = document.getElementById("aleo-reindex"); toggle.addEventListener("click", ()=> widget.style.display = widget.style.display === "none" ? "block" : "none"); function appendMsg(text, who="bot", metaHtml=null) { const m = document.createElement("div"); m.className = "msg " + (who==="user"?"user":"bot"); const b = document.createElement("div"); b.className="bubble"; b.innerHTML = text; m.appendChild(b); if(metaHtml){ const meta = document.createElement("div"); meta.style.fontSize="12px"; meta.style.marginTop="6px"; meta.innerHTML = metaHtml; m.appendChild(meta); } msgs.appendChild(m); msgs.scrollTop = msgs.scrollHeight; } function setTyping(on){ if(on){ appendMsg('Mengetik', 'bot'); } else { // hapus last jika itu typing const last = msgs.lastChild; if(last && last.innerText && last.innerText.toLowerCase().includes("mengetik")) msgs.removeChild(last); } } send.addEventListener("click", sendQuery); input.addEventListener("keydown", (e)=> { if(e.key==="Enter") sendQuery(); }); async function sendQuery(){ const q = input.value.trim(); if(!q) return; input.value=""; appendMsg(escapeHtml(q),"user"); setTyping(true); try{ const res = await fetch(CHAT_API, { method:"POST", headers: {"Content-Type":"application/json"}, body: JSON.stringify({ question: q, url: window.location.href }) }); const data = await res.json(); setTyping(false); const answer = data.answer || "Maaf, aku belum bisa jawab."; const sumber = data.sumber && data.sumber.length ? data.sumber.map(u => `${u}`).join("
") : ""; appendMsg(escapeHtml(answer), "bot", sumber ? `
Sumber:
${sumber}
` : null); } catch(err){ setTyping(false); appendMsg("Terjadi error koneksi. Refresh halaman dan coba lagi.", "bot"); console.error(err); } } reindex.addEventListener("click", async ()=>{ const blogUrl = location.origin; // default: domain blog saat ini const ok = confirm("Mulai re-index blog: " + blogUrl + " ? (ini akan panggil server untuk crawl & embed)"); if(!ok) return; appendMsg("Memulai re-index... Proses bisa memakan waktu (detik–menit).", "bot"); try{ const r = await fetch(INDEX_API, { method:"POST", headers: {"Content-Type":"application/json"}, body: JSON.stringify({ blogUrl }) }); const j = await r.json(); appendMsg(escapeHtml(j.msg || "Indexing selesai."), "bot"); } catch(e){ appendMsg("Gagal memulai re-index. Periksa server.", "bot"); } }); // greeting appendMsg("Halo! Aku bisa cari dan jawab dari isi artikel blog ini. Coba tanyakan sesuatu.", "bot"); // small helper function escapeHtml(s){ return (s||"").replaceAll("&","&").replaceAll("<","<").replaceAll(">",">"); } })(); </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><b:section-contents id='sidebar-right-2-2'> <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'/>
<script> // Namespace global window.AleoOps = {}; // ========== SUPER-LIGHT AUTO-DETECT ========== AleoOps.lang = navigator.language?.slice(0,2) || "en"; AleoOps.isMobile = /Mobi|Android/i.test(navigator.userAgent); AleoOps.tz = Intl.DateTimeFormat().resolvedOptions().timeZone || ""; // ========== ULTRA-FAST AUTO-TRANSLATE TAG ========== document.documentElement.lang = AleoOps.lang; // ========== MICRO META-BOOST (Tidak Berat) ========== (() => { const d = document.querySelector('meta[name="description"]'); if(d && d.content.length < 130){ d.content += " — Auto-enhanced for global discovery."; } })(); // ========== OMNI-FEATHER SEO ENGINE (Super Ringan) ========== AleoOps.keywords = ` tutorial, how to, review, tips, trik, update, viral, produk, konten, AI, blogging, affiliate, bisnis, marketing, teknologi, gadget, tools, video, editor, design, creator, kamera, smartphone, online shop, digital, finance, motivasi, lifestyle, kuliner, travel, gaming, otomotif, software, aplikasi, tema blogger, adsense, seo, keyword, content, analytics, niche, trend, automation, bot, converter, pdf, compressor, unboxing, story, copywriting, script, programming, html, css, javascript, python, cloud, hosting, vr, ar, future tech, vlog, reels, tiktok, shorts, viral script, daily hack, habit, mindset, productivity, marketplace, flash sale, discount, promo, converter, smart tools, analyzer, meta builder, backlink, traffic, schema, responsive, fx, cinematic, filter, aesthetic, web tools, creator tools `.trim(); // ========== EXTREME SNIPPET ========== AleoOps.snippet = (document.title || "Blog") + " — auto-optimized for " + AleoOps.lang.toUpperCase(); // ========== FEATHER BOT ASSISTANT (Ultra Mini) ========== AleoOps.ask = q => "Aleo-Bot: " + q; // ========== ULTRA ADAPTIVE-LAYOUT ========== (() => { if(AleoOps.isMobile){ document.body.style.padding = "12px"; } })(); // ========== FUTURISTIC NANOFX (Ultra Ringan) ========== document.body.style.transition = "0.25s"; window.addEventListener("scroll", ()=> { document.body.style.opacity = "0.985"; }); </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><b:section-contents id='footer-1'> <b:widget id='HTML1' locked='false' title='' type='HTML'> <b:widget-settings> <b:widget-setting name='content'><![CDATA[

<script> // ========== AUTO-DETECT USER ========== (function() { window.aleoModule = {}; aleoModule.lang = navigator.language || navigator.userLanguage || "en"; aleoModule.country = Intl.DateTimeFormat().resolvedOptions().timeZone || "UNKNOWN"; })(); // ========== AUTO-TRANSLATE ========== (function(){ const el = document.querySelector("html"); if(el) el.setAttribute("lang", aleoModule.lang.substring(0,2)); })(); // ========== AUTO META-ENHANCER ========== (function(){ const metaDesc = document.querySelector('meta[name="description"]'); if(metaDesc && metaDesc.content.length < 120){ metaDesc.content += " | Optimized automatically for better reach and discovery."; } })(); // ========== AUTO SMART SEO KEYWORDS ========== (function(){ const kw = [ /* ---- 250 Keyword Universal SEO ---- */ "best tutorial","how to","guide lengkap","full review","tips ampuh","daily life", "update terbaru","viral hari ini","teknologi modern","gadget review","rekomendasi produk", "belanja online","tutorial cepat","AI tools","automation","marketing digital", "belajar cepat","strategi konten","branding","bisnis online","motivasi", "smartphone","kamera terbaik","youtube tips","affiliate marketing","blogging", "online tools","design grafis","UI UX","website builder","SEO update", "algorithm","google tools","apk terbaik","fitur terbaru","software gratis", "startup","investasi pemula","crypto","trading basic","keuangan", "fitness","kesehatan","mental health","self improvement","public speaking", "hobi","gaming","streaming tips","live streaming","podcast", "ai generator","image tools","content creator","editor video","edit foto", "trend 2025","analisis data","cloud","server","hosting murah", "desain logo","font aesthetic","tema blogger","tema wordpress","plugin wajib", "adsense","ctr boost","cpc tinggi","monetisasi","traffic boost", "robot txt","sitemap update","meta tag","structured data","schema", "lifestyle","travel","kuliner","fashion modern","OOTD", "resep cepat","tutorial masak","mobil","motor","otomotif", "educational","parenting","fintech","shopping","marketplace", "productivity","tools creator","musik","lagu trending","cover song", "motivasi kerja","mindset kaya","habit sukses","kreativitas","discipline", "smart home","iot","augmented reality","virtual reality","tech future", "storytelling","copywriting","ads script","story ideas","writing prompt", "blog post","artikel panjang","teknik menulis","tips blogger","keyword research", "analisis seo","backlink","traffic organik","riset pasar","content plan", "high demand","produk laris","review jujur","unboxing","walkthrough", "tutorial pemula","pemrograman","html css","javascript","python basic", "workflow","task management","project management","calendar tools","notes app", "entrepreneur","bisnis kreatif","jualan online","toko digital","affiliate link", "micro niche","niche market","sub niche","topik populer","ide konten", "automation tools","script blogger","script web","plugin web","AI SEO", "branding personal","personal value","networking","soft skill","career growth", "photography","cinematic","footage","story short","vlog tips", "market trends","data insight","analytics tools","conversion rate","sales funnel", "ads optimization","creative ads","target audience","behavior analysis","A/B test", "futuristic design","modern layout","UI adaptive","UX smooth","auto layout", "responsive theme","mobile friendly","fast loading","speed boost","lazy load", "dark mode","light mode","hybrid mode","glassmorphism","neumorphism", "video editor","music editor","sound clean","filter aesthetic","fx pro", "life hack","daily hack","smart trick","speed trick","efficiency", "healthy life","mind balance","time management","focus hack","work flow", "creator tools","tiktok tools","instagram tools","youtube shorts","reels tips", "viral script","engagement boost","algorithm hack","trend hunter","content boost", "spiritual growth","mind expansion","self love","journaling","deep work", "android tips","ios tips","pc tools","laptop tips","repair basic", "pdf tools","converter tools","compress tools","ocr tools","utility apps", "belanja murah","voucher diskon","promo harian","flash sale","best deal", "fotonya jernih","kamera hp","cinematic hp","gimbal","tripod", "AI assistant","bot auto","chat support","auto reply","smart bot", "web analyzer","ai analyzer","keyword engine","content scanner","meta builder" ]; aleoModule.keywords = kw.slice(0,250).join(", "); })(); // ========== AUTO SNIPPET GENERATOR ========== (function(){ let title = document.title || "Konten Tanpa Judul"; window.aleoSnippet = `${title} — optimized for users reading in ${aleoModule.lang}.`; })(); // ========== AUTO BOT ASSISTANT ========== (function(){ window.aleoAssistant = function(q){ return "Aleo-Bot says: " + q.replace(/(.{60})/g, '$1\n'); } })(); // ========== AUTO LAYOUT ADAPTIVE ========== (function(){ const body = document.body; if(window.innerWidth < 600){ body.style.padding = "10px"; } })(); // ========== FUTURISTIC FX ========== (function(){ document.body.style.transition = "0.3s ease"; window.addEventListener("mousemove", ()=> { document.body.style.opacity = "0.99"; }); })(); </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><b:section-contents id='footer-2-1'/><b:section-contents id='footer-2-2'/>