{"id":4462,"date":"2025-09-11T10:09:51","date_gmt":"2025-09-11T10:09:51","guid":{"rendered":"https:\/\/punjabikidz.com\/home\/?page_id=4462"},"modified":"2025-09-28T04:03:44","modified_gmt":"2025-09-28T04:03:44","slug":"the-fat-beetle-audio-pg-2","status":"publish","type":"page","link":"https:\/\/punjabikidz.com\/home\/the-fat-beetle-audio-pg-2\/","title":{"rendered":"The Fat Beetle Audio \u2013 Pg 2"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"4462\" class=\"elementor elementor-4462\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-81426df e-flex e-con-boxed e-con e-parent\" data-id=\"81426df\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-770f4db e-con-full e-flex e-con e-child\" data-id=\"770f4db\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5f54198 elementor-widget elementor-widget-heading\" data-id=\"5f54198\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">The Fat Beetle - &#2606;&#2635;&#2591;&#2622; &#2581;&#2624;&#2652;&#2622; (Listen &amp; Read)<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-792a0fa e-con-full e-flex e-con e-child\" data-id=\"792a0fa\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-bd6db52 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"bd6db52\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-36d8009 e-flex e-con-boxed e-con e-parent\" data-id=\"36d8009\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-5500224 e-con-full e-flex e-con e-child\" data-id=\"5500224\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0ba4739 elementor-widget elementor-widget-image\" data-id=\"0ba4739\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"544\" height=\"362\" src=\"https:\/\/punjabikidz.com\/home\/wp-content\/uploads\/2025\/09\/FB-Pg-2.gif\" class=\"attachment-large size-large wp-image-4593\" alt=\"Fat Beetle - Pg 2\"\/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-576c846 e-con-full e-flex e-con e-child\" data-id=\"576c846\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-24cfa69 e-con-full e-flex e-con e-child\" data-id=\"24cfa69\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-27b5558 elementor-widget elementor-widget-text-editor\" data-id=\"27b5558\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3 style=\"text-align: center;\"><strong><span style=\"color: #000000;\">The Fat Beetle<\/span><br><span style=\"color: #993300;\">&#2606;&#2635;&#2591;&#2622; &#2581;&#2624;&#2652;&#2622;<\/span><\/strong><\/h3><h4 style=\"text-align: center;\"><span style=\"color: #008000;\"><strong>Page 2<\/strong><\/span><\/h4>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-52eaa40 e-con-full e-flex e-con e-child\" data-id=\"52eaa40\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2dde2ac elementor-widget elementor-widget-text-editor\" data-id=\"2dde2ac\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h5 style=\"text-align: center;\"><strong><span style=\"color: #800000;\">Click Play to Listen<\/span><\/strong><\/h5><p><img decoding=\"async\" class=\"wp-image-3326 aligncenter\" src=\"https:\/\/punjabikidz.com\/home\/wp-content\/uploads\/2024\/12\/PunjabiKidz-Favicon.webp\" alt=\"favicon\" width=\"155\" height=\"155\" srcset=\"https:\/\/punjabikidz.com\/home\/wp-content\/uploads\/2024\/12\/PunjabiKidz-Favicon.webp 192w, https:\/\/punjabikidz.com\/home\/wp-content\/uploads\/2024\/12\/PunjabiKidz-Favicon-150x150.png 150w, https:\/\/punjabikidz.com\/home\/wp-content\/uploads\/2024\/12\/PunjabiKidz-Favicon-100x100.webp 100w\" sizes=\"(max-width: 155px) 100vw, 155px\"\/><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-a852ab1 e-flex e-con-boxed e-con e-parent\" data-id=\"a852ab1\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d18c00e elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"d18c00e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a428ac7 elementor-widget elementor-widget-html\" data-id=\"a428ac7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\n\n\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n<title>Punjabi Read-Along &mdash; Precise Per-Word Durations (21s)<\/title>\n\n<!-- Punjabi (Gurmukhi) fonts -->\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Noto+Sans+Gurmukhi:wght@400;700&amp;display=swap\" rel=\"stylesheet\">\n<link href=\"https:\/\/fonts.bunny.net\/css?family=noto-sans-gurmukhi:400,700&amp;display=swap\" rel=\"stylesheet\">\n\n<style>\n@font-face{\n  font-family:\"Noto Sans Gurmukhi Fallback\";\n  src:url(\"https:\/\/cdn.jsdelivr.net\/gh\/notofonts\/gurmukhi@main\/fonts\/ttf\/NotoSansGurmukhi\/NotoSansGurmukhi-Regular.ttf\") format(\"truetype\");\n  font-weight:400;font-style:normal;font-display:swap;\n}\n@font-face{\n  font-family:\"Noto Sans Gurmukhi Fallback\";\n  src:url(\"https:\/\/cdn.jsdelivr.net\/gh\/notofonts\/gurmukhi@main\/fonts\/ttf\/NotoSansGurmukhi\/NotoSansGurmukhi-Bold.ttf\") format(\"truetype\");\n  font-weight:700;font-style:normal;font-display:swap;\n}\n\n:root{\n  --accent:#e11d48;     \/* red for active word *\/\n  --hi-bg:#ffe3e8;      \/* background highlight color *\/\n  --ink:#e7e9ee;\n  --card:#ffffff;\n  --border:#e8eaee;\n  --r:14px;\n\n  --player-bg1:#0c0f16;\n  --player-bg2:#151a24;\n  --player-ring:rgba(255,255,255,.08);\n  --player-track:#242a33;\n\n  --pbtn-red1:#ff3b30;\n  --pbtn-red2:#d91515;\n}\n\n*{box-sizing:border-box}\nbody{\n  margin:0; padding:22px; background:#fff; color:#111827;\n  font-family:\"Noto Sans Gurmukhi\",\"Noto Sans Gurmukhi Fallback\",\n              \"Raavi\",\"Nirmala UI\",\"Gurmukhi MN\",\"Gurmukhi MT\",\"Gurmukhi Sangam MN\",\n              \"Lohit Gurmukhi\",\"Saab\", Arial, sans-serif;\n  line-height:1.75;\n}\n.container{max-width:900px;margin:0 auto}\n#msg{max-width:800px;margin:0 auto 10px;color:#6b7280;font:13px\/1.5 system-ui,-apple-system,Segoe UI,Roboto,Arial}\n#msg.error{color:#b91c1c}\n\n\/* Player (450px wide, centered) *\/\n.player-wrap{ width:450px; max-width:100%; margin:0 auto 10px; }\n.player{\n  background:\n    radial-gradient(120% 160% at 10% -20%, rgba(255,255,255,.08) 0%, rgba(255,255,255,0) 60%),\n    linear-gradient(180deg, var(--player-bg1), var(--player-bg2));\n  border:1px solid var(--player-ring);\n  border-radius:var(--r);\n  box-shadow:0 14px 34px rgba(0,0,0,.45), 0 4px 10px rgba(0,0,0,.25);\n  padding:14px 16px; color:var(--ink);\n}\n.row{ display:grid; grid-template-columns:auto 1fr; gap:12px; align-items:center; }\n\n\/* Red play\/pause button *\/\n.pbtn{\n  width:60px; height:60px; border-radius:999px;\n  background:\n    radial-gradient(120% 120% at 30% 20%, rgba(255,255,255,.22), rgba(255,255,255,0) 60%),\n    linear-gradient(180deg,var(--pbtn-red1),var(--pbtn-red2));\n  border:1px solid rgba(255,255,255,.18);\n  display:flex; align-items:center; justify-content:center;\n  cursor:pointer;\n  box-shadow:0 12px 24px rgba(217,21,21,.38), inset 0 1px 0 rgba(255,255,255,.28);\n  transition:transform .08s ease, filter .2s ease, box-shadow .2s ease;\n  line-height:0; padding:0; margin:0;\n}\n.pbtn:hover{ filter:brightness(1.05) }\n.pbtn:active{ transform:scale(.98) }\n.pbtn svg{ width:28px; height:28px; display:block; fill:#fff }\n.pbtn svg #pauseIcon{ display:none }\n.pbtn.playing svg #playIcon{ display:none }\n.pbtn.playing svg #pauseIcon{ display:block }\n\n\/* Seek bar *\/\n.seek{\n  --percent:0%;\n  appearance:none; -webkit-appearance:none; width:100%; height:8px;\n  background:linear-gradient(to right, var(--pbtn-red1) 0 var(--percent), var(--player-track) var(--percent) 100%);\n  border:1px solid rgba(255,255,255,.10);\n  border-radius:999px; outline:none;\n  box-shadow: inset 0 2px 6px rgba(0,0,0,.35);\n}\n.seek[disabled]{ opacity:.6; cursor:not-allowed; pointer-events:none; }\n.seek::-webkit-slider-thumb{\n  -webkit-appearance:none; appearance:none;\n  width:16px;height:16px;border-radius:999px;background:#fff;border:2px solid var(--pbtn-red2);\n  box-shadow:0 4px 10px rgba(0,0,0,.3); cursor:pointer;\n}\n.seek::-moz-range-thumb{\n  width:16px;height:16px;border-radius:999px;background:#fff;border:2px solid var(--pbtn-red2);\n  box-shadow:0 4px 10px rgba(0,0,0,.3); cursor:pointer;\n}\n.seek::-moz-range-track{ background:transparent }\n.timebar{ display:flex; justify-content:flex-end; font-size:12px; color:#9aa3b2; margin-top:8px; }\n\n\/* Punjabi text &mdash; natural spacing, no layout shift *\/\n.text{\n  font-size:1.7rem; line-height:2.1;\n  background:var(--card); border:1px solid var(--border); border-radius:var(--r);\n  padding:18px; max-width:800px; margin:12px auto 18px;\n  text-align:left; text-indent:1.5em;\n  word-spacing:normal; letter-spacing:normal;\n  font-family:\"Noto Sans Gurmukhi\",\"Noto Sans Gurmukhi Fallback\",\n              \"Raavi\",\"Nirmala UI\",\"Gurmukhi MN\",\"Gurmukhi MT\",\"Gurmukhi Sangam MN\",\n              \"Lohit Gurmukhi\",\"Saab\", Arial, sans-serif !important;\n}\n.word{\n  display:inline;               \/* natural flow & spacing *\/\n  cursor:pointer;\n  border-radius:10px;\n  transition: background .06s linear, box-shadow .15s ease;\n  padding:0 .1em;               \/* slight padding so background is visible *\/\n}\n.word:hover{ background:#fff5f7 }\n\n\/* Active + Selected word &mdash; red text + soft background &ldquo;pill&rdquo; without layout shift *\/\n.text .word.active,\n.text .word.selected{\n  color:var(--accent) !important;\n  background:var(--hi-bg);\n  box-shadow: 0 0 0 0.18em rgba(255, 227, 232, 0.95);\n  font-weight:400; \/* keep glyph width stable *\/\n  text-shadow:\n    0   0   0   var(--accent),\n    0.015em 0   0 var(--accent),\n   -0.015em 0   0 var(--accent),\n    0   0.015em 0 var(--accent),\n    0  -0.015em 0 var(--accent);\n}\n@keyframes pulseHi {\n  0%   { box-shadow: 0 0 0 0.18em rgba(255,227,232,.95), 0 0 0 .46em rgba(255,108,129,.30); }\n  100% { box-shadow: 0 0 0 0.18em rgba(255,227,232,.95), 0 0 0 .74em rgba(255,108,129,0); }\n}\n.text .word.selected{ animation: pulseHi 650ms ease-out 1 }\n\n\/* Hide native audio UI *\/\naudio{ display:none }\n<\/style>\n\n\n<div class=\"container\">\n\n  <div id=\"msg\">Click the red button to load and play the audio.<\/div>\n\n  <audio id=\"player\" preload=\"none\" playsinline><\/audio>\n\n  <div class=\"player-wrap\">\n    <div class=\"player\" role=\"region\" aria-label=\"Audio player\">\n      <div class=\"row\">\n        <button id=\"playbtn\" class=\"pbtn\" aria-label=\"Play\" title=\"Play\">\n          <svg viewbox=\"0 0 100 100\" aria-hidden=\"true\" focusable=\"false\">\n            <g id=\"playIcon\"><polygon points=\"35,25 75,50 35,75\"><\/polygon><\/g>\n            <g id=\"pauseIcon\"><rect x=\"32\" y=\"24\" width=\"14\" height=\"52\" rx=\"3\"><\/rect><rect x=\"54\" y=\"24\" width=\"14\" height=\"52\" rx=\"3\"><\/rect><\/g>\n          <\/svg>\n        <\/button>\n        <input id=\"seek\" class=\"seek\" type=\"range\" min=\"0\" max=\"0\" step=\"0.01\" value=\"0\" aria-label=\"Seek\" disabled>\n      <\/div>\n      <div class=\"timebar\"><span id=\"time\">0:00 \/ --:--<\/span><\/div>\n    <\/div>\n  <\/div>\n\n  <!-- Your text -->\n  <div id=\"readbox\" class=\"text\" lang=\"pa\" dir=\"ltr\" aria-live=\"polite\">\n    &#2582;&#2631;&#2596; &#2598;&#2631; &#2600;&#2631;&#2652;&#2631; &#2567;&#2673;&#2581; &#2616;&#2625;&#2672;&#2598;&#2608; &#2589;&#2624;&#2610; &#2613;&#2624; &#2616;&#2624;&#2404; &#2569;&#2673;&#2597;&#2631; &#2586;&#2622;&#2608;&#2631; &#2602;&#2622;&#2616;&#2631; &#2604;&#2617;&#2625;&#2596; &#2616;&#2620;&#2622;&#2562;&#2596;&#2624; &#2616;&#2624;&#2404; &#2567;&#2616; &#2616;&#2620;&#2622;&#2596; &#2606;&#2617;&#2636;&#2610; &#2613;&#2623;&#2673;&#2586; &#2604;&#2617;&#2625;&#2596; &#2616;&#2622;&#2608;&#2631; &#2581;&#2624;&#2652;&#2631;-&#2606;&#2581;&#2636;&#2652;&#2631; &#2613;&#2624; &#2608;&#2617;&#2623;&#2672;&#2598;&#2631; &#2616;&#2600;&#2404; &#2569;&#2617;&#2600;&#2622;&#2562; &#2598;&#2622; &#2606;&#2600;&#2602;&#2616;&#2672;&#2598; &#2582;&#2622;&#2595;&#2622; &#2613;&#2624; &#2569;&#2673;&#2597;&#2631; &#2604;&#2617;&#2625;&#2596; &#2616;&#2624;&#2404;\n  <\/div>\n<\/div>\n\n<script>\n\/* ===== Precise per-word durations (seconds) for 32 tokens \u2014 sums to 21.000s =====\n   If you need to tweak, adjust numbers here. *\/\nvar TIMING = {\n  mode: \"durations\",          \/\/ use these exact durations\n  normalizeToAudio: false,    \/\/ do NOT auto-rescale \u2014 use the values as-is\n  pad: { pre: 0.00, post: 0.03 },\n  durations: [\n    0.7, 0.5, 0.627, 0.533, 0.8, 0.7, 0.3, 0.909,\n    0.627, 1, 0.627, 0.9, 0.815, 0.8, 0.5, 1,\n    0.6, 0.627, 0.55, 0.627, 1.1, 0.25, 0.6, 0.8,\n    0.3, 0.438, 1.3, 0.7, 0.3, 0.4, 0.4, 0.910\n  ]\n};\n\n(function(){\n  var AUDIO_SRC = \"https:\/\/punjabikidz.com\/audio_files\/fat_beetle\/pg2\/fat_beetle_audio_pg2.mp3\";\n\n  var audio   = document.getElementById('player');\n  var btn     = document.getElementById('playbtn');\n  var seek    = document.getElementById('seek');\n  var timeEl  = document.getElementById('time');\n  var textEl  = document.getElementById('readbox');\n  var msgEl   = document.getElementById('msg');\n\n  var words=[], spans=[], wordTimings=[];\n  var lastActive=-1, rafId=null, userSeeking=false;\n\n  var srcSet=false;\n  var segmentPlaying=false, segmentEnd=0, segmentTimer=null;\n  var forceIdx=null;\n  var EPS = 0.015;\n\n  function setMsg(txt, isError){ msgEl.textContent = txt||''; msgEl.className = isError ? 'error' : ''; }\n  function fmt(s){ s=Math.max(0,Math.floor(s||0)); var m=Math.floor(s\/60), ss=String(s%60).padStart(2,'0'); return m+':'+ss; }\n  function getDurationSafe(){ var d=audio.duration; return (isFinite(d)&&d>0&&d!==Infinity)?d:0; }\n\n  function tokenize(str){\n    var clean = String(str||\"\").replace(\/[\\u200B\\u200C\\u200D]\/g,\"\").replace(\/[\\s\\u00A0]+\/g,\" \").trim();\n    return clean ? clean.split(\" \") : [];\n  }\n\n  function renderWords(){\n    var src=(textEl.textContent||\"\").trim();\n    words = tokenize(src);\n    textEl.innerHTML=\"\";\n\n    spans = [];\n    words.forEach(function(w,i){\n      var s=document.createElement('span');\n      s.className='word';\n      s.textContent = w + (i < words.length-1 ? \" \" : \"\");\n      s.addEventListener('click', function(){ playWord(i); });\n      textEl.appendChild(s);\n      spans.push(s);\n    });\n\n    setActive(0);\n  }\n\n  function setActive(idx){\n    if (idx===lastActive) return;\n    if (lastActive>=0 && spans[lastActive]) spans[lastActive].classList.remove('active');\n    if (idx>=0 && spans[idx]) spans[idx].classList.add('active');\n    lastActive=idx;\n  }\n\n  function evenTimings(totalDur, count){\n    var slot = count>0 ? totalDur\/count : 0.6;\n    var out = []; for (var i=0;i<count;i++) out.push({start:i*slot, end:(i+1)*slot});\n    return out;\n  }\n\n  function startsToTimings(starts, totalDur){\n    var out=[];\n    for (var i=0;i<starts.length;i++){\n      var s=+starts[i]; if (!isFinite(s)) s=0;\n      var e = (i<starts.length-1) ? +starts[i+1] : totalDur;\n      if (!isFinite(e) || e<=s) e = s + 0.25;\n      out.push({start:Math.max(0,s), end:Math.max(s,e)});\n    }\n    return out;\n  }\n\n  function durationsToTimings(durs, totalDur, count){\n    var arr = [];\n    for (var i=0;i<durs.length;i++){ var v=+durs[i]; if (isFinite(v) && v>0) arr.push(v); }\n    if (arr.length < count){ var last = arr.length? arr[arr.length-1] : 0.6; while (arr.length < count) arr.push(last); }\n    if (arr.length > count){ arr = arr.slice(0,count); }\n    var out=[], t=0;\n    for (var j=0;j<arr.length;j++){ var dur=Math.max(0,arr[j]); out.push({start:t, end:t+dur}); t+=dur; }\n    \/\/ Clamp to the audio duration if available\n    if (totalDur>0){\n      for (var k=0;k<out.length;k++){\n        out[k].start = Math.min(totalDur, Math.max(0, out[k].start));\n        out[k].end   = Math.min(totalDur, Math.max(out[k].start, out[k].end));\n      }\n    }\n    return out;\n  }\n\n  function computeWordTimings(){\n    var d = getDurationSafe(); \/\/ may be ~21s\n    var N = words.length; if (!N) return [];\n    if (Array.isArray(TIMING.starts))     return startsToTimings(TIMING.starts, d||0);\n    if (TIMING.mode === \"durations\")      return durationsToTimings(TIMING.durations||[], d||0, N);\n    return evenTimings(d||21, N);\n  }\n\n  function indexForTime(t){\n    for (var i=0;i<wordTimings.length;i++){\n      var seg=wordTimings[i];\n      if (t >= seg.start + EPS && t < seg.end - EPS) return i;\n    }\n    if (wordTimings.length && t >= (wordTimings[wordTimings.length-1].end - EPS)) return wordTimings.length-1;\n    return -1;\n  }\n\n  function updateSeekMax(){\n    var d=getDurationSafe();\n    if (d>0){ seek.max=d; seek.disabled=false; }\n  }\n\n  function setSeekFill(){\n    var max = +seek.max || 0, v = +seek.value || 0;\n    var percent = max>0 ? (v\/max)*100 : 0;\n    seek.style.setProperty(\"--percent\", percent+\"%\");\n  }\n\n  function tick(){\n    var t=audio.currentTime||0;\n    if (!userSeeking){ seek.value=t; setSeekFill(); }\n    var d=getDurationSafe();\n    timeEl.textContent = d ? (fmt(t)+\" \/ \"+fmt(d)) : \"0:00 \/ --:--\";\n\n    if (segmentPlaying && forceIdx!=null){\n      setActive(forceIdx); \/\/ keep the clicked word highlighted for its slice\n    }else{\n      setActive(indexForTime(t)); \/\/ follow along during normal play\n    }\n    rafId = requestAnimationFrame(tick);\n  }\n\n  \/* ===== Source & playback ===== *\/\n  function setRemoteSrcIfNeeded(){\n    if (srcSet) return;\n    var url = AUDIO_SRC + (AUDIO_SRC.indexOf('?')>-1 ? '&' : '?') + 'v=' + Date.now(); \/\/ cache-buster\n    audio.src = url;\n    try{ audio.load(); }catch(e){}\n    srcSet = true;\n  }\n\n  function ensureLoadedThenPlay(){\n    return new Promise(function(resolve){\n      if (getDurationSafe()>0){ resolve(true); return; }\n      var done=false;\n      var timeout = setTimeout(function(){ if (!done){ done=true; resolve(false); } }, 3000);\n      audio.addEventListener('loadedmetadata', function once(){\n        audio.removeEventListener('loadedmetadata', once);\n        if (!done){ done=true; clearTimeout(timeout); resolve(true); }\n      });\n      try{ audio.load(); }catch(e){}\n    }).then(function(){\n      return audio.play().then(function(){ setMsg(''); return true; })\n        .catch(function(err){\n          setMsg(\"Playback blocked: \"+(err && (err.name||err.message) || \"unknown\")+\". Tap the red button again or check device mute\/volume.\", true);\n          return false;\n        });\n    });\n  }\n\n  \/* ===== Click a word: jump there and keep playing ===== *\/\n  function playWord(i){\n    if (!wordTimings.length) return;\n    var seg = wordTimings[i]; if (!seg) return;\n\n    \/\/ small offset inside the word slice (avoid boundary issues)\n    var inside = 0.02;\n    var start = Math.min(Math.max(0, seg.start + inside), Math.max(0, seg.end - inside));\n\n    \/\/ We are no longer doing \"single-word segments\"\n    clearTimeout(segmentTimer);\n    segmentPlaying = false;\n    forceIdx = null;\n\n    \/\/ visual tap feedback (unchanged)\n    spans.forEach(function(el){ el.classList.remove('selected'); });\n    if (spans[i]) {\n      spans[i].classList.add('selected');\n      setTimeout(function(){ if (spans[i]) spans[i].classList.remove('selected'); }, 650);\n    }\n\n    setRemoteSrcIfNeeded();\n    audio.currentTime = start;\n\n    \/\/ If paused, start playing; if already playing, continue from this point\n    ensureLoadedThenPlay().then(function(){\n      setActive(i); \/\/ reflect the clicked word immediately\n    });\n  }\n\n  function stopSegment(){\n    if (!segmentPlaying) return;\n    segmentPlaying=false;\n    clearTimeout(segmentTimer);\n    audio.pause();\n    if (isFinite(segmentEnd)) audio.currentTime = segmentEnd;\n    forceIdx = null;\n  }\n\n  \/* ===== Main controls ===== *\/\n  function syncBtnState(){\n    var playing = !audio.paused && !audio.ended;\n    if (playing) btn.classList.add('playing'); else btn.classList.remove('playing');\n    btn.setAttribute('aria-label', playing ? 'Pause' : 'Play');\n    btn.title = playing ? 'Pause' : 'Play';\n  }\n  function playPause(){\n    if (segmentPlaying) { stopSegment(); return; }\n    setRemoteSrcIfNeeded();\n    if (audio.paused){ ensureLoadedThenPlay(); } else { audio.pause(); }\n  }\n\n  btn.addEventListener('click', playPause);\n  window.addEventListener('keydown', function(e){\n    if (e.code==='Space' && !\/input|textarea\/i.test(e.target.tagName)) { e.preventDefault(); playPause(); }\n  });\n\n  seek.addEventListener('input', function(){ userSeeking=true; setSeekFill(); setActive(indexForTime(+seek.value)); });\n  seek.addEventListener('change', function(){ audio.currentTime=+seek.value; userSeeking=false; });\n\n  audio.addEventListener('play',  function(){ syncBtnState(); if (!rafId) rafId=requestAnimationFrame(tick); });\n  audio.addEventListener('pause', function(){ syncBtnState(); if (rafId){ cancelAnimationFrame(rafId); rafId=null; } });\n  audio.addEventListener('ended', function(){ syncBtnState(); if (rafId){ cancelAnimationFrame(rafId); rafId=null; } });\n\n  audio.addEventListener('loadedmetadata', function(){\n    updateSeekMax();\n    wordTimings = computeWordTimings(); \/\/ uses your precise durations\n    setMsg('');\n    if (!rafId) rafId=requestAnimationFrame(tick);\n  });\n  audio.addEventListener('durationchange',  function(){\n    updateSeekMax();\n    wordTimings = computeWordTimings();\n  });\n  audio.addEventListener('error', function(){\n    var err = audio.error; var code = err ? err.code : '';\n    setMsg('Audio error'+(code?(' (code '+code+')'):'')+'. Please verify the MP3 URL and HTTPS.', true);\n  });\n\n  \/* Init *\/\n  if (document.readyState===\"loading\") document.addEventListener(\"DOMContentLoaded\", init);\n  else init();\n  function init(){\n    renderWords();\n    seek.disabled = true; seek.value = 0; seek.max = 0; setSeekFill();\n    wordTimings = computeWordTimings();\n    syncBtnState();\n  }\n})();\n<\/script>\n\n\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-958a609 e-flex e-con-boxed e-con e-parent\" data-id=\"958a609\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-ee2e9f4 e-con-full e-flex e-con e-child\" data-id=\"ee2e9f4\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-12f7624 e-con-full e-flex e-con e-child\" data-id=\"12f7624\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-95e784c elementor-widget elementor-widget-image\" data-id=\"95e784c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/punjabikidz.com\/the-fat-beetle-audio-pg-1\/\">\n\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/punjabikidz.com\/home\/wp-content\/uploads\/elementor\/thumbs\/Previous-rafx0z3r71eru75oar12r5l6smvt83wa16e9q90h0g.webp\" title=\"Previous\" alt=\"Previous button\" loading=\"lazy\"\/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-df049fe e-con-full e-flex e-con e-child\" data-id=\"df049fe\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d59c1c6 elementor-widget elementor-widget-image\" data-id=\"d59c1c6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/punjabikidz.com\/the-fat-beetle-audio-pg-3\/\">\n\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/punjabikidz.com\/home\/wp-content\/uploads\/elementor\/thumbs\/Next-ra79qgw89qjr6n8df6dg1kt0jobodnufm4gglr0e8w.webp\" title=\"Next\" alt=\"Next Button\" loading=\"lazy\"\/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-f45c72f e-flex e-con-boxed e-con e-parent\" data-id=\"f45c72f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-250665b elementor-widget elementor-widget-html\" data-id=\"250665b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<script async src=\"https:\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js?client=ca-pub-3139934624092739\"\n     crossorigin=\"anonymous\"><\/script>\n<!-- Horizontal Responsive -->\n<ins class=\"adsbygoogle\" style=\"display:block\" data-ad-client=\"ca-pub-3139934624092739\" data-ad-slot=\"5337999693\" data-ad-format=\"auto\" data-full-width-responsive=\"true\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a430d94 elementor-widget elementor-widget-spacer\" data-id=\"a430d94\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>The Fat Beetle &ndash; &#2606;&#2635;&#2591;&#2622; &#2581;&#2624;&#2652;&#2622; (Listen &amp; Read) The Fat Beetle&#2606;&#2635;&#2591;&#2622; &#2581;&#2624;&#2652;&#2622; Page 2 Click Play to Listen Punjabi [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"no-sidebar","site-content-layout":"","ast-site-content-layout":"normal-width-container","site-content-style":"unboxed","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"wf_page_folders":[46],"class_list":["post-4462","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/punjabikidz.com\/home\/wp-json\/wp\/v2\/pages\/4462","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/punjabikidz.com\/home\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/punjabikidz.com\/home\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/punjabikidz.com\/home\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/punjabikidz.com\/home\/wp-json\/wp\/v2\/comments?post=4462"}],"version-history":[{"count":31,"href":"https:\/\/punjabikidz.com\/home\/wp-json\/wp\/v2\/pages\/4462\/revisions"}],"predecessor-version":[{"id":4603,"href":"https:\/\/punjabikidz.com\/home\/wp-json\/wp\/v2\/pages\/4462\/revisions\/4603"}],"wp:attachment":[{"href":"https:\/\/punjabikidz.com\/home\/wp-json\/wp\/v2\/media?parent=4462"}],"wp:term":[{"taxonomy":"wf_page_folders","embeddable":true,"href":"https:\/\/punjabikidz.com\/home\/wp-json\/wp\/v2\/wf_page_folders?post=4462"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}