{"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\/ru\/","title":{"rendered":"\u0410\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0414\u0435\u043d\u044c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u0435\u043d\u0438\u044f"},"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\" data-label-key=\"labelBackground\" 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\" data-label-key=\"labelClear\" 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\" data-label-key=\"labelFormat\" style=\"display:none;\">Format<\/span>\n        <\/label>\n        <select id=\"km-praise-form\" class=\"km-select\">\n          <option value=\"proosa\"><span class=\"km-text-et\">Kiidulaul\/jutuke<\/span><\/option>\n          <option value=\"luuletus\"><span class=\"km-text-et\">Luuletus<\/span><\/option>\n          <option value=\"diplom\"><span class=\"km-text-et\">Diplom<\/span><\/option>\n          <option value=\"joonistus\"><span class=\"km-text-et\">Joonistus\/karikatuur<\/span><\/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\" data-label-key=\"labelStyle\" 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\" data-label-key=\"labelPost\" 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\" data-label-key=\"labelClear\" 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\" data-label-key=\"labelContext\" 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\" data-label-key=\"labelStyle\" 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\" data-label-key=\"labelIntensity\" 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\/ru\/wp-json\/kiitmismasin\/v1\/generate\";\n  const WP_NONCE = \"d384634b1a\";\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      labelPost: 'Postitus', labelContext: 'Lisakontekst', labelStyle: 'Stiil', labelIntensity: 'Tugevus', labelFormat: 'Vormi t\u00fc\u00fcp', labelBackground: 'Taustainfo', labelClear: 'T\u00fchjenda',\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      labelPost: 'Post', labelContext: 'Additional context', labelStyle: 'Style', labelIntensity: 'Intensity', labelFormat: 'Format', labelBackground: 'Background info', labelClear: 'Clear',\n    },\n    ru: {\n      inputTitle: '\u0412\u0432\u043e\u0434',\n      commentTitle: '\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439',\n      praiseTitle: '\u041f\u043e\u0445\u0432\u0430\u043b\u0430 \/ \u041f\u043e\u0437\u0434\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435',\n      vibeTitle: '\u0412\u0430\u0439\u0431-\u0447\u0435\u043a',\n      commentPlaceholder: '\u0417\u0434\u0435\u0441\u044c \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043a \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0435\u0433\u043e \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c.',\n      praisePlaceholder: '\u0417\u0434\u0435\u0441\u044c \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043f\u043e\u0445\u0432\u0430\u043b\u0430 \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435.',\n      vibePlaceholder: '\u0417\u0434\u0435\u0441\u044c \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0430\u043d\u0430\u043b\u0438\u0437 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u044d\u0442\u0430 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f.',\n      generating: '\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e',\n      generate: '\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c',\n      showMore: '\u0415\u0449\u0451 \u0432\u0430\u0440\u0438\u0430\u043d\u0442',\n      copy: '\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c',\n      copied: '\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u043e.',\n      copyFailed: '\u041e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.',\n      openImage: '\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435',\n      imageHint: '\u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0432 \u043f\u043e\u043b\u043d\u043e\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u0435 \u2014 \u0442\u0430\u043c \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f.',\n      signature: '\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u041f\u043e\u0445\u0432\u0430\u043b\u0430\u0442\u043e\u0440\u043e\u043c',\n      errorNoPost: '\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0445\u043e\u0442\u044f \u0431\u044b \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044e \u0438\u043b\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435.',\n      errorNoPraise: '\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0435.',\n      errorService: '\u0421\u0435\u0440\u0432\u0438\u0441 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043f\u043e\u0437\u0436\u0435.',\n      postitusPlaceholder: '\u041d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0438\u043b\u0438 \u0432\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u044e\u0434\u0430 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044e \u0438\u0437 \u0441\u043e\u0446\u0441\u0435\u0442\u0435\u0439, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0445\u043e\u0442\u0438\u0442\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439.',\n      kontekstPlaceholder: '\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0438\u043b\u0438 \u0432\u0430\u0436\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e.',\n      vibePlaceholderInput: '\u041d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0438\u043b\u0438 \u0432\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c.',\n      vibeKontekstPlaceholder: '\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430.',\n      praiseInfoPlaceholder: '\u041d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0435: \u0438\u043c\u044f, \u0432\u043e\u0437\u0440\u0430\u0441\u0442, \u0441\u043e\u0431\u044b\u0442\u0438\u0435, \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u044f, \u0445\u043e\u0431\u0431\u0438 \u0438 \u0442.\u0434.',\n      vibeNote: '\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435! \u0410\u043d\u0430\u043b\u0438\u0437 \u043d\u0435 \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u0443\u0435\u0442 \u043d\u0430 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u0443\u044e \u0438\u0441\u0442\u0438\u043d\u0443 \u2014 \u043b\u044e\u0434\u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u044e\u0442 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443.',\n      praiseFormOptions: ['\u0420\u0430\u0441\u0441\u043a\u0430\u0437\/\u043f\u043e\u0445\u0432\u0430\u043b\u0430', '\u0421\u0442\u0438\u0445\u043e\u0442\u0432\u043e\u0440\u0435\u043d\u0438\u0435', '\u0414\u0438\u043f\u043b\u043e\u043c', '\u0420\u0438\u0441\u0443\u043d\u043e\u043a\/\u043a\u0430\u0440\u0438\u043a\u0430\u0442\u0443\u0440\u0430'],\n      stiilOptions: ['\u0421\u043c\u0435\u0448\u043d\u043e\u0439', '\u041f\u043e\u044d\u0442\u0438\u0447\u043d\u044b\u0439', '\u0422\u0440\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439', '\u0421\u0435\u0440\u044c\u0451\u0437\u043d\u044b\u0439'],\n      commentStiilOptions: ['\u0418\u0440\u043e\u043d\u0438\u0447\u043d\u043e', '\u0421\u043c\u0435\u0448\u043d\u043e', '\u0410\u0431\u0441\u0443\u0440\u0434\u043d\u043e', '\u041f\u043e\u044d\u0442\u0438\u0447\u043d\u043e', '\u0421\u0435\u0440\u044c\u0451\u0437\u043d\u043e', '\u0422\u0440\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u043e'],\n      tugevusOptions: ['\u041c\u044f\u0433\u043a\u043e', '\u0421\u043c\u0435\u043b\u043e', '\u0427\u0435\u0440\u0435\u0437 \u043a\u0440\u0430\u0439'],\n      labelPost: '\u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f', labelContext: '\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442', labelStyle: '\u0421\u0442\u0438\u043b\u044c', labelIntensity: '\u0418\u043d\u0442\u0435\u043d\u0441\u0438\u0432\u043d\u043e\u0441\u0442\u044c', labelFormat: '\u0424\u043e\u0440\u043c\u0430\u0442', labelBackground: '\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f', labelClear: '\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c',\n    },\n    de: {\n      inputTitle: 'Eingabe',\n      commentTitle: 'Kommentar',\n      praiseTitle: 'Lob \/ Gl\u00fcckwunsch',\n      vibeTitle: 'Vibe-Check',\n      commentPlaceholder: 'Dein Kommentar erscheint hier. Du kannst ihn bearbeiten.',\n      praisePlaceholder: 'Dein Lob oder Gl\u00fcckwunsch erscheint hier.',\n      vibePlaceholder: 'Die Analyse, wie dieser Beitrag wahrgenommen werden k\u00f6nnte, erscheint hier.',\n      generating: 'Generiere',\n      generate: 'Generieren',\n      showMore: 'Mehr anzeigen',\n      copy: 'Kopieren',\n      copied: 'Kopiert.',\n      copyFailed: 'Kopieren fehlgeschlagen.',\n      openImage: 'Bild \u00f6ffnen',\n      imageHint: 'Klicke auf das Bild, um es in voller Gr\u00f6\u00dfe zu \u00f6ffnen \u2014 dort kannst du es speichern und teilen.',\n      signature: 'Erstellt von PreisenMaschine',\n      errorNoPost: 'Bitte f\u00fcge mindestens einen Beitrag oder ein Bild hinzu.',\n      errorNoPraise: 'Bitte gib Hintergrundinformationen ein.',\n      errorService: 'Dienst vor\u00fcbergehend nicht verf\u00fcgbar. Bitte versuche es sp\u00e4ter erneut.',\n      postitusPlaceholder: 'Schreibe oder f\u00fcge hier den Social-Media-Beitrag ein, den du kommentieren m\u00f6chtest.',\n      kontekstPlaceholder: 'F\u00fcge hier zus\u00e4tzlichen Kontext oder wichtige Informationen hinzu.',\n      vibePlaceholderInput: 'Schreibe oder f\u00fcge hier den Beitrag ein, den du analysieren m\u00f6chtest.',\n      vibeKontekstPlaceholder: 'F\u00fcge hier zus\u00e4tzliche Informationen hinzu.',\n      praiseInfoPlaceholder: 'Schreibe hier Infos \u00fcber die Person: Name, Alter, Ereignis, Beruf, Hobbys usw.',\n      vibeNote: 'Hinweis: Diese Analyse erhebt keinen Anspruch auf absolute Wahrheit \u2013 Menschen interpretieren Beitr\u00e4ge unterschiedlich.',\n      praiseFormOptions: ['Geschichte\/Lob', 'Gedicht', 'Diplom', 'Zeichnung\/Karikatur'],\n      stiilOptions: ['Lustig', 'Poetisch', 'R\u00fchrend', 'Ernst'],\n      commentStiilOptions: ['Ironisch', 'Lustig', 'Absurd', 'Poetisch', 'Ernst', 'R\u00fchrend'],\n      tugevusOptions: ['Zur\u00fcckhaltend', 'Mutig', '\u00dcbertrieben'],\n      labelPost: 'Beitrag', labelContext: 'Zus\u00e4tzlicher Kontext', labelStyle: 'Stil', labelIntensity: 'Intensit\u00e4t', labelFormat: 'Format', labelBackground: 'Hintergrundinformationen', labelClear: 'L\u00f6schen',\n    },\n    fr: {\n      inputTitle: 'Saisie',\n      commentTitle: 'Commentaire',\n      praiseTitle: '\u00c9loge \/ F\u00e9licitation',\n      vibeTitle: 'Vibe Check',\n      commentPlaceholder: 'Votre commentaire appara\u00eetra ici. Vous pouvez le modifier.',\n      praisePlaceholder: 'Votre \u00e9loge ou f\u00e9licitation appara\u00eetra ici.',\n      vibePlaceholder: \"L'analyse de la fa\u00e7on dont cette publication pourrait \u00eatre per\u00e7ue appara\u00eetra ici.\",\n      generating: 'G\u00e9n\u00e9ration',\n      generate: 'G\u00e9n\u00e9rer',\n      showMore: 'Voir plus',\n      copy: 'Copier',\n      copied: 'Copi\u00e9.',\n      copyFailed: '\u00c9chec de la copie.',\n      openImage: \"Ouvrir l'image\",\n      imageHint: \"Cliquez sur l'image pour l'ouvrir en taille r\u00e9elle \u2014 vous pouvez la sauvegarder et la partager.\",\n      signature: 'G\u00e9n\u00e9r\u00e9 par Complimenteur',\n      errorNoPost: 'Veuillez ajouter au moins une publication ou une image.',\n      errorNoPraise: 'Veuillez entrer des informations de fond.',\n      errorService: 'Service temporairement indisponible. Veuillez r\u00e9essayer.',\n      postitusPlaceholder: '\u00c9crivez ou collez ici la publication sur laquelle vous souhaitez commenter.',\n      kontekstPlaceholder: 'Ajoutez ici tout contexte suppl\u00e9mentaire ou information importante.',\n      vibePlaceholderInput: '\u00c9crivez ou collez ici la publication que vous souhaitez analyser.',\n      vibeKontekstPlaceholder: 'Ajoutez ici des informations suppl\u00e9mentaires \u00e0 prendre en compte.',\n      praiseInfoPlaceholder: '\u00c9crivez ici des informations sur la personne : nom, \u00e2ge, \u00e9v\u00e9nement, profession, hobbies, etc.',\n      vibeNote: 'NB ! Cette analyse ne pr\u00e9tend pas \u00e0 la v\u00e9rit\u00e9 absolue \u2013 les gens interpr\u00e8tent les publications diff\u00e9remment.',\n      praiseFormOptions: [\"Histoire\/\u00c9loge\", 'Po\u00e8me', 'Dipl\u00f4me', 'Dessin\/Caricature'],\n      stiilOptions: ['Dr\u00f4le', 'Po\u00e9tique', 'Touchant', 'S\u00e9rieux'],\n      commentStiilOptions: ['Ironique', 'Dr\u00f4le', 'Absurde', 'Po\u00e9tique', 'S\u00e9rieux', 'Touchant'],\n      tugevusOptions: ['Doux', 'Audacieux', 'Excessif'],\n      labelPost: 'Publication', labelContext: 'Contexte suppl\u00e9mentaire', labelStyle: 'Style', labelIntensity: 'Intensit\u00e9', labelFormat: 'Format', labelBackground: 'Informations de fond', labelClear: 'Effacer',\n    },\n    es: {\n      inputTitle: 'Entrada',\n      commentTitle: 'Comentario',\n      praiseTitle: 'Elogio \/ Felicitaci\u00f3n',\n      vibeTitle: 'Vibe Check',\n      commentPlaceholder: 'Tu comentario aparecer\u00e1 aqu\u00ed. Puedes editarlo.',\n      praisePlaceholder: 'Tu elogio o felicitaci\u00f3n aparecer\u00e1 aqu\u00ed.',\n      vibePlaceholder: 'El an\u00e1lisis de c\u00f3mo podr\u00eda percibirse esta publicaci\u00f3n aparecer\u00e1 aqu\u00ed.',\n      generating: 'Generando',\n      generate: 'Generar',\n      showMore: 'Mostrar m\u00e1s',\n      copy: 'Copiar',\n      copied: 'Copiado.',\n      copyFailed: 'Error al copiar.',\n      openImage: 'Abrir imagen',\n      imageHint: 'Haz clic en la imagen para abrirla en tama\u00f1o completo \u2014 puedes guardarla y compartirla.',\n      signature: 'Generado por Elogiador',\n      errorNoPost: 'Por favor, a\u00f1ade al menos una publicaci\u00f3n o una imagen.',\n      errorNoPraise: 'Por favor, introduce informaci\u00f3n de fondo.',\n      errorService: 'Servicio temporalmente no disponible. Por favor, int\u00e9ntalo de nuevo.',\n      postitusPlaceholder: 'Escribe o pega aqu\u00ed la publicaci\u00f3n de redes sociales que quieres comentar.',\n      kontekstPlaceholder: 'A\u00f1ade aqu\u00ed contexto adicional o informaci\u00f3n importante.',\n      vibePlaceholderInput: 'Escribe o pega aqu\u00ed la publicaci\u00f3n que quieres analizar.',\n      vibeKontekstPlaceholder: 'A\u00f1ade aqu\u00ed informaci\u00f3n adicional a tener en cuenta.',\n      praiseInfoPlaceholder: 'Escribe aqu\u00ed informaci\u00f3n sobre la persona: nombre, edad, evento, profesi\u00f3n, hobbies, etc.',\n      vibeNote: '\u00a1Atenci\u00f3n! Este an\u00e1lisis no pretende ser la verdad absoluta \u2013 la gente interpreta las publicaciones de manera diferente.',\n      praiseFormOptions: ['Historia\/Elogio', 'Poema', 'Diploma', 'Dibujo\/Caricatura'],\n      stiilOptions: ['Gracioso', 'Po\u00e9tico', 'Emotivo', 'Serio'],\n      commentStiilOptions: ['Ir\u00f3nico', 'Gracioso', 'Absurdo', 'Po\u00e9tico', 'Serio', 'Emotivo'],\n      tugevusOptions: ['Suave', 'Atrevido', 'Exagerado'],\n      labelPost: 'Publicaci\u00f3n', labelContext: 'Contexto adicional', labelStyle: 'Estilo', labelIntensity: 'Intensidad', labelFormat: 'Formato', labelBackground: 'Informaci\u00f3n de fondo', labelClear: 'Limpiar',\n    },\n    fi: {\n      inputTitle: 'Sy\u00f6te',\n      commentTitle: 'Kommentti',\n      praiseTitle: 'Kehu \/ Onnittelut',\n      vibeTitle: 'Vibe-tarkistus',\n      commentPlaceholder: 'Kommenttisi ilmestyy t\u00e4h\u00e4n. Voit muokata sit\u00e4.',\n      praisePlaceholder: 'Kehusi tai onnittelusi ilmestyy t\u00e4h\u00e4n.',\n      vibePlaceholder: 'Analyysi siit\u00e4, miten t\u00e4m\u00e4 julkaisu voitaisiin n\u00e4hd\u00e4, ilmestyy t\u00e4h\u00e4n.',\n      generating: 'Generoidaan',\n      generate: 'Generoi',\n      showMore: 'N\u00e4yt\u00e4 lis\u00e4\u00e4',\n      copy: 'Kopioi',\n      copied: 'Kopioitu.',\n      copyFailed: 'Kopiointi ep\u00e4onnistui.',\n      openImage: 'Avaa kuva',\n      imageHint: 'Napsauta kuvaa avataksesi sen t\u00e4ysikokoisena \u2014 voit tallentaa ja jakaa sielt\u00e4.',\n      signature: 'Generoitu KehuKoneen avulla',\n      errorNoPost: 'Lis\u00e4\u00e4 v\u00e4hint\u00e4\u00e4n julkaisu tai kuva.',\n      errorNoPraise: 'Sy\u00f6t\u00e4 taustatiedot.',\n      errorService: 'Palvelu on tilap\u00e4isesti poissa k\u00e4yt\u00f6st\u00e4. Yrit\u00e4 uudelleen hetken kuluttua.',\n      postitusPlaceholder: 'Kirjoita tai liit\u00e4 t\u00e4h\u00e4n sosiaalisen median julkaisu, johon haluat kommentoida.',\n      kontekstPlaceholder: 'Lis\u00e4\u00e4 t\u00e4h\u00e4n lis\u00e4kontekstia tai muuta t\u00e4rke\u00e4\u00e4 tietoa.',\n      vibePlaceholderInput: 'Kirjoita tai liit\u00e4 t\u00e4h\u00e4n julkaisu, jonka haluat analysoida.',\n      vibeKontekstPlaceholder: 'Lis\u00e4\u00e4 t\u00e4h\u00e4n muita huomioitavia tietoja.',\n      praiseInfoPlaceholder: 'Kirjoita t\u00e4h\u00e4n tietoa henkil\u00f6st\u00e4: nimi, ik\u00e4, tapahtuma, ammatti, harrastukset jne.',\n      vibeNote: 'Huom! T\u00e4m\u00e4 analyysi ei v\u00e4it\u00e4 olevansa absoluuttinen totuus \u2013 ihmiset tulkitsevat julkaisuja eri tavoin.',\n      praiseFormOptions: ['Tarina\/Kehu', 'Runo', 'Diploma', 'Piirros\/Karikatyyri'],\n      stiilOptions: ['Hauska', 'Runollinen', 'Liikuttava', 'Vakava'],\n      commentStiilOptions: ['Ironinen', 'Hauska', 'Absurdi', 'Runollinen', 'Vakava', 'Liikuttava'],\n      tugevusOptions: ['Varovainen', 'Rohkea', 'Yli laidan'],\n      labelPost: 'Julkaisu', labelContext: 'Lis\u00e4konteksti', labelStyle: 'Tyyli', labelIntensity: 'Voimakkuus', labelFormat: 'Muoto', labelBackground: 'Taustatiedot', labelClear: 'Tyhjenn\u00e4',\n    },\n    zh: {\n      inputTitle: '\u8f93\u5165',\n      commentTitle: '\u8bc4\u8bba',\n      praiseTitle: '\u5938\u5938 \/ \u795d\u8d3a',\n      vibeTitle: '\u6c1b\u56f4\u68c0\u6d4b',\n      commentPlaceholder: '\u60a8\u7684\u8bc4\u8bba\u5c06\u663e\u793a\u5728\u6b64\u5904\uff0c\u53ef\u4ee5\u81ea\u7531\u7f16\u8f91\u3002',\n      praisePlaceholder: '\u60a8\u7684\u5938\u5938\u6216\u795d\u8d3a\u5c06\u663e\u793a\u5728\u6b64\u5904\u3002',\n      vibePlaceholder: '\u5173\u4e8e\u8fd9\u7bc7\u5e16\u5b50\u53ef\u80fd\u88ab\u5982\u4f55\u89e3\u8bfb\u7684\u5206\u6790\u5c06\u663e\u793a\u5728\u6b64\u5904\u3002',\n      generating: '\u751f\u6210\u4e2d',\n      generate: '\u751f\u6210',\n      showMore: '\u663e\u793a\u66f4\u591a',\n      copy: '\u590d\u5236',\n      copied: '\u5df2\u590d\u5236\u3002',\n      copyFailed: '\u590d\u5236\u5931\u8d25\u3002',\n      openImage: '\u6253\u5f00\u56fe\u7247',\n      imageHint: '\u70b9\u51fb\u56fe\u7247\u4ee5\u5168\u5c3a\u5bf8\u6253\u5f00\u2014\u2014\u60a8\u53ef\u4ee5\u4ece\u90a3\u91cc\u4fdd\u5b58\u548c\u5206\u4eab\u3002',\n      signature: '\u7531\u5938\u5938\u673a\u751f\u6210',\n      errorNoPost: '\u8bf7\u81f3\u5c11\u6dfb\u52a0\u4e00\u7bc7\u5e16\u5b50\u6216\u4e00\u5f20\u56fe\u7247\u3002',\n      errorNoPraise: '\u8bf7\u8f93\u5165\u80cc\u666f\u4fe1\u606f\u3002',\n      errorService: '\u670d\u52a1\u6682\u65f6\u4e0d\u53ef\u7528\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5\u3002',\n      postitusPlaceholder: '\u5728\u6b64\u5904\u5199\u5165\u6216\u7c98\u8d34\u60a8\u60f3\u8bc4\u8bba\u7684\u793e\u4ea4\u5a92\u4f53\u5e16\u5b50\u3002',\n      kontekstPlaceholder: '\u5728\u6b64\u5904\u6dfb\u52a0\u989d\u5916\u7684\u80cc\u666f\u4fe1\u606f\u6216\u91cd\u8981\u4fe1\u606f\u3002',\n      vibePlaceholderInput: '\u5728\u6b64\u5904\u5199\u5165\u6216\u7c98\u8d34\u60a8\u60f3\u8981\u8fdb\u884c\u6279\u5224\u6027\u5206\u6790\u7684\u5e16\u5b50\u3002',\n      vibeKontekstPlaceholder: '\u5728\u6b64\u5904\u6dfb\u52a0\u5176\u4ed6\u9700\u8981\u8003\u8651\u7684\u4fe1\u606f\u3002',\n      praiseInfoPlaceholder: '\u5728\u6b64\u5904\u5199\u5165\u5173\u4e8e\u8981\u5938\u5956\u7684\u4eba\u7684\u4fe1\u606f\uff1a\u59d3\u540d\u3001\u5e74\u9f84\u3001\u4e8b\u4ef6\u3001\u804c\u4e1a\u3001\u7231\u597d\u7b49\u3002',\n      vibeNote: '\u6ce8\u610f\uff01\u6b64\u5206\u6790\u4e0d\u58f0\u79f0\u662f\u7edd\u5bf9\u771f\u7406\u2014\u2014\u4eba\u4eec\u5bf9\u5e16\u5b50\u7684\u7406\u89e3\u5404\u4e0d\u76f8\u540c\u3002',\n      praiseFormOptions: ['\u6545\u4e8b\/\u5938\u5938', '\u8bd7\u6b4c', '\u8363\u8a89\u8bc1\u4e66', '\u6f2b\u753b\/\u8bbd\u523a\u753b'],\n      stiilOptions: ['\u641e\u7b11', '\u8bd7\u610f', '\u611f\u4eba', '\u4e25\u8083'],\n      commentStiilOptions: ['\u8bbd\u523a', '\u641e\u7b11', '\u8352\u8bde', '\u8bd7\u610f', '\u4e25\u8083', '\u611f\u4eba'],\n      tugevusOptions: ['\u6e29\u548c', '\u5927\u80c6', '\u5938\u5f20'],\n      labelPost: '\u5e16\u5b50', labelContext: '\u9644\u52a0\u80cc\u666f', labelStyle: '\u98ce\u683c', labelIntensity: '\u5f3a\u5ea6', labelFormat: '\u683c\u5f0f', labelBackground: '\u80cc\u666f\u4fe1\u606f', labelClear: '\u6e05\u9664',\n    },\n    hi: {\n      inputTitle: '\u0907\u0928\u092a\u0941\u091f',\n      commentTitle: '\u091f\u093f\u092a\u094d\u092a\u0923\u0940',\n      praiseTitle: '\u092a\u094d\u0930\u0936\u0902\u0938\u093e \/ \u092c\u0927\u093e\u0908',\n      vibeTitle: '\u0935\u093e\u0907\u092c \u091a\u0947\u0915',\n      commentPlaceholder: '\u0906\u092a\u0915\u0940 \u091f\u093f\u092a\u094d\u092a\u0923\u0940 \u092f\u0939\u093e\u0901 \u0926\u093f\u0916\u093e\u0908 \u0926\u0947\u0917\u0940\u0964 \u0906\u092a \u0907\u0938\u0947 \u0938\u0902\u092a\u093e\u0926\u093f\u0924 \u0915\u0930 \u0938\u0915\u0924\u0947 \u0939\u0948\u0902\u0964',\n      praisePlaceholder: '\u0906\u092a\u0915\u0940 \u092a\u094d\u0930\u0936\u0902\u0938\u093e \u092f\u093e \u092c\u0927\u093e\u0908 \u092f\u0939\u093e\u0901 \u0926\u093f\u0916\u093e\u0908 \u0926\u0947\u0917\u0940\u0964',\n      vibePlaceholder: '\u0907\u0938 \u092a\u094b\u0938\u094d\u091f \u0915\u094b \u0915\u0948\u0938\u0947 \u0938\u092e\u091d\u093e \u091c\u093e \u0938\u0915\u0924\u093e \u0939\u0948, \u0907\u0938\u0915\u093e \u0935\u093f\u0936\u094d\u0932\u0947\u0937\u0923 \u092f\u0939\u093e\u0901 \u0926\u093f\u0916\u093e\u0908 \u0926\u0947\u0917\u093e\u0964',\n      generating: '\u091c\u0928\u0930\u0947\u091f \u0939\u094b \u0930\u0939\u093e \u0939\u0948',\n      generate: '\u091c\u0928\u0930\u0947\u091f \u0915\u0930\u0947\u0902',\n      showMore: '\u0914\u0930 \u0926\u093f\u0916\u093e\u090f\u0902',\n      copy: '\u0915\u0949\u092a\u0940 \u0915\u0930\u0947\u0902',\n      copied: '\u0915\u0949\u092a\u0940 \u0939\u094b \u0917\u092f\u093e\u0964',\n      copyFailed: '\u0915\u0949\u092a\u0940 \u0935\u093f\u092b\u0932\u0964',\n      openImage: '\u091b\u0935\u093f \u0916\u094b\u0932\u0947\u0902',\n      imageHint: '\u092a\u0942\u0930\u094d\u0923 \u0906\u0915\u093e\u0930 \u092e\u0947\u0902 \u0916\u094b\u0932\u0928\u0947 \u0915\u0947 \u0932\u093f\u090f \u091b\u0935\u093f \u092a\u0930 \u0915\u094d\u0932\u093f\u0915 \u0915\u0930\u0947\u0902 \u2014 \u0935\u0939\u093e\u0901 \u0938\u0947 \u0906\u092a \u0938\u0939\u0947\u091c \u0914\u0930 \u0938\u093e\u091d\u093e \u0915\u0930 \u0938\u0915\u0924\u0947 \u0939\u0948\u0902\u0964',\n      signature: 'PraiseMachine \u0926\u094d\u0935\u093e\u0930\u093e \u091c\u0928\u0930\u0947\u091f \u0915\u093f\u092f\u093e \u0917\u092f\u093e',\n      errorNoPost: '\u0915\u0943\u092a\u092f\u093e \u0915\u092e \u0938\u0947 \u0915\u092e \u090f\u0915 \u092a\u094b\u0938\u094d\u091f \u092f\u093e \u091b\u0935\u093f \u091c\u094b\u0921\u093c\u0947\u0902\u0964',\n      errorNoPraise: '\u0915\u0943\u092a\u092f\u093e \u092a\u0943\u0937\u094d\u0920\u092d\u0942\u092e\u093f \u091c\u093e\u0928\u0915\u093e\u0930\u0940 \u0926\u0930\u094d\u091c \u0915\u0930\u0947\u0902\u0964',\n      errorService: '\u0938\u0947\u0935\u093e \u0905\u0938\u094d\u0925\u093e\u092f\u0940 \u0930\u0942\u092a \u0938\u0947 \u0905\u0928\u0941\u092a\u0932\u092c\u094d\u0927 \u0939\u0948\u0964 \u0915\u0943\u092a\u092f\u093e \u092c\u093e\u0926 \u092e\u0947\u0902 \u092a\u0941\u0928\u0903 \u092a\u094d\u0930\u092f\u093e\u0938 \u0915\u0930\u0947\u0902\u0964',\n      postitusPlaceholder: '\u092f\u0939\u093e\u0901 \u0935\u0939 \u0938\u094b\u0936\u0932 \u092e\u0940\u0921\u093f\u092f\u093e \u092a\u094b\u0938\u094d\u091f \u0932\u093f\u0916\u0947\u0902 \u092f\u093e \u092a\u0947\u0938\u094d\u091f \u0915\u0930\u0947\u0902 \u091c\u093f\u0938 \u092a\u0930 \u0906\u092a \u091f\u093f\u092a\u094d\u092a\u0923\u0940 \u0915\u0930\u0928\u093e \u091a\u093e\u0939\u0924\u0947 \u0939\u0948\u0902\u0964',\n      kontekstPlaceholder: '\u092f\u0939\u093e\u0901 \u0915\u094b\u0908 \u0905\u0924\u093f\u0930\u093f\u0915\u094d\u0924 \u0938\u0902\u0926\u0930\u094d\u092d \u092f\u093e \u092e\u0939\u0924\u094d\u0935\u092a\u0942\u0930\u094d\u0923 \u091c\u093e\u0928\u0915\u093e\u0930\u0940 \u091c\u094b\u0921\u093c\u0947\u0902\u0964',\n      vibePlaceholderInput: '\u092f\u0939\u093e\u0901 \u0935\u0939 \u092a\u094b\u0938\u094d\u091f \u0932\u093f\u0916\u0947\u0902 \u092f\u093e \u092a\u0947\u0938\u094d\u091f \u0915\u0930\u0947\u0902 \u091c\u093f\u0938\u0915\u093e \u0906\u092a \u0935\u093f\u0936\u094d\u0932\u0947\u0937\u0923 \u0915\u0930\u0928\u093e \u091a\u093e\u0939\u0924\u0947 \u0939\u0948\u0902\u0964',\n      vibeKontekstPlaceholder: '\u092f\u0939\u093e\u0901 \u0935\u093f\u091a\u093e\u0930 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093f\u090f \u0905\u0924\u093f\u0930\u093f\u0915\u094d\u0924 \u091c\u093e\u0928\u0915\u093e\u0930\u0940 \u091c\u094b\u0921\u093c\u0947\u0902\u0964',\n      praiseInfoPlaceholder: '\u092f\u0939\u093e\u0901 \u0935\u094d\u092f\u0915\u094d\u0924\u093f \u0915\u0947 \u092c\u093e\u0930\u0947 \u092e\u0947\u0902 \u091c\u093e\u0928\u0915\u093e\u0930\u0940 \u0932\u093f\u0916\u0947\u0902: \u0928\u093e\u092e, \u0909\u092e\u094d\u0930, \u0918\u091f\u0928\u093e, \u092a\u0947\u0936\u093e, \u0936\u094c\u0915 \u0906\u0926\u093f\u0964',\n      vibeNote: '\u0928\u094b\u091f! \u092f\u0939 \u0935\u093f\u0936\u094d\u0932\u0947\u0937\u0923 \u092a\u0942\u0930\u094d\u0923 \u0938\u0924\u094d\u092f \u0915\u093e \u0926\u093e\u0935\u093e \u0928\u0939\u0940\u0902 \u0915\u0930\u0924\u093e \u2013 \u0932\u094b\u0917 \u092a\u094b\u0938\u094d\u091f \u0915\u094b \u0905\u0932\u0917-\u0905\u0932\u0917 \u0924\u0930\u0939 \u0938\u0947 \u0938\u092e\u091d\u0924\u0947 \u0939\u0948\u0902\u0964',\n      praiseFormOptions: ['\u0915\u0939\u093e\u0928\u0940\/\u092a\u094d\u0930\u0936\u0902\u0938\u093e', '\u0915\u0935\u093f\u0924\u093e', '\u0921\u093f\u092a\u094d\u0932\u094b\u092e\u093e', '\u091a\u093f\u0924\u094d\u0930\/\u0915\u0948\u0930\u093f\u0915\u0947\u091a\u0930'],\n      stiilOptions: ['\u092e\u091c\u093c\u0947\u0926\u093e\u0930', '\u0915\u093e\u0935\u094d\u092f\u093e\u0924\u094d\u092e\u0915', '\u092d\u093e\u0935\u092a\u0942\u0930\u094d\u0923', '\u0917\u0902\u092d\u0940\u0930'],\n      commentStiilOptions: ['\u0935\u094d\u092f\u0902\u0917\u094d\u092f\u093e\u0924\u094d\u092e\u0915', '\u092e\u091c\u093c\u0947\u0926\u093e\u0930', '\u0905\u0924\u093e\u0930\u094d\u0915\u093f\u0915', '\u0915\u093e\u0935\u094d\u092f\u093e\u0924\u094d\u092e\u0915', '\u0917\u0902\u092d\u0940\u0930', '\u092d\u093e\u0935\u092a\u0942\u0930\u094d\u0923'],\n      tugevusOptions: ['\u0939\u0932\u094d\u0915\u093e', '\u0938\u093e\u0939\u0938\u0940', '\u0905\u0924\u094d\u092f\u0927\u093f\u0915'],\n      labelPost: '\u092a\u094b\u0938\u094d\u091f', labelContext: '\u0905\u0924\u093f\u0930\u093f\u0915\u094d\u0924 \u0938\u0902\u0926\u0930\u094d\u092d', labelStyle: '\u0936\u0948\u0932\u0940', labelIntensity: '\u0924\u0940\u0935\u094d\u0930\u0924\u093e', labelFormat: '\u092a\u094d\u0930\u093e\u0930\u0942\u092a', labelBackground: '\u092a\u0943\u0937\u094d\u0920\u092d\u0942\u092e\u093f \u091c\u093e\u0928\u0915\u093e\u0930\u0940', labelClear: '\u0938\u093e\u092b\u093c \u0915\u0930\u0947\u0902',\n    }\n  };\n\n  let currentLang = 'et';\n\n  \/\/ =============================================\n  \/\/ LANGUAGE UPDATE\n  \/\/ =============================================\n  function updateLanguage(lang) {\n    if (!translations[lang]) lang = 'en';\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 !== 'et' ? '' : 'none');\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    if (_tabComment) _tabComment.textContent = t.commentTitle;\n    if (_tabPraise)  _tabPraise.textContent  = t.praiseTitle.split('\/')[0].trim();\n    if (_tabVibe)    _tabVibe.textContent    = t.vibeTitle;\n\n    const inputTitle = document.getElementById('km-title-input');\n    if (inputTitle) inputTitle.textContent = t.inputTitle;\n\n    const _outputTitle = document.getElementById('km-output-title');\n    if (_outputTitle) {\n      if (appMode === 'comment') _outputTitle.textContent = t.commentTitle;\n      else if (appMode === 'praise') _outputTitle.textContent = t.praiseTitle;\n      else if (appMode === 'vibe') _outputTitle.textContent = t.vibeTitle;\n    }\n\n    const postEl = document.getElementById('km-postitus');\n    if (postEl) postEl.placeholder = appMode === 'vibe' ? t.vibePlaceholderInput : t.postitusPlaceholder;\n    const kontEl = document.getElementById('km-kontekst');\n    if (kontEl) kontEl.placeholder = appMode === 'vibe' ? t.vibeKontekstPlaceholder : t.kontekstPlaceholder;\n    const praiseEl = document.getElementById('km-praise-info');\n    if (praiseEl) praiseEl.placeholder = t.praiseInfoPlaceholder;\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    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    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    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-label-key]').forEach(el => {\n      const key = el.getAttribute('data-label-key');\n      if (t[key]) el.textContent = t[key];\n    });\n\n    const btnGenerateEl = document.getElementById('km-generate');\n    if (btnGenerateEl) btnGenerateEl.textContent = t.generate;\n    const btnMoreEl = document.getElementById('km-more');\n    if (btnMoreEl && !btnMoreEl.onclick) btnMoreEl.textContent = t.showMore;\n    const btnCopyEl = document.getElementById('km-copy');\n    if (btnCopyEl && !btnCopyEl.onclick) btnCopyEl.textContent = t.copy;\n\n    const outputEl = document.getElementById('km-output');\n    if (outputEl && outputEl.classList.contains('km-output-empty')) {\n      if (appMode === 'comment') outputEl.textContent = t.commentPlaceholder;\n      else if (appMode === 'praise') outputEl.textContent = t.praisePlaceholder;\n      else if (appMode === 'vibe') outputEl.textContent = t.vibePlaceholder;\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  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  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  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           !t.startsWith('\u0417\u0434\u0435\u0441\u044c') && !t.startsWith('Dein') && !t.startsWith('Votre') &&\n           !t.startsWith('Tu') && !t.startsWith('Kommenttisi') && !t.startsWith('\u60a8') &&\n           !t.startsWith('\u0906\u092a\u0915\u0940');\n  };\n\n  function setBusy(state) {\n    busy = state;\n    btnGenerate.disabled = state;\n    const t = translations[currentLang];\n    if (state) {\n      btnGenerate.textContent = t.generating + '\u2026';\n    } else {\n      btnGenerate.textContent = t.generate;\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.textContent = t.copy;\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|\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0435|\u0427\u0442\u043e \u043c\u043e\u0436\u0435\u0442|\u041a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c|M\u00f6glicher|Was kann|Impression possible|Ce qui peut|Impresi\u00f3n|Lo que puede|Mahdollinen|Mik\u00e4 voi|\u53ef\u80fd\u7684\u5370\u8c61|\u4ec0\u4e48\u53ef\u80fd|\u53ef\u80fd\u7684\u5370\u8c61|\u0938\u0902\u092d\u093e\u0935\u093f\u0924)\/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  tabComment.addEventListener('click', () => { appMode = 'comment'; updateModeUI(); });\n  tabPraise.addEventListener('click',  () => { appMode = 'praise';  updateModeUI(); });\n  tabVibe.addEventListener('click',    () => { appMode = 'vibe';    updateModeUI(); });\n\n  \/\/ =============================================\n  \/\/ LANGUAGE DETECTION - MUUDETUD v5.1\n  \/\/ =============================================\n  function detectAndSetLanguage() {\n    const url = window.location.href;\n    const params = new URLSearchParams(window.location.search);\n    const langParam = params.get('lang');\n    const host = window.location.hostname;\n    const path = window.location.pathname;\n\n    \/\/ 0. DOMEEN - k\u00f5rgeim prioriteet\n    \/\/ MUUDATUS 1: lisatud 'praisemachine.com': 'en'\n    const domainLangMap = {\n      'kiitmismasin.ee': 'et',\n      'kehukone.fi': 'fi',\n      'preisenmaschine.de': 'de',\n      'complimenteur.fr': 'fr',\n      'elogiador.es': 'es',\n      'pohvalator.com': 'ru',\n      'pohvalator.ru': 'ru',\n      'praisemachine.cn': 'zh',\n    };\n    for (const [domain, lang] of Object.entries(domainLangMap)) {\n      if (host.includes(domain)) {\n        sessionStorage.setItem('km_lang', lang);\n        updateLanguage(lang);\n        return;\n      }\n    }\n\n    \/\/ 1. ?lang= parameeter\n    if (langParam && translations[langParam]) {\n      sessionStorage.setItem('km_lang', langParam);\n      updateLanguage(langParam);\n      return;\n    }\n\n    \/\/ 2. URL path tuvastus\n    \/\/ MUUDATUS 2: lisatud '\/et\/' ja '\/en\/'\n    const pathLangMap = {\n      '\/et\/': 'et',\n      '\/en\/': 'en',\n      '\/ru\/': 'ru', '\/de\/': 'de', '\/fr\/': 'fr',\n      '\/es\/': 'es', '\/fi\/': 'fi', '\/zh\/': 'zh',\n      '\/hi\/': 'hi',\n    };\n    for (const [pathSlug, lang] of Object.entries(pathLangMap)) {\n      if (path.startsWith(pathSlug) || path.includes(pathSlug)) {\n        sessionStorage.setItem('km_lang', lang);\n        updateLanguage(lang);\n        return;\n      }\n    }\n\n    \/\/ 2b. Juure-path '\/' = vaikimisi eesti keel (enne sessionStorage kontrolli!)\n    if (path === '\/' || path === '') {\n      sessionStorage.setItem('km_lang', 'et');\n      updateLanguage('et');\n      return;\n    }\n\n    \/\/ 3. sessionStorage\n    const storedLang = sessionStorage.getItem('km_lang');\n    if (storedLang && translations[storedLang]) {\n      updateLanguage(storedLang);\n      return;\n    }\n\n    \/\/ 4. Viitaja domeen\n    const referrer = document.referrer || '';\n    const referrerMap = {\n      'pohvalator': 'ru',\n      'preisenmaschine': 'de',\n      'complimenteur': 'fr',\n      'elogiador': 'es',\n      'kehukone': 'fi',\n      'praisemachine.cn': 'zh',\n      'praisemachine.in': 'hi',\n      'kiitmismasin': 'et',\n    };\n    for (const [domain, lang] of Object.entries(referrerMap)) {\n      if (referrer.includes(domain)) {\n        sessionStorage.setItem('km_lang', lang);\n        updateLanguage(lang);\n        return;\n      }\n    }\n\n    \/\/ 5. Vaikimisi eesti keel\n    \/\/ MUUDATUS 3: lisatud sessionStorage.setItem\n    sessionStorage.setItem('km_lang', 'et');\n    updateLanguage('et');\n  }\n\n  \/\/ Kliki kuulaja\n  document.addEventListener('click', function(e) {\n    const link = e.target.closest('a');\n    if (!link) return;\n    const href = link.href || '';\n    const langMap = {\n      'lang=ru': 'ru', 'lang=de': 'de', 'lang=fr': 'fr',\n      'lang=es': 'es', 'lang=fi': 'fi', 'lang=zh': 'zh',\n      'lang=hi': 'hi', 'lang=en': 'en', 'lang=et': 'et',\n    };\n    for (const [pattern, lang] of Object.entries(langMap)) {\n      if (href.includes(pattern)) {\n        sessionStorage.setItem('km_lang', lang);\n        setTimeout(() => updateLanguage(lang), 100);\n        return;\n      }\n    }\n  });\n\n  detectAndSetLanguage();\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\/ru\/wp-json\/wp\/v2\/pages\/66","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/praisemachine.com\/ru\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/praisemachine.com\/ru\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/praisemachine.com\/ru\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/praisemachine.com\/ru\/wp-json\/wp\/v2\/comments?post=66"}],"version-history":[{"count":6,"href":"https:\/\/praisemachine.com\/ru\/wp-json\/wp\/v2\/pages\/66\/revisions"}],"predecessor-version":[{"id":572,"href":"https:\/\/praisemachine.com\/ru\/wp-json\/wp\/v2\/pages\/66\/revisions\/572"}],"wp:attachment":[{"href":"https:\/\/praisemachine.com\/ru\/wp-json\/wp\/v2\/media?parent=66"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}