{"id":2222,"date":"2026-01-16T22:09:21","date_gmt":"2026-01-16T21:09:21","guid":{"rendered":"https:\/\/weddingpanel.pl\/?page_id=2222"},"modified":"2026-01-16T22:23:21","modified_gmt":"2026-01-16T21:23:21","slug":"demo-2-tabu-weselne","status":"publish","type":"page","link":"https:\/\/weddingpanel.pl\/en\/demo-2-tabu-weselne\/","title":{"rendered":"Demo 2 Tabu weselne"},"content":{"rendered":"\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<style>.wp-block-kadence-advancedbtn.kb-btns2222_fac3c9-87{gap:var(--global-kb-gap-xs, 0.5rem );justify-content:center;align-items:center;}.kt-btns2222_fac3c9-87 .kt-button{font-weight:normal;font-style:normal;}.kt-btns2222_fac3c9-87 .kt-btn-wrap-0{margin-right:5px;}.wp-block-kadence-advancedbtn.kt-btns2222_fac3c9-87 .kt-btn-wrap-0 .kt-button{color:#555555;border-color:#555555;}.wp-block-kadence-advancedbtn.kt-btns2222_fac3c9-87 .kt-btn-wrap-0 .kt-button:hover, .wp-block-kadence-advancedbtn.kt-btns2222_fac3c9-87 .kt-btn-wrap-0 .kt-button:focus{color:#ffffff;border-color:#444444;}.wp-block-kadence-advancedbtn.kt-btns2222_fac3c9-87 .kt-btn-wrap-0 .kt-button::before{display:none;}.wp-block-kadence-advancedbtn.kt-btns2222_fac3c9-87 .kt-btn-wrap-0 .kt-button:hover, .wp-block-kadence-advancedbtn.kt-btns2222_fac3c9-87 .kt-btn-wrap-0 .kt-button:focus{background:#444444;}<\/style>\n<div class=\"wp-block-kadence-advancedbtn kb-buttons-wrap kb-btns2222_fac3c9-87\"><style>ul.menu .wp-block-kadence-advancedbtn .kb-btn2222_2634bd-0d.kb-button{width:initial;}.wp-block-kadence-advancedbtn .kb-btn2222_2634bd-0d.kb-button{color:#ffffff;background:#fcb900;}.wp-block-kadence-advancedbtn .kb-btn2222_2634bd-0d.kb-button:hover, .wp-block-kadence-advancedbtn .kb-btn2222_2634bd-0d.kb-button:focus{color:#000000;}<\/style><a class=\"kb-button kt-button button kb-btn2222_2634bd-0d kt-btn-size-large kt-btn-width-type-auto kb-btn-global-inherit  kt-btn-has-text-true kt-btn-has-svg-false  wp-block-button__link wp-block-kadence-singlebtn\" href=\"https:\/\/weddingpanel.pl\/demo-2\/\"><span class=\"kt-btn-inner-text\">Powr\u00f3t<\/span><\/a><\/div>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h1 class=\"wp-block-heading has-text-align-center has--font-size\">Tabu weselne<\/h1>\n\n\n\n<p class=\"has-text-align-center\" style=\"font-size:16px\">Weselna ods\u0142ona popularnej gry w tabu polegaj\u0105cej na opisie danego s\u0142owa bez u\u017cywania s\u0142\u00f3w zakazanych w taki spos\u00f3b, aby druga osoba je odgad\u0142a. Mo\u017ce by\u0107 wykorzystana dowolnie przez go\u015bci lub np. w trakcie oczepin, gdy strona z losowaniem s\u0142\u00f3w jest wy\u015bwietlana na ekranie, a osoba zgaduj\u0105ca stoi do niej ty\u0142em (w takim przypadku gra r\u00f3wnie\u017c mo\u017ce by\u0107 wst\u0119pnie zabezpieczona has\u0142em, aby nie psu\u0107 zabawy). Wersja demo zawiera tylko 8 hase\u0142, natomiast finalnie mo\u017cna ich stworzy\u0107 dowoln\u0105 ilo\u015b\u0107.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wpanel-tabu\" data-wpanel-tabu data-seconds=\"60\">\n  <div class=\"wpanel-tabu-card\">\n    <div class=\"wpanel-tabu-top\">\n      <div class=\"wpanel-tabu-label\">TABU<\/div>\n      <div class=\"wpanel-tabu-meta\">\n        <span class=\"wpanel-tabu-left\" data-left>Pozosta\u0142o: \u2014<\/span>\n      <\/div>\n    <\/div>\n\n    <div class=\"wpanel-tabu-word\" data-word>Kliknij \u201eNast\u0119pna karta\u201d \ud83c\udfad<\/div>\n\n    <div class=\"wpanel-tabu-banned\">\n      <div class=\"wpanel-tabu-banned-title\">S\u0142owa zakazane<\/div>\n      <ul class=\"wpanel-tabu-banned-list\" data-banned>\n        <li>\u2014<\/li>\n      <\/ul>\n    <\/div>\n\n    <div class=\"wpanel-tabu-timer\">\n      <div class=\"wpanel-tabu-timer-row\">\n        <div class=\"wpanel-tabu-time\" data-time>01:00<\/div>\n        <div class=\"wpanel-tabu-timer-actions\">\n          <button type=\"button\" class=\"wpanel-tabu-btn is-ghost\" data-timer-toggle>Start<\/button>\n          <button type=\"button\" class=\"wpanel-tabu-btn is-ghost\" data-timer-reset>Reset<\/button>\n        <\/div>\n      <\/div>\n      <div class=\"wpanel-tabu-progress\">\n        <div class=\"wpanel-tabu-progress-bar\" data-progress><\/div>\n      <\/div>\n      <div class=\"wpanel-tabu-timer-hint\">Timer jest opcjonalny \u2014 mo\u017cesz gra\u0107 bez odliczania.<\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"wpanel-tabu-actions\">\n    <button type=\"button\" class=\"wpanel-tabu-btn\" data-next>\ud83c\udfb4 Nast\u0119pna karta<\/button>\n    <button type=\"button\" class=\"wpanel-tabu-btn is-ghost\" data-reset>\ud83d\udd01 Reset talii<\/button>\n  <\/div>\n\n  <div class=\"wpanel-tabu-hint\"><\/div>\n<\/div>\n\n<script>\n(() => {\n  document.querySelectorAll('[data-wpanel-tabu]').forEach((root) => {\n    const wordEl = root.querySelector('[data-word]');\n    const bannedEl = root.querySelector('[data-banned]');\n    const leftEl = root.querySelector('[data-left]');\n    const nextBtn = root.querySelector('[data-next]');\n    const resetBtn = root.querySelector('[data-reset]');\n\n    const timeEl = root.querySelector('[data-time]');\n    const progressEl = root.querySelector('[data-progress]');\n    const timerToggleBtn = root.querySelector('[data-timer-toggle]');\n    const timerResetBtn = root.querySelector('[data-timer-reset]');\n\n    const secondsTotal = parseInt(root.getAttribute('data-seconds') || '60', 10);\n\n    \/\/ \u2705 TU EDYTUJ TALIE TABU\n    \/\/ has\u0142o = \"word\", zakazane = \"taboo\" (4\u20136 najlepiej)\n    const cards = [\n      { word: \"Pan M\u0142ody\", taboo: [\"garnitur\", \"\u015blub\", \"wesele\", \"m\u0105\u017c\", \"krawat\"] },\n      { word: \"Panna M\u0142oda\", taboo: [\"suknia\", \"welon\", \"\u015blub\", \"\u017cona\", \"bukiet\"] },\n      { word: \"Pierwszy taniec\", taboo: [\"parkiet\", \"piosenka\", \"para\", \"walc\", \"DJ\"] },\n      { word: \"Tort\", taboo: [\"s\u0142odki\", \"krem\", \"kawa\u0142ek\", \"cukier\", \"ciasto\"] },\n      { word: \"Toast\", taboo: [\"szampan\", \"kieliszek\", \"zdrowie\", \"wznosimy\", \"mowa\"] },\n      { word: \"Fotobudka\", taboo: [\"zdj\u0119cie\", \"rekwizyty\", \"pozowanie\", \"aparat\", \"druk\"] },\n      { word: \"Welon\", taboo: [\"g\u0142owa\", \"suknia\", \"tiul\", \"panna\", \"bia\u0142y\"] },\n      { word: \"Bukiet\", taboo: [\"kwiaty\", \"rzut\", \"panna\", \"\u0142odygi\", \"wi\u0105zanka\"] }\n    ];\n\n    \/\/ --- talia bez powt\u00f3rek ---\n    let bag = [];\n    let current = null;\n\n    const shuffle = (arr) => {\n      for (let i = arr.length - 1; i > 0; i--) {\n        const j = Math.floor(Math.random() * (i + 1));\n        [arr[i], arr[j]] = [arr[j], arr[i]];\n      }\n      return arr;\n    };\n\n    const refill = () => {\n      bag = shuffle([...cards]);\n      updateLeft();\n      setIdleCard();\n      stopTimer(true);\n      renderTimer(secondsTotal);\n    };\n\n    const updateLeft = () => {\n      leftEl.textContent = `Pozosta\u0142o: ${bag.length}`;\n    };\n\n    const setIdleCard = () => {\n      wordEl.textContent = \"Kliknij \u201eNast\u0119pna karta\u201d \ud83c\udfad\";\n      bannedEl.innerHTML = \"<li>\u2014<\/li>\";\n      root.classList.remove('is-reveal', 'is-timeup');\n    };\n\n    const renderCard = (card) => {\n      root.classList.remove('is-timeup');\n      wordEl.textContent = card.word;\n      bannedEl.innerHTML = \"\";\n      (card.taboo || []).forEach((t) => {\n        const li = document.createElement('li');\n        li.textContent = t;\n        bannedEl.appendChild(li);\n      });\n      root.classList.add('is-reveal');\n      setTimeout(() => root.classList.remove('is-reveal'), 500);\n    };\n\n    \/\/ --- timer ---\n    let timerRunning = false;\n    let remaining = secondsTotal; \/\/ sekundy\n    let tInterval = null;\n    let endAt = null;\n\n    const fmt = (s) => {\n      const m = Math.floor(s \/ 60);\n      const r = s % 60;\n      return `${String(m).padStart(2,'0')}:${String(r).padStart(2,'0')}`;\n    };\n\n    const renderTimer = (sec) => {\n      timeEl.textContent = fmt(sec);\n      const ratio = secondsTotal > 0 ? (sec \/ secondsTotal) : 0;\n      progressEl.style.width = (ratio * 100) + '%';\n    };\n\n    const startTimer = () => {\n      if (timerRunning) return;\n      timerRunning = true;\n      timerToggleBtn.textContent = \"Pauza\";\n      endAt = Date.now() + remaining * 1000;\n\n      tInterval = setInterval(() => {\n        const msLeft = Math.max(0, endAt - Date.now());\n        const secLeft = Math.ceil(msLeft \/ 1000);\n        remaining = secLeft;\n        renderTimer(remaining);\n\n        if (msLeft <= 0) {\n          stopTimer(false);\n          root.classList.add('is-timeup');\n        }\n      }, 200);\n    };\n\n    const stopTimer = (resetLabelOnly) => {\n      timerRunning = false;\n      if (tInterval) clearInterval(tInterval);\n      tInterval = null;\n      timerToggleBtn.textContent = \"Start\";\n      if (!resetLabelOnly) renderTimer(remaining);\n    };\n\n    const resetTimer = () => {\n      remaining = secondsTotal;\n      renderTimer(remaining);\n      root.classList.remove('is-timeup');\n      stopTimer(true);\n    };\n\n    \/\/ --- actions ---\n    nextBtn.addEventListener('click', () => {\n      if (!cards.length) return;\n\n      if (bag.length === 0) {\n        wordEl.textContent = \"Talia si\u0119 sko\u0144czy\u0142a \u2014 kliknij \u201eReset talii\u201d \ud83d\udd01\";\n        bannedEl.innerHTML = \"<li>\u2014<\/li>\";\n        updateLeft();\n        return;\n      }\n\n      current = bag.pop();\n      updateLeft();\n      renderCard(current);\n\n      \/\/ opcjonalnie: ka\u017cda nowa karta resetuje timer do pe\u0142na\n      resetTimer();\n    });\n\n    resetBtn.addEventListener('click', () => {\n      refill();\n    });\n\n    timerToggleBtn.addEventListener('click', () => {\n      if (timerRunning) stopTimer(false);\n      else startTimer();\n    });\n\n    timerResetBtn.addEventListener('click', () => {\n      resetTimer();\n    });\n\n    \/\/ init\n    refill();\n  });\n})();\n<\/script>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Tabu weselne Weselna ods\u0142ona popularnej gry w tabu polegaj\u0105cej na opisie danego s\u0142owa bez u\u017cywania s\u0142\u00f3w zakazanych w taki spos\u00f3b, aby druga osoba je odgad\u0142a. Mo\u017ce by\u0107 wykorzystana dowolnie przez go\u015bci lub np. w trakcie oczepin, gdy strona z losowaniem s\u0142\u00f3w jest wy\u015bwietlana na ekranie, a osoba zgaduj\u0105ca stoi do niej ty\u0142em (w takim przypadku [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"ocean_post_layout":"","ocean_both_sidebars_style":"","ocean_both_sidebars_content_width":0,"ocean_both_sidebars_sidebars_width":0,"ocean_sidebar":"","ocean_second_sidebar":"","ocean_disable_margins":"on","ocean_add_body_class":"","ocean_shortcode_before_top_bar":"","ocean_shortcode_after_top_bar":"","ocean_shortcode_before_header":"","ocean_shortcode_after_header":"","ocean_has_shortcode":"","ocean_shortcode_after_title":"","ocean_shortcode_before_footer_widgets":"","ocean_shortcode_after_footer_widgets":"","ocean_shortcode_before_footer_bottom":"","ocean_shortcode_after_footer_bottom":"","ocean_display_top_bar":"off","ocean_display_header":"off","ocean_header_style":"","ocean_center_header_left_menu":"","ocean_custom_header_template":"","ocean_custom_logo":0,"ocean_custom_retina_logo":0,"ocean_custom_logo_max_width":0,"ocean_custom_logo_tablet_max_width":0,"ocean_custom_logo_mobile_max_width":0,"ocean_custom_logo_max_height":0,"ocean_custom_logo_tablet_max_height":0,"ocean_custom_logo_mobile_max_height":0,"ocean_header_custom_menu":"","ocean_menu_typo_font_family":"","ocean_menu_typo_font_subset":"","ocean_menu_typo_font_size":0,"ocean_menu_typo_font_size_tablet":0,"ocean_menu_typo_font_size_mobile":0,"ocean_menu_typo_font_size_unit":"px","ocean_menu_typo_font_weight":"","ocean_menu_typo_font_weight_tablet":"","ocean_menu_typo_font_weight_mobile":"","ocean_menu_typo_transform":"","ocean_menu_typo_transform_tablet":"","ocean_menu_typo_transform_mobile":"","ocean_menu_typo_line_height":0,"ocean_menu_typo_line_height_tablet":0,"ocean_menu_typo_line_height_mobile":0,"ocean_menu_typo_line_height_unit":"","ocean_menu_typo_spacing":0,"ocean_menu_typo_spacing_tablet":0,"ocean_menu_typo_spacing_mobile":0,"ocean_menu_typo_spacing_unit":"","ocean_menu_link_color":"","ocean_menu_link_color_hover":"","ocean_menu_link_color_active":"","ocean_menu_link_background":"","ocean_menu_link_hover_background":"","ocean_menu_link_active_background":"","ocean_menu_social_links_bg":"","ocean_menu_social_hover_links_bg":"","ocean_menu_social_links_color":"","ocean_menu_social_hover_links_color":"","ocean_disable_title":"default","ocean_disable_heading":"default","ocean_post_title":"","ocean_post_subheading":"","ocean_post_title_style":"","ocean_post_title_background_color":"","ocean_post_title_background":0,"ocean_post_title_bg_image_position":"","ocean_post_title_bg_image_attachment":"","ocean_post_title_bg_image_repeat":"","ocean_post_title_bg_image_size":"","ocean_post_title_height":0,"ocean_post_title_bg_overlay":0.5,"ocean_post_title_bg_overlay_color":"","ocean_disable_breadcrumbs":"default","ocean_breadcrumbs_color":"","ocean_breadcrumbs_separator_color":"","ocean_breadcrumbs_links_color":"","ocean_breadcrumbs_links_hover_color":"","ocean_display_footer_widgets":"off","ocean_display_footer_bottom":"default","ocean_custom_footer_template":"","iawp_total_views":36,"footnotes":""},"class_list":["post-2222","page","type-page","status-publish","hentry","entry"],"_links":{"self":[{"href":"https:\/\/weddingpanel.pl\/en\/wp-json\/wp\/v2\/pages\/2222","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/weddingpanel.pl\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/weddingpanel.pl\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/weddingpanel.pl\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/weddingpanel.pl\/en\/wp-json\/wp\/v2\/comments?post=2222"}],"version-history":[{"count":8,"href":"https:\/\/weddingpanel.pl\/en\/wp-json\/wp\/v2\/pages\/2222\/revisions"}],"predecessor-version":[{"id":2237,"href":"https:\/\/weddingpanel.pl\/en\/wp-json\/wp\/v2\/pages\/2222\/revisions\/2237"}],"wp:attachment":[{"href":"https:\/\/weddingpanel.pl\/en\/wp-json\/wp\/v2\/media?parent=2222"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}