{"id":66,"date":"2026-03-16T16:01:41","date_gmt":"2026-03-16T16:01:41","guid":{"rendered":"https:\/\/kiitmismasin.ee\/?page_id=66"},"modified":"2026-04-17T08:22:59","modified_gmt":"2026-04-17T08:22:59","slug":"kiitmismasin","status":"publish","type":"page","link":"https:\/\/praisemachine.com\/en\/","title":{"rendered":"Kiitmismasin aktiivne"},"content":{"rendered":"\n<p>Genereeri hetkega naljakaid kommentaare eputavatele v\u00f5i m\u00f5ttetutele sotsiaalmeedia postitustele; <br>Koosta l\u00f5bus kiidulaul, luuletus v\u00f5i joonistus s\u00f5brale; <br>Vibe check aitab kriitiliselt anal\u00fc\u00fcsida kuidas sisestatud postitust v\u00f5idakse t\u00f5lgendada. <br><br>\u00c4ra naeruv\u00e4\u00e4rista inimest \u2013 vaid teguviisi.<\/p>\n\n\n<div id=\"km-app\">\n  <div class=\"km-grid\">\n\n    <div class=\"km-panel km-left\">\n\n      <h2 class=\"km-title\" id=\"km-title-input\">Sisend<\/h2>\n\n      <div class=\"km-tabs\">\n        <button type=\"button\" id=\"km-tab-comment\" class=\"km-tab km-tab-active\" data-tooltip-et=\"Genereeri kommentaar postitusele\" data-tooltip-en=\"Generate a comment for the post\">\n          <span class=\"km-text-et\">Kommentaar<\/span>\n          <span class=\"km-text-en\" style=\"display:none;\">Comment<\/span>\n        <\/button>\n        <button type=\"button\" id=\"km-tab-praise\" class=\"km-tab\" data-tooltip-et=\"Koosta jutuke, luuletus, diplom v\u00f5i karikatuur s\u00f5brale\" data-tooltip-en=\"Create a story, poem, diploma or caricature for a friend\">\n          <span class=\"km-text-et\">Kiitus<\/span>\n          <span class=\"km-text-en\" style=\"display:none;\">Praise<\/span>\n        <\/button>\n        <button type=\"button\" id=\"km-tab-vibe\" class=\"km-tab\" data-tooltip-et=\"Vaata mida inimesed sinu postituses n\u00e4evad\" data-tooltip-en=\"See what people see in your post\">\n          <span class=\"km-text-et\">Vibe Check<\/span>\n          <span class=\"km-text-en\" style=\"display:none;\">Vibe Check<\/span>\n        <\/button>\n      <\/div>\n\n      <div id=\"km-praise-fields\" style=\"display:none; margin-top:20px;\">\n        <label class=\"km-label\">\n          <span class=\"km-text-et\">Taustainfo<\/span>\n          <span class=\"km-text-en\" style=\"display:none;\">Background info<\/span>\n        <\/label>\n        <div class=\"km-input-wrapper\">\n          <textarea id=\"km-praise-info\" class=\"km-textarea\"\n            data-placeholder-et=\"Kirjuta siia info mida pead kiidetava juures oluliseks: nimi, vanus, s\u00fcndmus, amet, hobid jms.\"\n            data-placeholder-en=\"Write here info about the person you want to praise: name, age, event, job, hobbies etc.\"\n            placeholder=\"Kirjuta siia info mida pead kiidetava juures oluliseks: nimi, vanus, s\u00fcndmus, amet, hobid jms.\"><\/textarea>\n          <div class=\"km-input-footer\">\n            <button id=\"km-praise-add-file\" type=\"button\" class=\"km-attach-btn\">+<\/button>\n            <input type=\"file\" id=\"km-praise-media\" style=\"display:none;\" accept=\"image\/*\">\n            <span id=\"km-praise-file-status\" class=\"km-file-status\"><\/span>\n            <button id=\"km-praise-remove-file\" class=\"km-remove-file\" style=\"display:none;\">\u2715<\/button>\n            <span id=\"km-praise-paste-preview-wrap\" style=\"display:none; align-items:center; gap:4px;\">\n              <img id=\"km-praise-paste-preview\" style=\"max-height:40px; border-radius:6px;\">\n              <button id=\"km-praise-paste-remove\" class=\"km-remove-file\">\u2715<\/button>\n            <\/span>\n            <button id=\"km-clear-praise\" type=\"button\" class=\"km-clear-btn\" title=\"T\u00fchjenda sisend\">\n              <span class=\"km-text-et\">T\u00fchjenda<\/span>\n              <span class=\"km-text-en\" style=\"display:none;\">Clear<\/span>\n            <\/button>\n          <\/div>\n        <\/div>\n\n        <label class=\"km-label\" for=\"km-praise-form\">\n          <span class=\"km-text-et\">Vormi t\u00fc\u00fcp<\/span>\n          <span class=\"km-text-en\" style=\"display:none;\">Format<\/span>\n        <\/label>\n        <select id=\"km-praise-form\" class=\"km-select\">\n          <option value=\"proosa\">\n            <span class=\"km-text-et\">Kiidulaul\/jutuke<\/span>\n          <\/option>\n          <option value=\"luuletus\">\n            <span class=\"km-text-et\">Luuletus<\/span>\n          <\/option>\n          <option value=\"diplom\">\n            <span class=\"km-text-et\">Diplom<\/span>\n          <\/option>\n          <option value=\"joonistus\">\n            <span class=\"km-text-et\">Joonistus\/karikatuur<\/span>\n          <\/option>\n        <\/select>\n\n        <label class=\"km-label\" for=\"km-stiil-praise\">\n          <span class=\"km-text-et\">Stiil<\/span>\n          <span class=\"km-text-en\" style=\"display:none;\">Style<\/span>\n        <\/label>\n        <select id=\"km-stiil-praise\" class=\"km-select\">\n          <option value=\"Naljakas\" data-et=\"Naljakas\" data-en=\"Funny\">Naljakas<\/option>\n          <option value=\"Poeetiline\" data-et=\"Poeetiline\" data-en=\"Poetic\">Poeetiline<\/option>\n          <option value=\"Liigutav\" data-et=\"Liigutav\" data-en=\"Touching\">Liigutav<\/option>\n          <option value=\"T\u00f5sine\" data-et=\"T\u00f5sine\" data-en=\"Serious\">T\u00f5sine<\/option>\n        <\/select>\n      <\/div>\n\n      <div id=\"km-comment-vibe-fields\">\n        <label class=\"km-label\">\n          <span class=\"km-text-et\">Postitus<\/span>\n          <span class=\"km-text-en\" style=\"display:none;\">Post<\/span>\n        <\/label>\n        <div class=\"km-input-wrapper\">\n          <textarea id=\"km-postitus\" class=\"km-textarea\"\n            data-placeholder-et=\"Kirjuta v\u00f5i kleebi siia sotsiaalmeedia postitus, mida soovid kommenteerida.\"\n            data-placeholder-en=\"Write or paste here the social media post you want to comment on.\"\n            placeholder=\"Kirjuta v\u00f5i kleebi siia sotsiaalmeedia postitus, mida soovid kommenteerida.\"><\/textarea>\n          <div class=\"km-input-footer\">\n            <button id=\"km-add-file\" type=\"button\" class=\"km-attach-btn\">+<\/button>\n            <input type=\"file\" id=\"km-media\" style=\"display:none;\" accept=\"image\/*\">\n            <span id=\"km-file-status\" class=\"km-file-status\"><\/span>\n            <button id=\"km-remove-file\" class=\"km-remove-file\" style=\"display:none;\">\u2715<\/button>\n            <span id=\"km-paste-preview-wrap\" style=\"display:none; align-items:center; gap:4px;\">\n              <img id=\"km-paste-preview\" style=\"max-height:40px; border-radius:6px;\">\n              <button id=\"km-paste-remove\" class=\"km-remove-file\">\u2715<\/button>\n            <\/span>\n            <button id=\"km-clear-postitus\" type=\"button\" class=\"km-clear-btn\">\n              <span class=\"km-text-et\">T\u00fchjenda<\/span>\n              <span class=\"km-text-en\" style=\"display:none;\">Clear<\/span>\n            <\/button>\n          <\/div>\n        <\/div>\n\n        <div id=\"km-kontekst-wrap\">\n          <label class=\"km-label\" for=\"km-kontekst\">\n            <span class=\"km-text-et\">Lisakontekst<\/span>\n            <span class=\"km-text-en\" style=\"display:none;\">Additional context<\/span>\n          <\/label>\n          <textarea id=\"km-kontekst\" class=\"km-textarea km-small\"\n            data-placeholder-et=\"Lisa siia t\u00e4psustav kontekst v\u00f5i muu oluline info, mida arvesse v\u00f5tta.\"\n            data-placeholder-en=\"Add here any additional context or important info to consider.\"\n            placeholder=\"Lisa siia t\u00e4psustav kontekst v\u00f5i muu oluline info, mida arvesse v\u00f5tta.\"><\/textarea>\n        <\/div>\n\n        <div id=\"km-stiil-wrap\" style=\"display:none;\">\n          <div class=\"km-row\">\n            <div class=\"km-col\">\n              <label class=\"km-label\" for=\"km-stiil\">\n                <span class=\"km-text-et\">Stiil<\/span>\n                <span class=\"km-text-en\" style=\"display:none;\">Style<\/span>\n              <\/label>\n              <select id=\"km-stiil\" class=\"km-select\">\n                <option value=\"Irooniline\" data-et=\"Irooniline\" data-en=\"Ironic\">Irooniline<\/option>\n                <option value=\"Naljakas\" data-et=\"Naljakas\" data-en=\"Funny\">Naljakas<\/option>\n                <option value=\"Absurdne\" data-et=\"Absurdne\" data-en=\"Absurd\">Absurdne<\/option>\n                <option value=\"Poeetiline\" data-et=\"Poeetiline\" data-en=\"Poetic\">Poeetiline<\/option>\n                <option value=\"T\u00f5sine\" data-et=\"T\u00f5sine\" data-en=\"Serious\">T\u00f5sine<\/option>\n                <option value=\"Liigutav\" data-et=\"Liigutav\" data-en=\"Touching\">Liigutav<\/option>\n              <\/select>\n            <\/div>\n            <div class=\"km-col\">\n              <label class=\"km-label\" for=\"km-tugevus\">\n                <span class=\"km-text-et\">Tugevus<\/span>\n                <span class=\"km-text-en\" style=\"display:none;\">Intensity<\/span>\n              <\/label>\n              <select id=\"km-tugevus\" class=\"km-select\">\n                <option value=\"Tagasihoidlik\" data-et=\"Tagasihoidlik\" data-en=\"Mild\">Tagasihoidlik<\/option>\n                <option value=\"Julge\" data-et=\"Julge\" data-en=\"Bold\">Julge<\/option>\n                <option value=\"\u00dcle v\u00f5lli\" data-et=\"\u00dcle v\u00f5lli\" data-en=\"Over the top\">\u00dcle v\u00f5lli<\/option>\n              <\/select>\n            <\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <button id=\"km-generate\" class=\"km-btn km-btn-primary\">\n        <span class=\"km-text-et\">Genereeri<\/span>\n        <span class=\"km-text-en\" style=\"display:none;\">Generate<\/span>\n      <\/button>\n      <div id=\"km-status\" class=\"km-status\"><\/div>\n    <\/div>\n\n    <div class=\"km-ad-mobile\" style=\"margin:20px 0; display:none;\">\n      <div class=\"km-ad-box\">\n        <span class=\"km-text-et\">Reklaamikast (mobiil)<\/span>\n        <span class=\"km-text-en\" style=\"display:none;\">Ad box (mobile)<\/span>\n      <\/div>\n    <\/div>\n\n    <div class=\"km-panel km-right\">\n      <h2 id=\"km-output-title\" class=\"km-title\">Kommentaar<\/h2>\n      <div id=\"km-output\" class=\"km-output km-output-empty\" contenteditable=\"true\">Siia ilmub kommentaar postitusele, mida saad soovi korral muuta.<\/div>\n\n      <div class=\"km-ad-desktop\" style=\"margin-top:20px; display:none;\">\n        <div class=\"km-ad-box\">\n          <span class=\"km-text-et\">Reklaamikast (desktop)<\/span>\n          <span class=\"km-text-en\" style=\"display:none;\">Ad box (desktop)<\/span>\n        <\/div>\n      <\/div>\n\n      <div id=\"km-actions\" class=\"km-actions\">\n        <button id=\"km-more\" class=\"km-btn\" disabled\n          data-tooltip-et=\"Genereeri uus kommentaar sama info p\u00f5hjal\"\n          data-tooltip-en=\"Generate a new comment based on the same info\">\n          <span class=\"km-text-et\">N\u00e4ita veel<\/span>\n          <span class=\"km-text-en\" style=\"display:none;\">Show more<\/span>\n        <\/button>\n        <button id=\"km-copy\" class=\"km-btn\" disabled\n          data-tooltip-et=\"Kopeeri kommentaar ja kleebi enda valitud platvormil\"\n          data-tooltip-en=\"Copy comment and paste on your chosen platform\">\n          <span class=\"km-text-et\">Kopeeri<\/span>\n          <span class=\"km-text-en\" style=\"display:none;\">Copy<\/span>\n        <\/button>\n      <\/div>\n    <\/div>\n\n  <\/div>\n<\/div>\n\n<div id=\"km-tooltip\" class=\"km-tooltip-box\"><\/div>\n\n<style>\n:root {\n  --km-dark: #0d1035;\n  --km-blue-dark: #0d1b4b;\n  --km-blue-mid: #1a3a8f;\n  --km-purple: #6b3fa0;\n  --km-pink: #c0329a;\n  --km-gradient: linear-gradient(135deg, #2f5fff 0%, #7b3ff5 50%, #ff3fa0 100%);\n  --km-gradient-subtle: linear-gradient(135deg, #4b6fff22 0%, #9b4fff22 100%);\n  --km-text-dark: #0d1b4b;\n  --km-text-mid: #3a5080;\n  --km-placeholder: #7a9acc;\n  --km-panel-bg: #fff5fb;\n  --km-panel-border: #e8d5f0;\n  --km-input-bg: #fff8fd;\n}\n\n#km-app {\n  max-width: 1100px;\n  margin: 32px auto;\n  padding: 0 16px;\n  box-sizing: border-box;\n}\n\n.km-grid {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 24px;\n  align-items: stretch;\n}\n\n.km-panel {\n  background: var(--km-panel-bg);\n  border: 1px solid var(--km-panel-border);\n  border-radius: 20px;\n  padding: 24px;\n  box-shadow: 0 8px 30px rgba(13,16,53,0.15);\n}\n\n.km-lang-switcher {\n  display: flex;\n  gap: 6px;\n  margin-bottom: 16px;\n  justify-content: flex-end;\n}\n\n.km-lang-btn {\n  padding: 4px 12px;\n  border-radius: 8px;\n  border: 1px solid #d9d9e8;\n  background: #e8eaf6;\n  color: var(--km-text-mid);\n  font-size: 13px;\n  font-weight: 600;\n  cursor: pointer;\n  transition: all 0.2s ease;\n}\n\n.km-lang-btn.km-lang-active {\n  background: var(--km-gradient);\n  color: #fff;\n  border-color: transparent;\n}\n\n.km-title {\n  margin: 0 0 18px 0;\n  font-size: 28px;\n  font-weight: 600;\n  color: var(--km-text-dark);\n  line-height: 1.15;\n}\n\n.km-label {\n  display: block;\n  font-weight: 600;\n  margin: 14px 0 8px;\n  font-size: 15px;\n  color: var(--km-text-dark);\n}\n\n.km-textarea, .km-select, .km-file {\n  width: 100%;\n  box-sizing: border-box;\n  border: 1px solid #d9d9e8;\n  border-radius: 12px;\n  padding: 14px;\n  font-size: 16px;\n  line-height: 1.4;\n  background: var(--km-input-bg);\n  color: var(--km-text-dark);\n}\n\n.km-textarea::placeholder {\n  color: var(--km-placeholder);\n}\n\n.km-select {\n  min-height: 52px;\n  padding: 14px 16px;\n  -webkit-appearance: none;\n  appearance: none;\n  background-image: url(\"data:image\/svg+xml;utf8,<svg fill='%230d1b4b' height='20' viewBox='0 0 24 24' width='20' xmlns='http:\/\/www.w3.org\/2000\/svg'><path d='M7 10l5 5 5-5z'\/><\/svg>\");\n  background-repeat: no-repeat;\n  background-position: right 12px center;\n  background-size: 16px;\n  padding-right: 40px;\n}\n\n.km-textarea { min-height: 150px; resize: vertical; }\n.km-small { min-height: 110px; }\n.km-row { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-top: 4px; }\n\n.km-tabs {\n  display: grid;\n  grid-template-columns: 1fr 1fr 1fr;\n  gap: 8px;\n  margin-bottom: 16px;\n}\n\n.km-tab {\n  text-align: center;\n  border: none;\n  border-radius: 12px;\n  padding: 12px 8px;\n  font-size: 15px;\n  font-weight: 600;\n  cursor: pointer;\n  background: #e8eaf6;\n  color: var(--km-text-mid);\n  transition: all 0.2s ease;\n  white-space: nowrap;\n  position: relative;\n}\n\n.km-tab:hover { background: #d0d4f0; }\n\n.km-tab-active {\n  background: var(--km-gradient) !important;\n  color: #ffffff !important;\n  box-shadow: 0 4px 15px rgba(47,95,255,0.3);\n}\n\n.km-btn {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: 100%;\n  min-height: 48px;\n  border: none;\n  border-radius: 12px;\n  padding: 12px 18px;\n  font-size: 16px;\n  font-weight: 600;\n  line-height: 1.2;\n  cursor: pointer;\n  background: #e8eaf6;\n  color: var(--km-text-dark);\n  box-sizing: border-box;\n  appearance: none;\n  transition: all 0.2s ease;\n  position: relative;\n}\n\n.km-btn:hover { opacity: 0.9; }\n.km-btn:disabled { opacity: 0.45; cursor: not-allowed; }\n\n.km-btn-primary {\n  margin-top: 18px;\n  background: var(--km-gradient);\n  color: #fff;\n  box-shadow: 0 4px 20px rgba(47,95,255,0.3);\n}\n\n.km-btn-primary:hover {\n  box-shadow: 0 6px 25px rgba(47,95,255,0.45);\n  opacity: 1;\n  filter: brightness(1.05);\n}\n\n.km-actions {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 10px;\n  margin-top: 16px;\n}\n\n.km-output {\n  min-height: 240px;\n  border: 1px solid #d9d9e8;\n  border-radius: 14px;\n  padding: 18px;\n  font-size: 17px;\n  line-height: 1.6;\n  white-space: pre-wrap;\n  background: var(--km-input-bg);\n  color: var(--km-text-dark);\n  transition: opacity .2s ease, filter .2s ease;\n  display: block !important;\n  text-align: left;\n}\n\n.km-output.km-output-empty {\n  font-size: 16px;\n  color: var(--km-placeholder);\n  font-weight: 400;\n}\n\n.km-loading { opacity: .6; filter: blur(1px); }\n\n.km-tooltip-box {\n  position: fixed;\n  background: var(--km-dark);\n  color: #e0d0f0;\n  padding: 8px 14px;\n  border-radius: 8px;\n  font-size: 13px;\n  pointer-events: none;\n  z-index: 9999;\n  max-width: 220px;\n  text-align: center;\n  opacity: 0;\n  transition: opacity 0.2s ease;\n  border: 1px solid #2a2060;\n  line-height: 1.4;\n}\n\n.km-tooltip-box.visible { opacity: 1; }\n\n.km-input-wrapper {\n  border: 1px solid #d9d9e8;\n  border-radius: 12px;\n  background: var(--km-input-bg);\n  overflow: hidden;\n  margin-top: 8px;\n}\n\n.km-input-wrapper .km-textarea {\n  border: none !important;\n  border-radius: 12px 12px 0 0 !important;\n  box-shadow: none !important;\n  margin: 0 !important;\n  width: 100% !important;\n  box-sizing: border-box !important;\n  display: block !important;\n  padding: 14px !important;\n}\n\n.km-input-footer {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  padding: 8px 12px;\n  border-top: 1px solid #ede8f5;\n  background: #f8f5fc;\n}\n\n.km-attach-btn {\n  width: 30px;\n  height: 30px;\n  border-radius: 50%;\n  border: 1px solid #c8c0e0;\n  background: #fff;\n  font-size: 20px;\n  line-height: 1;\n  cursor: pointer;\n  color: var(--km-text-mid);\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  flex-shrink: 0;\n  padding: 0;\n}\n\n.km-attach-btn:hover { background: #f0ecf8; }\n.km-file-status { font-size: 13px; color: var(--km-text-mid); }\n\n.km-remove-file {\n  background: none;\n  border: none;\n  color: #9ca3af;\n  cursor: pointer;\n  font-size: 16px;\n  padding: 0 4px;\n}\n\n.km-clear-btn {\n  margin-left: auto;\n  background: none;\n  border: none;\n  color: var(--km-placeholder);\n  font-size: 12px;\n  cursor: pointer;\n  padding: 2px 6px;\n  border-radius: 6px;\n}\n\n.km-clear-btn:hover { color: #ef4444; background: #fef2f2; }\n\n.km-vibe-heading { margin: 12px 0 2px; font-weight: 700; font-size: 15px; color: var(--km-text-dark); }\n.km-vibe-body { margin: 0 0 4px; font-size: 16px; color: var(--km-text-mid); line-height: 1.55; }\n.km-vibe-note { margin-top: 16px; font-size: 13px; color: var(--km-placeholder); }\n.km-status { margin-top: 10px; min-height: 24px; font-size: 14px; color: var(--km-text-mid); }\n.km-signature-row { margin-top: 12px; font-size: 13px; color: var(--km-text-mid); }\n.km-signature-row.passive span { color: var(--km-placeholder); }\n\n.km-ad-desktop, .km-ad-mobile { width: 100%; display: none; }\n.km-ad-box {\n  background: #f0ecf8;\n  border: 1px dashed #c8c0e0;\n  padding: 40px 20px;\n  text-align: center;\n  color: var(--km-text-mid);\n  font-size: 14px;\n  min-height: 120px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n@media (min-width: 901px) { .km-ad-desktop.is-visible { display: block !important; } }\n@media (max-width: 900px) { .km-ad-mobile.is-visible { display: block !important; } }\n\n@media (max-width: 900px) {\n  #km-app { padding: 0 10px; margin: 12px auto; }\n  .km-grid { display: block !important; }\n  .km-panel {\n    width: 100% !important;\n    max-width: 100% !important;\n    margin-bottom: 16px !important;\n    border-radius: 16px !important;\n    padding: 18px !important;\n  }\n  .km-tabs {\n    display: grid;\n    grid-template-columns: 1fr 1fr;\n    grid-template-rows: auto auto;\n    gap: 8px;\n  }\n  #km-tab-comment { grid-column: 1; grid-row: 1; }\n  #km-tab-vibe    { grid-column: 2; grid-row: 1; }\n  #km-tab-praise  { grid-column: 1 \/ -1; grid-row: 2; }\n  .km-tab { font-size: 14px; padding: 11px 8px; white-space: normal; }\n  .km-btn { width: 100%; padding: 14px 18px; font-size: 17px; min-height: 52px; }\n  .km-btn-primary { font-size: 18px; padding: 16px; }\n  .km-actions { grid-template-columns: 1fr; gap: 10px; }\n  .km-output { font-size: 17px; padding: 16px; }\n  .km-title { font-size: 24px; }\n}\n<\/style>\n\n<script>\n(function(){\n\n  const REST_URL = \"https:\/\/praisemachine.com\/en\/wp-json\/kiitmismasin\/v1\/generate\";\n  const WP_NONCE = \"fb3cff8253\";\n\n  \/\/ =============================================\n  \/\/ TRANSLATIONS\n  \/\/ =============================================\n  const translations = {\n    et: {\n      inputTitle: 'Sisend',\n      commentTitle: 'Kommentaar',\n      praiseTitle: 'Kiitus \/ \u00d5nnitlus',\n      vibeTitle: 'Vibe Check',\n      commentPlaceholder: 'Siia ilmub kommentaar postitusele, mida saad soovi korral muuta.',\n      praisePlaceholder: 'Siia ilmub tunnustus v\u00f5i \u00f5nnitlus sinu poolt valitud tegelasele.',\n      vibePlaceholder: 'Siia ilmub anal\u00fc\u00fcs, kuidas seda postitust v\u00f5idakse m\u00f5ista v\u00f5i t\u00f5lgendada.',\n      generating: 'Genereerin',\n      generate: 'Genereeri',\n      showMore: 'N\u00e4ita veel',\n      copy: 'Kopeeri',\n      copied: 'Kopeeritud.',\n      copyFailed: 'Kopeerimine ei \u00f5nnestunud.',\n      openImage: 'Ava pilt',\n      imageHint: 'Vajuta pildile et avada t\u00e4issuuruses \u2014 sealt saad salvestada ja jagada.',\n      signature: 'Genereeritud Kiitmismasin.ee poolt',\n      errorNoPost: 'Lisa v\u00e4hemalt postitus v\u00f5i \u00fcks pilt.',\n      errorNoPraise: 'Sisesta kiituse taustainfo.',\n      errorService: 'Teenusel on ajutine t\u00f5rge. Palun proovi m\u00f5ne hetke p\u00e4rast uuesti.',\n      postitusPlaceholder: 'Kirjuta v\u00f5i kleebi siia sotsiaalmeedia postitus, mida soovid kommenteerida.',\n      kontekstPlaceholder: 'Lisa siia t\u00e4psustav kontekst v\u00f5i muu oluline info, mida arvesse v\u00f5tta.',\n      vibePlaceholderInput: 'Kirjuta v\u00f5i kleebi siia postitus, mille kohta soovid kriitilist anal\u00fc\u00fcsi.',\n      vibeKontekstPlaceholder: 'Lisa siia t\u00e4psustav info, mida arvesse v\u00f5tta.',\n      praiseInfoPlaceholder: 'Kirjuta siia info mida pead kiidetava juures oluliseks: nimi, vanus, s\u00fcndmus, amet, hobid jms.',\n      vibeNote: 'NB! Anal\u00fc\u00fcs ei pretendeeri absoluutsele t\u00f5ele \u2013 inimesed m\u00f5istavad postitusi erinevalt.',\n      praiseFormOptions: ['Kiidulaul\/jutuke', 'Luuletus', 'Diplom', 'Joonistus\/karikatuur'],\n      stiilOptions: ['Naljakas', 'Poeetiline', 'Liigutav', 'T\u00f5sine'],\n      commentStiilOptions: ['Irooniline', 'Naljakas', 'Absurdne', 'Poeetiline', 'T\u00f5sine', 'Liigutav'],\n      tugevusOptions: ['Tagasihoidlik', 'Julge', '\u00dcle v\u00f5lli'],\n    },\n    en: {\n      inputTitle: 'Input',\n      commentTitle: 'Comment',\n      praiseTitle: 'Praise \/ Greeting',\n      vibeTitle: 'Vibe Check',\n      commentPlaceholder: 'Your comment will appear here. Feel free to edit it.',\n      praisePlaceholder: 'Your praise or greeting will appear here.',\n      vibePlaceholder: 'The analysis of how this post might be perceived will appear here.',\n      generating: 'Generating',\n      generate: 'Generate',\n      showMore: 'Show more',\n      copy: 'Copy',\n      copied: 'Copied.',\n      copyFailed: 'Copy failed.',\n      openImage: 'Open image',\n      imageHint: 'Click the image to open full size \u2014 you can save and share from there.',\n      signature: 'Generated by Praise Machine',\n      errorNoPost: 'Please add at least a post or an image.',\n      errorNoPraise: 'Please enter background info.',\n      errorService: 'Service temporarily unavailable. Please try again in a moment.',\n      postitusPlaceholder: 'Write or paste here the social media post you want to comment on.',\n      kontekstPlaceholder: 'Add here any additional context or important info to consider.',\n      vibePlaceholderInput: 'Write or paste here the post you want a critical analysis of.',\n      vibeKontekstPlaceholder: 'Add here any additional info to consider.',\n      praiseInfoPlaceholder: 'Write here info about the person: name, age, event, job, hobbies etc.',\n      vibeNote: 'NB! This analysis does not claim absolute truth \u2013 people interpret posts differently.',\n      praiseFormOptions: ['Story', 'Poem', 'Diploma', 'Drawing\/caricature'],\n      stiilOptions: ['Funny', 'Poetic', 'Touching', 'Serious'],\n      commentStiilOptions: ['Ironic', 'Funny', 'Absurd', 'Poetic', 'Serious', 'Touching'],\n      tugevusOptions: ['Mild', 'Bold', 'Over the top'],\n    }\n  };\n\n  let currentLang = 'et';\n\n  \/\/ =============================================\n  \/\/ LANGUAGE UPDATE\n  \/\/ =============================================\n  function updateLanguage(lang) {\n    currentLang = lang;\n    const t = translations[lang];\n\n    document.querySelectorAll('.km-text-et').forEach(el => el.style.display = lang === 'et' ? '' : 'none');\n    document.querySelectorAll('.km-text-en').forEach(el => el.style.display = lang === 'en' ? '' : 'none');\n\n    document.querySelectorAll('[data-placeholder-' + lang + ']').forEach(el => {\n      el.placeholder = el.getAttribute('data-placeholder-' + lang);\n    });\n\n    const praiseForm = document.getElementById('km-praise-form');\n    if (praiseForm) {\n      const vals = ['proosa', 'luuletus', 'diplom', 'joonistus'];\n      praiseForm.innerHTML = vals.map((v, i) => `<option value=\"${v}\">${t.praiseFormOptions[i]}<\/option>`).join('');\n    }\n\n    const stiilPraise = document.getElementById('km-stiil-praise');\n    if (stiilPraise) {\n      const vals = ['Naljakas', 'Poeetiline', 'Liigutav', 'T\u00f5sine'];\n      stiilPraise.innerHTML = vals.map((v, i) => `<option value=\"${v}\">${t.stiilOptions[i]}<\/option>`).join('');\n    }\n\n    const stiil = document.getElementById('km-stiil');\n    if (stiil) {\n      const vals = ['Irooniline', 'Naljakas', 'Absurdne', 'Poeetiline', 'T\u00f5sine', 'Liigutav'];\n      stiil.innerHTML = vals.map((v, i) => `<option value=\"${v}\">${t.commentStiilOptions[i]}<\/option>`).join('');\n    }\n\n    const tugevus = document.getElementById('km-tugevus');\n    if (tugevus) {\n      const vals = ['Tagasihoidlik', 'Julge', '\u00dcle v\u00f5lli'];\n      tugevus.innerHTML = vals.map((v, i) => `<option value=\"${v}\">${t.tugevusOptions[i]}<\/option>`).join('');\n    }\n\n    document.querySelectorAll('[data-tooltip-' + lang + ']').forEach(el => {\n      el.setAttribute('data-tooltip', el.getAttribute('data-tooltip-' + lang));\n    });\n\n    const output = document.getElementById('km-output');\n    if (output && output.classList.contains('km-output-empty')) {\n      output.textContent = getCurrentPlaceholder();\n    }\n\n    const btnGenerate = document.getElementById('km-generate');\n    if (btnGenerate && !btnGenerate.disabled) {\n      btnGenerate.querySelector('.km-text-et').style.display = lang === 'et' ? '' : 'none';\n      btnGenerate.querySelector('.km-text-en').style.display = lang === 'en' ? '' : 'none';\n    }\n  }\n\n  function getCurrentPlaceholder() {\n    const t = translations[currentLang];\n    if (appMode === 'comment') return t.commentPlaceholder;\n    if (appMode === 'praise') return t.praisePlaceholder;\n    if (appMode === 'vibe') return t.vibePlaceholder;\n    return t.commentPlaceholder;\n  }\n\n  \/\/ =============================================\n  \/\/ ELEMENTS\n  \/\/ =============================================\n  const tabComment = document.getElementById('km-tab-comment');\n  const tabPraise  = document.getElementById('km-tab-praise');\n  const tabVibe    = document.getElementById('km-tab-vibe');\n  const outputTitle = document.getElementById('km-output-title');\n  const output      = document.getElementById('km-output');\n  const statusBox   = document.getElementById('km-status');\n  const postitusField = document.getElementById('km-postitus');\n  const mediaField    = document.getElementById('km-media');\n  const kontekstField = document.getElementById('km-kontekst');\n  const praiseFields = document.getElementById('km-praise-fields');\n  const praiseInfo   = document.getElementById('km-praise-info');\n  const praiseForm   = document.getElementById('km-praise-form');\n  const praiseMedia  = document.getElementById('km-praise-media');\n  const stiilWrap    = document.getElementById('km-stiil-wrap');\n  const stiilField   = document.getElementById('km-stiil');\n  const tugevusField = document.getElementById('km-tugevus');\n  const btnGenerate  = document.getElementById('km-generate');\n  const btnAddFile   = document.getElementById('km-add-file');\n  const fileInput    = document.getElementById('km-media');\n  const fileStatus   = document.getElementById('km-file-status');\n  const removeFile   = document.getElementById('km-remove-file');\n  const btnMore      = document.getElementById('km-more');\n  const btnCopy      = document.getElementById('km-copy');\n  const tooltip      = document.getElementById('km-tooltip');\n\n  removeFile.style.display = 'none';\n\n  let appMode = 'comment';\n  let busy = false;\n  let lastComment = '';\n  var pastedImageBase64 = '';\n  let tooltipTimer = null;\n\n  \/\/ =============================================\n  \/\/ TOOLTIP\n  \/\/ =============================================\n  document.querySelectorAll('[data-tooltip]').forEach(function(el) {\n    el.addEventListener('mouseenter', function() {\n      tooltip.textContent = el.getAttribute('data-tooltip');\n      tooltip.classList.add('visible');\n    });\n    el.addEventListener('mousemove', function(e) {\n      tooltip.style.left = (e.clientX + 12) + 'px';\n      tooltip.style.top  = (e.clientY - 36) + 'px';\n    });\n    el.addEventListener('mouseleave', function() {\n      tooltip.classList.remove('visible');\n    });\n    el.addEventListener('touchstart', function() {\n      if (tooltipTimer) clearTimeout(tooltipTimer);\n      tooltip.textContent = el.getAttribute('data-tooltip');\n      var rect = el.getBoundingClientRect();\n      tooltip.style.left = (rect.left + rect.width \/ 2 - 110) + 'px';\n      tooltip.style.top  = (rect.bottom + 8) + 'px';\n      tooltip.classList.add('visible');\n      tooltipTimer = setTimeout(function() { tooltip.classList.remove('visible'); }, 1500);\n    });\n  });\n\n  \/\/ =============================================\n  \/\/ FILE BUTTON\n  \/\/ =============================================\n  btnAddFile.addEventListener('click', () => { fileInput.value = ''; fileInput.click(); });\n  fileInput.addEventListener('change', () => {\n    const file = fileInput.files[0];\n    if (!file) return;\n    fileStatus.textContent = file.name;\n    removeFile.style.display = 'inline';\n  });\n  removeFile.addEventListener('click', () => {\n    fileInput.value = '';\n    fileStatus.textContent = '';\n    removeFile.style.display = 'none';\n  });\n\n  const clearPostitusBtn = document.getElementById('km-clear-postitus');\n  if (clearPostitusBtn) clearPostitusBtn.addEventListener('click', () => clearInputs());\n\n  const clearPraiseBtn = document.getElementById('km-clear-praise');\n  if (clearPraiseBtn) clearPraiseBtn.addEventListener('click', () => { clearPraiseInputs(); praiseInfo.value = ''; });\n\n  const praiseAddFileBtn    = document.getElementById('km-praise-add-file');\n  const praiseFileInput     = document.getElementById('km-praise-media');\n  const praiseFileStatus    = document.getElementById('km-praise-file-status');\n  const praiseRemoveFileBtn = document.getElementById('km-praise-remove-file');\n\n  if (praiseAddFileBtn && praiseFileInput) {\n    praiseAddFileBtn.addEventListener('click', () => { praiseFileInput.value = ''; praiseFileInput.click(); });\n    praiseFileInput.addEventListener('change', () => {\n      const file = praiseFileInput.files[0];\n      if (!file) return;\n      praiseFileStatus.textContent = file.name;\n      praiseRemoveFileBtn.style.display = 'inline';\n    });\n    praiseRemoveFileBtn.addEventListener('click', () => {\n      praiseFileInput.value = '';\n      praiseFileStatus.textContent = '';\n      praiseRemoveFileBtn.style.display = 'none';\n    });\n  }\n\n  const show = el => { if (el) el.style.display = ''; };\n  const hide = el => { if (el) el.style.display = 'none'; };\n  const setStatus = t => { statusBox.textContent = t || ''; };\n\n  const hasResult = () => {\n    const t = (output.textContent || '').trim();\n    return t && !t.startsWith('Siia ilmub') && !t.startsWith('Your');\n  };\n\n  function setBusy(state) {\n    busy = state;\n    btnGenerate.disabled = state;\n    const t = translations[currentLang];\n    btnGenerate.textContent = state ? t.generating + '\u2026' : '';\n    if (!state) {\n      btnGenerate.innerHTML = `<span class=\"km-text-et\" style=\"display:${currentLang==='et'?'':'none'}\">Genereeri<\/span><span class=\"km-text-en\" style=\"display:${currentLang==='en'?'':'none'}\">Generate<\/span>`;\n    }\n    if (state) output.classList.add('km-loading');\n    else output.classList.remove('km-loading');\n    const enableActions = !state && hasResult() && (appMode === 'comment' || appMode === 'praise');\n    btnMore.disabled = !enableActions;\n    btnCopy.disabled = !enableActions;\n  }\n\n  function setActiveTab(activeBtn) {\n    [tabComment, tabPraise, tabVibe].forEach(b => b && b.classList.remove('km-tab-active'));\n    if (activeBtn) activeBtn.classList.add('km-tab-active');\n  }\n\n  function bindPasteHandler(el) {\n    if (!el) return;\n    el.addEventListener('paste', (e) => {\n      if (!e.clipboardData) return;\n      const items = e.clipboardData.items || [];\n      for (let i = 0; i < items.length; i++) {\n        const it = items[i];\n        if (it.type && it.type.indexOf('image') === 0) {\n          const file = it.getAsFile();\n          const reader = new FileReader();\n          reader.onload = (ev) => {\n            pastedImageBase64 = String(ev.target.result).split(',')[1] || '';\n            const pasteWrap = document.getElementById('km-paste-preview-wrap');\n            if (pasteWrap) pasteWrap.style.display = 'inline-flex';\n            const preview = document.getElementById('km-paste-preview');\n            if (preview) { preview.src = ev.target.result; preview.style.display = 'block'; }\n            const praisePreview = document.getElementById('km-praise-paste-preview');\n            if (praisePreview) { praisePreview.src = ev.target.result; praisePreview.style.display = 'block'; }\n            const kmMedia = document.getElementById('km-media');\n            if (kmMedia) kmMedia.value = '';\n            if (praiseMedia) praiseMedia.value = '';\n          };\n          reader.readAsDataURL(file);\n          e.preventDefault();\n          break;\n        }\n      }\n    });\n  }\n\n  bindPasteHandler(postitusField);\n  bindPasteHandler(praiseInfo);\n\n  document.addEventListener('paste', (e) => {\n    if (!e.clipboardData) return;\n    const items = e.clipboardData.items || [];\n    for (let i = 0; i < items.length; i++) {\n      const it = items[i];\n      if (it.type && it.type.indexOf('image') === 0) {\n        const file = it.getAsFile();\n        const reader = new FileReader();\n        reader.onload = (ev) => {\n          pastedImageBase64 = String(ev.target.result).split(',')[1] || '';\n          const pasteWrap = document.getElementById('km-paste-preview-wrap');\n          if (pasteWrap) pasteWrap.style.display = 'inline-flex';\n          const preview2 = document.getElementById('km-paste-preview');\n          if (preview2) { preview2.src = ev.target.result; preview2.style.display = 'block'; }\n          const praisePreview2 = document.getElementById('km-praise-paste-preview');\n          if (praisePreview2) { praisePreview2.src = ev.target.result; praisePreview2.style.display = 'block'; }\n          if (mediaField) mediaField.value = '';\n          if (praiseMedia) praiseMedia.value = '';\n        };\n        reader.readAsDataURL(file);\n        e.preventDefault();\n        break;\n      }\n    }\n  }, true);\n\n  let spinTimer;\n  function startSpinner() {\n    const t = translations[currentLang];\n    const dots = ['\u00b7', '\u00b7\u00b7', '\u00b7\u00b7\u00b7', '\u00b7\u00b7\u00b7\u00b7'];\n    let i = 0;\n    setStatus(t.generating + ' ' + dots[i]);\n    spinTimer = setInterval(() => { i = (i + 1) % dots.length; setStatus(t.generating + ' ' + dots[i]); }, 400);\n  }\n  function stopSpinner() {\n    if (spinTimer) { clearInterval(spinTimer); spinTimer = null; }\n    setStatus('');\n  }\n\n  const pasteRemoveBtn = document.getElementById('km-paste-remove');\n  if (pasteRemoveBtn) {\n    pasteRemoveBtn.addEventListener('click', () => {\n      pastedImageBase64 = '';\n      const pasteWrap = document.getElementById('km-paste-preview-wrap');\n      if (pasteWrap) pasteWrap.style.display = 'none';\n    });\n  }\n\n  function clearInputs() {\n    postitusField.value = '';\n    kontekstField.value = '';\n    pastedImageBase64 = '';\n    const mediaF = document.getElementById('km-media');\n    if (mediaF) mediaF.value = '';\n    const fs = document.getElementById('km-file-status');\n    if (fs) fs.textContent = '';\n    const rfb = document.getElementById('km-remove-file');\n    if (rfb) rfb.style.display = 'none';\n    const pasteWrap = document.getElementById('km-paste-preview-wrap');\n    if (pasteWrap) pasteWrap.style.display = 'none';\n  }\n\n  function clearPraiseInputs() {\n    if (praiseInfo) praiseInfo.value = '';\n    pastedImageBase64 = '';\n    if (praiseMedia) praiseMedia.value = '';\n    const pfs = document.getElementById('km-praise-file-status');\n    if (pfs) pfs.textContent = '';\n    const prf = document.getElementById('km-praise-remove-file');\n    if (prf) prf.style.display = 'none';\n    const ppw = document.getElementById('km-praise-paste-preview-wrap');\n    if (ppw) ppw.style.display = 'none';\n  }\n\n  let prevMode = 'comment';\n\n  function updateModeUI(isInit) {\n    const t = translations[currentLang];\n    const commentVibeFields = document.getElementById('km-comment-vibe-fields');\n\n    if (!isInit) {\n      if (appMode === 'vibe' && prevMode === 'comment') {\n        kontekstField.value = '';\n      } else if (appMode === 'praise') {\n        clearPraiseInputs();\n        const praiseFormSel = document.getElementById('km-praise-form');\n        if (praiseFormSel) praiseFormSel.selectedIndex = 0;\n        const praiseStiilSel = document.getElementById('km-stiil-praise');\n        if (praiseStiilSel) praiseStiilSel.selectedIndex = 0;\n      } else {\n        clearInputs();\n      }\n      while (output.firstChild) output.removeChild(output.firstChild);\n      output.classList.add('km-output-empty');\n      btnCopy.innerHTML = `<span class=\"km-text-et\" style=\"display:${currentLang==='et'?'':'none'}\">Kopeeri<\/span><span class=\"km-text-en\" style=\"display:${currentLang==='en'?'':'none'}\">Copy<\/span>`;\n      btnCopy.onclick = null;\n      lastComment = '';\n    }\n    prevMode = appMode;\n\n    if (appMode === 'comment') {\n      outputTitle.textContent = t.commentTitle;\n      if (!output.firstChild) { output.textContent = t.commentPlaceholder; output.classList.add('km-output-empty'); }\n      show(commentVibeFields); hide(praiseFields);\n      if (stiilWrap) show(stiilWrap);\n      postitusField.placeholder = t.postitusPlaceholder;\n      kontekstField.placeholder = t.kontekstPlaceholder;\n      btnMore.style.display = ''; btnCopy.style.display = '';\n      setActiveTab(tabComment);\n      return;\n    }\n\n    if (appMode === 'praise') {\n      outputTitle.textContent = t.praiseTitle;\n      if (!output.firstChild) { output.textContent = t.praisePlaceholder; output.classList.add('km-output-empty'); }\n      hide(commentVibeFields); show(praiseFields);\n      if (stiilWrap) hide(stiilWrap);\n      btnMore.style.display = ''; btnCopy.style.display = '';\n      setActiveTab(tabPraise);\n      return;\n    }\n\n    if (appMode === 'vibe') {\n      outputTitle.textContent = t.vibeTitle;\n      if (!output.firstChild) { output.textContent = t.vibePlaceholder; output.classList.add('km-output-empty'); }\n      show(commentVibeFields); hide(praiseFields);\n      if (stiilWrap) hide(stiilWrap);\n      postitusField.placeholder = t.vibePlaceholderInput;\n      kontekstField.placeholder = t.vibeKontekstPlaceholder;\n      btnMore.style.display = 'none'; btnCopy.style.display = 'none';\n      setActiveTab(tabVibe);\n      return;\n    }\n  }\n\n  function fileToBase64(file) {\n    return new Promise((resolve, reject) => {\n      const r = new FileReader();\n      r.onload  = ev => resolve(String(ev.target.result).split(',')[1] || '');\n      r.onerror = reject;\n      r.readAsDataURL(file);\n    });\n  }\n\n  async function sendRequest(mode) {\n    if (busy) return;\n    const t = translations[currentLang];\n\n    const postitus = postitusField.value.trim();\n    const kontekst = kontekstField.value.trim();\n    const stiil    = stiilField.value.trim();\n    const tugevus  = tugevusField.value.trim();\n    const pInfo    = praiseInfo.value.trim();\n    const pForm    = praiseForm.value.trim();\n\n    const pickedFile = appMode === 'praise'\n      ? (praiseMedia && praiseMedia.files && praiseMedia.files[0] ? praiseMedia.files[0] : null)\n      : (mediaField && mediaField.files && mediaField.files[0] ? mediaField.files[0] : null);\n\n    if (appMode === 'praise') {\n      if (!pInfo) { setStatus(t.errorNoPraise); return; }\n    } else {\n      if (!postitus && !pickedFile && !pastedImageBase64) { setStatus(t.errorNoPost); return; }\n    }\n\n    setBusy(true);\n    startSpinner();\n\n    let mediaBase64 = '';\n    let mediaMime   = '';\n\n    try {\n      if (pickedFile) {\n        mediaBase64 = await fileToBase64(pickedFile);\n        mediaMime   = pickedFile.type || 'image\/jpeg';\n      } else if (pastedImageBase64) {\n        mediaBase64 = pastedImageBase64;\n        mediaMime   = 'image\/png';\n      }\n\n      const body = {\n        mode,\n        app_mode: appMode,\n        postitus,\n        kontekst,\n        stiil,\n        tugevus,\n        previous_comment: lastComment,\n        media_base64: mediaBase64,\n        media_mime: mediaMime,\n        lang: currentLang\n      };\n\n      if (appMode === 'praise') {\n        body.praise_info = pInfo;\n        body.praise_form = pForm;\n        const praiseStiilField = document.getElementById('km-stiil-praise');\n        body.praise_stiil = praiseStiilField ? praiseStiilField.value.trim() : stiil;\n      }\n\n      const resp = await fetch(REST_URL, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json', 'X-WP-Nonce': WP_NONCE },\n        body: JSON.stringify(body)\n      });\n\n      const data = await resp.json();\n\n      if (!resp.ok || (!data.result && !data.image_url)) {\n        stopSpinner(); setBusy(false);\n        setStatus((data && data.message) ? String(data.message) : t.errorService);\n        return;\n      }\n\n      if (data.image_url) {\n        while (output.firstChild) output.removeChild(output.firstChild);\n        output.classList.remove('km-output-empty');\n        const img = document.createElement('img');\n        img.src = data.image_url;\n        img.style.cssText = 'max-width:100%;border-radius:10px;display:block;cursor:pointer;';\n        img.addEventListener('click', () => window.open(data.image_url, '_blank'));\n        output.appendChild(img);\n        const hint = document.createElement('div');\n        hint.style.cssText = 'font-size:13px;color:#9ca3af;margin-top:8px;';\n        hint.textContent = t.imageHint;\n        output.appendChild(hint);\n        lastComment = data.image_url;\n        btnMore.disabled = false;\n        btnCopy.textContent = t.openImage;\n        btnCopy.disabled = false;\n        btnCopy.onclick = () => window.open(data.image_url, '_blank');\n        stopSpinner(); setBusy(false); setStatus('');\n        return;\n      }\n\n      let txt = String(data.result || '').trim();\n      txt = txt.replace(\/\\s*(Genereeritud\\s+Kii?tmismasin\\.ee\\s+poolt\\s*)+$\/gi, '');\n      txt = txt.replace(\/\\s*(Generated\\s+by\\s+(Kiitmismasin\\.ee|Praise\\s+Machine)\\s*)+$\/gi, '');\n      txt = txt.replace(\/\\s*(Genereeritud\\s+Kii?tmismasin\\.ee\\s+poolt\\s*)+\/gi, ' ').trim();\n\n      if (appMode === 'vibe') {\n        while (output.firstChild) output.removeChild(output.firstChild);\n        const lines = txt.split('\\n');\n        let html = '';\n        for (const line of lines) {\n          const trimmed = line.trim();\n          if (!trimmed) { html += '<br>'; continue; }\n          if (\/^\\d+\\.\/.test(trimmed) || \/^(V\u00f5imalik mulje|Mis v\u00f5ib m\u00f5juda|Kuidas teha|NB|Possible impression|What might|How to make)\/i.test(trimmed)) {\n            html += '<p class=\"km-vibe-heading\">' + trimmed.replace(\/<\/g, '&lt;') + '<\/p>';\n          } else {\n            html += '<p class=\"km-vibe-body\">' + trimmed.replace(\/<\/g, '&lt;') + '<\/p>';\n          }\n        }\n        output.innerHTML = html;\n        output.classList.remove('km-output-empty');\n        const vNote = document.createElement('div');\n        vNote.className = 'km-vibe-note';\n        vNote.textContent = t.vibeNote;\n        output.appendChild(vNote);\n        btnMore.disabled = true; btnCopy.disabled = true;\n      } else {\n        while (output.firstChild) output.removeChild(output.firstChild);\n        const main = document.createElement('div');\n        main.textContent = txt;\n        output.appendChild(main);\n        output.classList.remove('km-output-empty');\n        const sig = document.createElement('div');\n        sig.className = 'km-signature-row';\n        sig.innerHTML = `<label style=\"display:flex;align-items:center;gap:8px;cursor:pointer;\"><input type=\"checkbox\" id=\"km-sig-flag\" checked><span>${t.signature}<\/span><\/label>`;\n        output.appendChild(sig);\n        const flag = sig.querySelector('#km-sig-flag');\n        flag.addEventListener('change', () => { if (flag.checked) sig.classList.remove('passive'); else sig.classList.add('passive'); });\n        btnMore.disabled = false; btnCopy.disabled = false;\n      }\n\n      lastComment = txt;\n      stopSpinner(); setBusy(false); setStatus('');\n\n    } catch(err) {\n      console.error(err);\n      stopSpinner(); setBusy(false);\n      setStatus(translations[currentLang].errorService);\n    }\n  }\n\n  \/\/ =============================================\n  \/\/ EVENT LISTENERS\n  \/\/ =============================================\n  tabComment.addEventListener('click', () => { appMode = 'comment'; updateModeUI(); });\n  tabPraise.addEventListener('click',  () => { appMode = 'praise';  updateModeUI(); });\n  tabVibe.addEventListener('click',    () => { appMode = 'vibe';    updateModeUI(); });\n\n  \/\/ Detect language from TranslatePress URL\n  function detectAndSetLanguage() {\n    const url = window.location.href;\n    if (url.includes('\/en\/') || url.includes('\/en?') || url.includes('lang=en')) {\n      updateLanguage('en');\n    } else {\n      updateLanguage('et');\n    }\n  }\n\n  \/\/ Listen to TranslatePress menu clicks\n  document.addEventListener('click', function(e) {\n    const link = e.target.closest('a');\n    if (!link) return;\n    const href = link.href || '';\n    if (href.includes('\/en\/') || href.includes('lang=en')) {\n      setTimeout(() => updateLanguage('en'), 100);\n    } else if (href.includes('\/et\/') || href.includes('lang=et')) {\n      setTimeout(() => updateLanguage('et'), 100);\n    }\n  });\n\n  detectAndSetLanguage();\n\n\n\n\n  btnGenerate.addEventListener('click', () => {\n    const adDesktop = document.querySelector('.km-ad-desktop');\n    const adMobile  = document.querySelector('.km-ad-mobile');\n    if (adDesktop) adDesktop.classList.add('is-visible');\n    if (adMobile)  adMobile.classList.add('is-visible');\n    sendRequest('generate');\n  });\n\n  btnMore.addEventListener('click', () => sendRequest('more'));\n\n  btnCopy.addEventListener('click', async () => {\n    const t = translations[currentLang];\n    const baseText  = (lastComment || '').trim();\n    if (!baseText) return;\n    const sigFlag   = output.querySelector('#km-sig-flag');\n    const sigActive = !!(sigFlag && sigFlag.checked);\n    let copyText    = baseText;\n    if (sigActive && (appMode === 'comment' || appMode === 'praise')) {\n      copyText += \"\\n\\n\" + t.signature;\n    }\n    try {\n      await navigator.clipboard.writeText(copyText);\n      setStatus(t.copied);\n      setTimeout(() => setStatus(''), 1500);\n    } catch(e) {\n      setStatus(t.copyFailed);\n    }\n  });\n\n  updateModeUI(true);\n  setBusy(false);\n\n})();\n<\/script>\n\n\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Genereeri hetkega naljakaid kommentaare eputavatele v\u00f5i m\u00f5ttetutele sotsiaalmeedia postitustele; Koosta l\u00f5bus kiidulaul, luuletus v\u00f5i joonistus s\u00f5brale; Vibe check aitab kriitiliselt [&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":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","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":"","ast-breadcrumbs-content":"","ast-featured-img":"","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-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":"","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-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":"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":""},"mobile":{"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":""}},"footnotes":""},"class_list":["post-66","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/praisemachine.com\/en\/wp-json\/wp\/v2\/pages\/66","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/praisemachine.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/praisemachine.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/praisemachine.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/praisemachine.com\/en\/wp-json\/wp\/v2\/comments?post=66"}],"version-history":[{"count":6,"href":"https:\/\/praisemachine.com\/en\/wp-json\/wp\/v2\/pages\/66\/revisions"}],"predecessor-version":[{"id":572,"href":"https:\/\/praisemachine.com\/en\/wp-json\/wp\/v2\/pages\/66\/revisions\/572"}],"wp:attachment":[{"href":"https:\/\/praisemachine.com\/en\/wp-json\/wp\/v2\/media?parent=66"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}