{"id":10706,"date":"2026-01-11T15:39:20","date_gmt":"2026-01-11T14:39:20","guid":{"rendered":"https:\/\/tutustudio.es\/?page_id=10706"},"modified":"2026-04-27T15:58:30","modified_gmt":"2026-04-27T13:58:30","slug":"evaluador","status":"publish","type":"page","link":"https:\/\/tutustudio.es\/en\/evaluador\/","title":{"rendered":"Evaluador de Dise\u00f1o"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"10706\" class=\"elementor elementor-10706\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b622740 e-flex e-con-boxed e-con e-parent\" data-id=\"b622740\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d9deae4 elementor-widget elementor-widget-html\" data-id=\"d9deae4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- 1. Font Dependencies -->\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap\" rel=\"stylesheet\">\n\n<!-- 2. Scoped CSS -->\n<style>\n\/* Hide WordPress default page title to avoid duplication *\/\n.entry-title, .page-title, .post-title, .page-header h1 {\n  display: none !important;\n}\n\n\/* Scope everything to .tutu-wrap to prevent theme conflicts *\/\n.tutu-wrap {\n  \/* Local Variables *\/\n  --tutu-primary: #C4956A;\n  --tutu-bg: #f8f9fc;\n  --tutu-surface: #ffffff;\n  --tutu-border: #e2e8f0;\n  --tutu-text: #1e293b;\n  --tutu-text-light: #64748b;\n  --tutu-accent: #4f46e5;\n  --tutu-radius: 20px;\n  --tutu-shadow: 0 10px 40px -10px rgba(0,0,0,0.08);\n\n  \/* Container Styles *\/\n  width: 100%;\n  max-width: 600px;\n  background: var(--tutu-surface);\n  border-radius: var(--tutu-radius);\n  box-shadow: var(--tutu-shadow);\n  padding: 32px;\n  margin: 40px auto; \/* Center in WP post *\/\n  font-family: 'Plus Jakarta Sans', system-ui, -apple-system, sans-serif;\n  color: var(--tutu-text);\n  line-height: 1.5;\n  box-sizing: border-box;\n  text-align: left; \/* Reset alignment *\/\n}\n\n\/* Reset box-sizing for all internal elements *\/\n.tutu-wrap *, \n.tutu-wrap *::before, \n.tutu-wrap *::after {\n  box-sizing: border-box;\n}\n\n\/* Typography Overrides *\/\n.tutu-wrap h2 {\n  font-family: 'Plus Jakarta Sans', sans-serif !important;\n  font-size: 28px !important;\n  font-weight: 800 !important;\n  margin: 0 0 8px 0 !important;\n  letter-spacing: -0.03em;\n  color: var(--tutu-primary) !important;\n  line-height: 1.2 !important;\n}\n\n.tutu-wrap .tutu-subtitle {\n  color: var(--tutu-text-light);\n  font-size: 15px;\n  margin-bottom: 32px;\n  display: block;\n}\n\n\/* Form Elements *\/\n.tutu-wrap .tutu-form-group { margin-bottom: 24px; }\n\n.tutu-wrap label.tutu-label {\n  display: block;\n  font-size: 14px;\n  font-weight: 700;\n  color: var(--tutu-text);\n  margin-bottom: 10px;\n  text-transform: uppercase;\n  letter-spacing: 0.05em;\n}\n\n\/* Custom Upload Box *\/\n.tutu-wrap .tutu-upload-box {\n  position: relative;\n  border: 2px dashed var(--tutu-border);\n  border-radius: 16px;\n  padding: 40px 20px;\n  text-align: center;\n  cursor: pointer;\n  transition: all 0.2s ease;\n  background: #fdfdfd;\n  overflow: hidden;\n}\n\n.tutu-wrap .tutu-upload-box:hover {\n  border-color: var(--tutu-accent);\n  background: #f0fdfa;\n}\n\n.tutu-wrap .tutu-upload-box input[type=\"file\"] {\n  position: absolute;\n  top: 0; left: 0; width: 100%; height: 100%;\n  opacity: 0;\n  cursor: pointer;\n  z-index: 10;\n}\n\n.tutu-wrap .tutu-upload-content { pointer-events: none; }\n.tutu-wrap .tutu-upload-icon { margin-bottom: 16px; display: block; line-height: 1; color: #94a3b8; transition: all 0.3s ease; }\n.tutu-wrap .tutu-upload-box:hover .tutu-upload-icon { color: var(--tutu-accent); transform: scale(1.1); }\n.tutu-wrap .tutu-upload-icon svg { width: 64px; height: 64px; }\n.tutu-wrap .tutu-upload-text { font-weight: 600; color: var(--tutu-accent); display: block; }\n.tutu-wrap .tutu-upload-hint { font-size: 13px; color: var(--tutu-text-light); margin-top: 4px; display: block; }\n\n.tutu-wrap .tutu-preview-img {\n  max-width: 100%;\n  max-height: 200px;\n  border-radius: 8px;\n  margin-top: 10px;\n  display: none;\n  box-shadow: 0 4px 12px rgba(0,0,0,0.1);\n}\n\n\/* Size Selector *\/\n.tutu-wrap .tutu-size-options {\n  display: flex;\n  gap: 10px;\n  flex-wrap: wrap;\n}\n\n.tutu-wrap .tutu-size-option {\n  position: relative;\n  flex: 1;\n  min-width: 80px;\n  margin: 0; \/* Reset WP margins *\/\n}\n\n.tutu-wrap .tutu-size-option input {\n  position: absolute;\n  opacity: 0;\n  width: 0;\n  height: 0;\n}\n\n.tutu-wrap .tutu-size-label {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: 12px;\n  background: #fff;\n  border: 1px solid var(--tutu-border);\n  border-radius: 12px;\n  font-weight: 600;\n  font-size: 14px;\n  color: var(--tutu-text-light);\n  cursor: pointer;\n  transition: all 0.2s;\n  user-select: none;\n}\n\n.tutu-wrap .tutu-size-option input:checked + .tutu-size-label {\n  background: var(--tutu-primary);\n  color: #fff;\n  border-color: var(--tutu-primary);\n  box-shadow: 0 4px 12px rgba(0,0,0,0.15);\n  transform: translateY(-1px);\n}\n\n\/* Toggles *\/\n.tutu-wrap .tutu-toggles-group {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 16px;\n  margin-top: 24px;\n}\n\n.tutu-wrap .tutu-toggle-item {\n  display: flex;\n  align-items: center;\n  padding: 16px;\n  border: 1px solid var(--tutu-border);\n  border-radius: 16px;\n  cursor: pointer;\n  transition: all 0.2s;\n  margin: 0;\n}\n\n.tutu-wrap .tutu-toggle-item:hover { border-color: var(--tutu-text-light); }\n.tutu-wrap .tutu-toggle-item input { margin-right: 12px; transform: scale(1.2); accent-color: var(--tutu-primary); }\n.tutu-wrap .tutu-toggle-text { font-weight: 600; font-size: 14px; }\n\n.tutu-wrap .tutu-wait-hint {\n  text-align: center;\n  font-size: 13px;\n  color: var(--tutu-text-light);\n  margin-top: 24px;\n  margin-bottom: 8px;\n  opacity: 0.9;\n  font-weight: 500;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  gap: 6px;\n}\n\n\/* Button *\/\n.tutu-wrap .tutu-btn {\n  width: 100%;\n  background: var(--tutu-primary);\n  color: #fff !important;\n  border: none;\n  padding: 18px;\n  border-radius: 16px;\n  font-size: 16px;\n  font-weight: 700;\n  cursor: pointer;\n  transition: all 0.2s;\n  margin-top: 12px;\n  box-shadow: 0 8px 20px -4px rgba(0,0,0,0.3);\n  text-decoration: none !important;\n  display: block;\n  text-align: center;\n}\n\n.tutu-wrap .tutu-btn:hover {\n  transform: translateY(-2px);\n  box-shadow: 0 12px 24px -4px rgba(0,0,0,0.4);\n}\n\n.tutu-wrap .tutu-btn:disabled { opacity: 0.7; cursor: wait; transform: none; }\n\n\/* Result Card *\/\n.tutu-wrap .tutu-card {\n  margin-top: 40px;\n  border-top: 1px solid var(--tutu-border);\n  padding-top: 32px;\n  animation: tutuSlideUp 0.4s ease-out;\n}\n\n@keyframes tutuSlideUp {\n  from { opacity: 0; transform: translateY(20px); }\n  to { opacity: 1; transform: translateY(0); }\n}\n\n.tutu-wrap .tutu-result-header {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  margin-bottom: 24px;\n}\n\n.tutu-wrap .tutu-grade-badge {\n  font-size: 32px;\n  font-weight: 800;\n  padding: 8px 20px;\n  border-radius: 16px;\n  display: inline-flex;\n  align-items: center;\n  gap: 8px;\n  line-height: 1.2;\n}\n\n.tutu-wrap .grade-A { background: #dcfce7; color: #166534; }\n.tutu-wrap .grade-B { background: #fef9c3; color: #854d0e; }\n.tutu-wrap .grade-C { background: #ffedd5; color: #9a3412; }\n.tutu-wrap .grade-D { background: #fee2e2; color: #991b1b; }\n\n.tutu-wrap .tutu-info-grid {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 16px;\n  margin-bottom: 24px;\n}\n\n.tutu-wrap .tutu-info-box {\n  background: #f1f5f9;\n  padding: 16px;\n  border-radius: 12px;\n}\n\n.tutu-wrap .tutu-info-label { font-size: 12px; color: var(--tutu-text-light); font-weight: 600; text-transform: uppercase; margin-bottom: 4px; display: block; }\n.tutu-wrap .tutu-info-value { font-size: 15px; font-weight: 700; color: var(--tutu-text); display: block; }\n\n.tutu-wrap .tutu-suggestion-box {\n  background: #f0fdfa;\n  border: 1px solid #ccfbf1;\n  padding: 20px;\n  border-radius: 16px;\n  color: #115e59;\n}\n\n.tutu-wrap .tutu-suggestion-main { font-weight: 700; font-size: 16px; margin-bottom: 8px; display: block; }\n\n.tutu-wrap .tutu-section-title {\n  display: flex;\n  align-items: center;\n  font-size: 16px;\n  font-weight: 700;\n  margin: 24px 0 12px;\n  color: var(--tutu-primary);\n}\n\n.tutu-wrap .tutu-reason-list {\n  list-style: none;\n  padding: 0;\n  margin: 0;\n}\n\n.tutu-wrap .tutu-reason-list li {\n  position: relative;\n  padding-left: 24px;\n  margin-bottom: 8px;\n  font-size: 14px;\n  color: var(--tutu-text);\n  line-height: 1.5;\n}\n\n.tutu-wrap .tutu-reason-list li::before {\n  content: \"\u2022\";\n  color: var(--tutu-text-light);\n  position: absolute;\n  left: 6px;\n  font-weight: bold;\n}\n\n.tutu-wrap .tutu-teacher-quote {\n  margin-top: 24px;\n  background: #fff;\n  border: 2px solid #f1f5f9;\n  padding: 20px;\n  border-radius: 16px 16px 16px 0;\n  font-style: italic;\n  font-size: 15px;\n  color: #475569;\n  position: relative;\n}\n\n.tutu-wrap .tutu-teacher-quote::before {\n  content: \"\ud83d\udcac\";\n  position: absolute;\n  top: -12px;\n  left: -12px;\n  font-size: 24px;\n  background: var(--tutu-surface);\n  border-radius: 50%;\n}\n\n\/* Pinterest Widget *\/\n  .tutu-wrap .tutu-pinterest-container {\n    margin-top: 24px;\n    display: block;\n    animation: tutuFadeIn 0.5s ease;\n    text-align: center;\n  }\n\n  .tutu-wrap .tutu-pinterest-header {\n    margin-bottom: 16px;\n  }\n\n  .tutu-wrap .tutu-pinterest-title {\n    font-size: 14px;\n    font-weight: 700;\n    color: var(--tutu-text-light);\n    margin-bottom: 12px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    gap: 8px;\n  }\n\n  .tutu-wrap .tutu-pinterest-tabs {\n    display: flex;\n    justify-content: center;\n    gap: 8px;\n  }\n\n  .tutu-wrap .tutu-pin-tab {\n    padding: 6px 16px;\n    border-radius: 20px;\n    border: 1px solid var(--tutu-border);\n    background: #fff;\n    color: var(--tutu-text-light);\n    cursor: pointer;\n    font-size: 13px;\n    font-weight: 600;\n    transition: all 0.2s;\n  }\n\n  .tutu-wrap .tutu-pin-tab:hover {\n    background: #f8fafc;\n    border-color: var(--tutu-text-light);\n  }\n\n  .tutu-wrap .tutu-pin-tab.active {\n    background: var(--tutu-primary);\n    color: #fff;\n    border-color: var(--tutu-primary);\n    box-shadow: 0 4px 12px rgba(0,0,0,0.1);\n  }\n\n  .tutu-wrap .tutu-pin-content {\n    min-height: 400px;\n    display: none;\n    justify-content: center;\n    background: #f8fafc;\n    border-radius: 16px;\n    padding: 10px;\n  }\n\n  .tutu-wrap .tutu-pin-content.active {\n    display: flex;\n  }\n\n  \/* Override Pinterest internal styles if possible, but mainly container control *\/\n  .tutu-wrap span[data-pin-log=\"embed\/board\"] {\n    display: block !important;\n    margin: 0 auto;\n  }\n\n@keyframes tutuFadeIn {\n  from { opacity: 0; transform: translateY(10px); }\n  to { opacity: 1; transform: translateY(0); }\n}\n\n@media (max-width: 480px) {\n  .tutu-wrap { padding: 24px 20px; margin: 20px auto; }\n  .tutu-wrap .tutu-toggles-group { grid-template-columns: 1fr; }\n  .tutu-wrap .tutu-info-grid { grid-template-columns: 1fr; }\n  .tutu-wrap .tutu-size-options { gap: 8px; }\n  .tutu-wrap .tutu-size-label { font-size: 13px; padding: 10px 6px; }\n}\n<\/style>\n\n<!-- 3. HTML Structure -->\n<div class=\"tutu-wrap\" id=\"tutu-app-container\">\n  <!-- <h2>Evaluador de Dise\u00f1o<\/h2> -->\n  <h1 style=\"font-family:Plus Jakarta Sans,sans-serif!important;font-size:24px!important;font-weight:800!important;margin:0 0 6px!important;color:#C4956A!important;line-height:1.3!important\">Eval\u00faa tu dise\u00f1o antes de reservar<\/h1><span class=\"tutu-subtitle\">Descubre si tu imagen funciona bien para tufting, qu\u00e9 tama\u00f1o puede ir mejor y si conviene simplificarla.<\/span><p style=\"font-size:14px;color:#64748b;margin:6px 0 0;line-height:1.5\">As\u00ed reservas con m\u00e1s seguridad y m\u00e1s posibilidades de que el resultado quede bien.<\/p><div style=\"display:flex;align-items:center;gap:8px;margin:12px 0 24px;padding:10px 16px;background:#f0fdf4;border-radius:12px;font-size:13px;color:#166534;font-weight:600\"><span>\u2705<\/span><span>+2.000 dise\u00f1os evaluados<\/span><\/div>\n\n  <div class=\"tutu-form-group\">\n    <label class=\"tutu-label\">1. Sube tu dise\u00f1o<\/label>\n    <div class=\"tutu-upload-box\" id=\"tutu-uploadBox\">\n      <input id=\"tutu-file\" type=\"file\" accept=\"image\/*\" \/>\n      <div class=\"tutu-upload-content\" id=\"tutu-uploadPlaceholder\">\n        <span class=\"tutu-upload-icon\">\n          <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n            <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\" \/>\n          <\/svg>\n        <\/span>\n        <span class=\"tutu-upload-text\">Clic para subir imagen<\/span>\n        <span class=\"tutu-upload-hint\">Formatos: JPG, PNG<\/span>\n      <\/div>\n      <img id=\"tutu-preview\" class=\"tutu-preview-img\" alt=\"Preview\"\/>\n    <\/div>\n  <\/div>\n\n  <div class=\"tutu-form-group\">\n    <label class=\"tutu-label\">2. Tama\u00f1o deseado<\/label>\n    <div class=\"tutu-size-options\">\n      <label class=\"tutu-size-option\">\n        <input type=\"radio\" name=\"tutu-size\" value=\"30x30\">\n        <span class=\"tutu-size-label\">30x30cm<\/span>\n      <\/label>\n      <label class=\"tutu-size-option\">\n        <input type=\"radio\" name=\"tutu-size\" value=\"50x50\">\n        <span class=\"tutu-size-label\">50x50cm<\/span>\n      <\/label>\n      <label class=\"tutu-size-option\">\n        <input type=\"radio\" name=\"tutu-size\" value=\"70x70\" checked>\n        <span class=\"tutu-size-label\">70x70cm<\/span>\n      <\/label>\n      <label class=\"tutu-size-option\">\n        <input type=\"radio\" name=\"tutu-size\" value=\"90x90\">\n        <span class=\"tutu-size-label\">90x90cm<\/span>\n      <\/label>\n      <label class=\"tutu-size-option\">\n        <input type=\"radio\" name=\"tutu-size\" value=\"100x130\">\n        <span class=\"tutu-size-label\">100x130cm<\/span>\n      <\/label>\n    <\/div>\n  <\/div>\n\n  <div class=\"tutu-toggles-group\">\n    <label class=\"tutu-toggle-item\">\n      <input id=\"tutu-beginner\" type=\"checkbox\"\/>\n      <span class=\"tutu-toggle-text\">Soy principiante<br><span style=\"font-size:11px;font-weight:400;color:#94a3b8\">Primera vez en tufting<\/span><\/span>\n    <\/label>\n    <label class=\"tutu-toggle-item\">\n      <input id=\"tutu-simplify\" type=\"checkbox\" checked\/>\n      <span class=\"tutu-toggle-text\">Acepto simplificar<br><span style=\"font-size:11px;font-weight:400;color:#94a3b8\">Ajustaremos tu dise\u00f1o si es necesario<\/span><\/span>\n    <\/label>\n  <\/div>\n\n  <div id=\"tutu-wait-hint\" class=\"tutu-wait-hint\" style=\"display:none\"><\/div>\n  <button id=\"tutu-go\" class=\"tutu-btn\">Evaluar mi dise\u00f1o<\/button>\n\n  <!-- Pinterest Widget (Hidden by default) -->\n  <div class=\"tutu-pinterest-container\">\n    <div class=\"tutu-pinterest-header\">\n      <div class=\"tutu-pinterest-title\">\u2728 Inspiraci\u00f3n mientras esperas<\/div>\n      <div class=\"tutu-pinterest-tabs\">\n        <button class=\"tutu-pin-tab active\" data-target=\"pin-easy\">F\u00e1cil<\/button>\n        <button class=\"tutu-pin-tab\" data-target=\"pin-medium\">Medio<\/button>\n        <button class=\"tutu-pin-tab\" data-target=\"pin-hard\">Dif\u00edcil<\/button>\n        <button class=\"tutu-pin-tab\" data-target=\"pin-couple\">Pareja<\/button>\n        <button class=\"tutu-pin-tab\" data-target=\"pin-nature\">Naturaleza<\/button>\n      <\/div>\n    <\/div>\n    \n    <div class=\"tutu-pin-content active\" id=\"pin-easy\">\n      <a data-pin-do=\"embedBoard\" data-pin-board-width=\"400\" data-pin-scale-height=\"240\" data-pin-scale-width=\"80\" href=\"https:\/\/es.pinterest.com\/tutustudio_es\/tutu-design\/easy\/\" target=\"_blank\" rel=\"noopener\"><\/a>\n    <\/div>\n    <div class=\"tutu-pin-content\" id=\"pin-medium\">\n      <a data-pin-do=\"embedBoard\" data-pin-board-width=\"400\" data-pin-scale-height=\"240\" data-pin-scale-width=\"80\" href=\"https:\/\/es.pinterest.com\/tutustudio_es\/tutu-design\/medium\/\" target=\"_blank\" rel=\"noopener\"><\/a>\n    <\/div>\n    <div class=\"tutu-pin-content\" id=\"pin-hard\">\n      <a data-pin-do=\"embedBoard\" data-pin-board-width=\"400\" data-pin-scale-height=\"240\" data-pin-scale-width=\"80\" href=\"https:\/\/es.pinterest.com\/tutustudio_es\/tutu-design\/hard\/\" target=\"_blank\" rel=\"noopener\"><\/a>\n    <\/div>\n    <div class=\"tutu-pin-content\" id=\"pin-couple\">\n      <a data-pin-do=\"embedBoard\" data-pin-board-width=\"400\" data-pin-scale-height=\"240\" data-pin-scale-width=\"80\" href=\"https:\/\/es.pinterest.com\/tutustudio_es\/tutu-design\/couple\/\" target=\"_blank\" rel=\"noopener\"><\/a>\n    <\/div>\n    <div class=\"tutu-pin-content\" id=\"pin-nature\">\n      <a data-pin-do=\"embedBoard\" data-pin-board-width=\"400\" data-pin-scale-height=\"240\" data-pin-scale-width=\"80\" href=\"https:\/\/es.pinterest.com\/tutustudio_es\/tutu-design\/nature\/\" target=\"_blank\" rel=\"noopener\"><\/a>\n    <\/div>\n    \n    <script async defer src=\"\/\/assets.pinterest.com\/js\/pinit.js\"><\/script>\n  <\/div>\n\n  <div id=\"tutu-result\" class=\"tutu-result-container\" style=\"display:none;\"><\/div>\n<\/div>\n\n<!-- 4. JavaScript Logic -->\n<script>\n(function() {\n  \/\/ Worker URL\n  const workerUrl = \"https:\/\/tutu-design-checker.z13646885180.workers.dev\/\";\n\n  \/\/ Language Detection\n  const getLang = () => {\n    \/\/ 1. Check HTML lang attribute (Priority)\n    const docLang = document.documentElement.lang || \"\";\n    if(docLang.startsWith('zh')) return 'zh';\n    if(docLang.startsWith('en')) return 'en';\n    \n    \/\/ 2. Default to Spanish\n    return 'es'; \n  };\n  \n  const siteLang = getLang();\n\n  const TEXT = {\n    zh: {\n      title: \"Tufting \u8bbe\u8ba1\u8bc4\u4f30\",\n      subtitle: \"\u667a\u80fd\u5de5\u827a\u5206\u6790 \u00b7 TUTU Studio\",\n      upload_label: \"1. \u4e0a\u4f20\u8bbe\u8ba1\u56fe\",\n      upload_text: \"\u70b9\u51fb\u4e0a\u4f20\u56fe\u7247\",\n      size_label: \"2. \u76ee\u6807\u5c3a\u5bf8\",\n      beginner: \"\u6211\u662f\u65b0\u624b (\u7b2c\u4e00\u6b21)\",\n      simplify: \"\u63a5\u53d7\u7b80\u5316\u4fee\u6539\",\n      btn: \"\u5f00\u59cb\u8bc4\u4f30\",\n      btn_loading: \"\u6b63\u5728\u5206\u6790\u4e2d...\",\n      level: {A:\"\u7b80\u5355\", B:\"\u4e2d\u7b49\", C:\"\u56f0\u96be\", D:\"\u4e0d\u63a8\u8350\"},\n      res_beginner: \"\u65b0\u624b\u9002\u914d\u5ea6\",\n      res_size: \"\u5c3a\u5bf8\u53ef\u884c\u6027\",\n      res_suggest: \"\u4f18\u5316\u5efa\u8bae\",\n      res_why: \"\u5206\u6790\u539f\u56e0\",\n      res_teacher: \"\u8001\u5e08\u8bf4\",\n      error: \"\u5206\u6790\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5\",\n      wait_hint: \"\u23f3 \u5206\u6790\u901a\u5e38\u9700\u8981 10-20 \u79d2\uff0c\u8bf7\u8010\u5fc3\u7b49\u5f85...\",\n      carousel_title: \"\u2728 \u7b49\u5f85\u65f6\u770b\u70b9\u7075\u611f\uff1aTufting \u4f18\u79c0\u8bbe\u8ba1\",\n      tab_easy: \"\u7b80\u5355\",\n      tab_medium: \"\u4e2d\u7b49\",\n      tab_hard: \"\u56f0\u96be\",\n      tab_couple: \"\u60c5\u4fa3\",\n      tab_nature: \"\u81ea\u7136\"\n    },\n    es: {\n      title: \"Eval\u00faa tu dise\u00f1o antes de reservar\",\n      subtitle: \"Descubre si tu imagen funciona bien para tufting, qu\u00e9 tama\u00f1o puede ir mejor y si conviene simplificarla.\",\n      upload_label: \"1. Sube tu dise\u00f1o\",\n      upload_text: \"Clic para subir imagen\",\n      size_label: \"2. Tama\u00f1o deseado\",\n      beginner: \"Soy principiante\",\n      simplify: \"Acepto simplificar\",\n      btn: \"Evaluar mi dise\u00f1o\",\n      btn_loading: \"Analizando...\",\n      wait_hint: \"\u23f3 El an\u00e1lisis toma unos 10-20 segundos, por favor espera...\",\n      level: {A:\"F\u00e1cil\", B:\"Media\", C:\"Dif\u00edcil\", D:\"No recomendado\"},\n      res_beginner: \"Para principiantes\",\n      res_size: \"Viabilidad tama\u00f1o\",\n      res_suggest: \"Sugerencias\",\n      res_why: \"Razones\",\n      res_teacher: \"Nota del profesor\",\n      error: \"Error al analizar\",\n      carousel_title: \"\u2728 Inspiraci\u00f3n mientras esperas\",\n      tab_easy: \"F\u00e1cil\",\n      tab_medium: \"Medio\",\n      tab_hard: \"Dif\u00edcil\",\n      tab_couple: \"Pareja\",\n      tab_nature: \"Naturaleza\"\n    },\n    en: {\n      title: \"Design Evaluator\",\n      subtitle: \"Tufting Design Check \u00b7 TUTU Studio\",\n      upload_label: \"1. Upload Design\",\n      upload_text: \"Click to upload\",\n      size_label: \"2. Target Size\",\n      beginner: \"I'm a beginner\",\n      simplify: \"Accept simplify\",\n      btn: \"Evaluate my design\",\n      btn_loading: \"Analyzing...\",\n      wait_hint: \"\u23f3 Analysis takes about 10-20 seconds, please wait...\",\n      level: {A:\"Easy\", B:\"Medium\", C:\"Hard\", D:\"Not Recommended\"},\n      res_beginner: \"Beginner Friendly\",\n      res_size: \"Size Feasibility\",\n      res_suggest: \"Suggestion\",\n      res_why: \"Why?\",\n      res_teacher: \"Instructor's Note\",\n      error: \"Analysis failed\",\n      carousel_title: \"\u2728 Inspiration while waiting\",\n      tab_easy: \"Easy\",\n      tab_medium: \"Medium\",\n      tab_hard: \"Hard\",\n      tab_couple: \"Couple\",\n      tab_nature: \"Nature\"\n    }\n  };\n\n  const t = TEXT[siteLang];\n\n  \/\/ 1. Initialize Text for ALL instances (handles Elementor duplication)\n  function initAllInstances() {\n    const lang = getLang();\n    const t = TEXT[lang];\n    \n    \/\/ Update text content for all instances\n    const containers = document.querySelectorAll('.tutu-wrap');\n    containers.forEach(container => {\n      \/\/ Use scoped selectors\n      const h2 = container.querySelector(\"h2\");\n      if(h2) h2.textContent = t.title;\n      \n      const sub = container.querySelector(\".tutu-subtitle\");\n      if(sub) sub.textContent = t.subtitle;\n      \n      const labels = container.querySelectorAll(\".tutu-label\");\n      if(labels[0]) labels[0].textContent = t.upload_label;\n      if(labels[1]) labels[1].textContent = t.size_label;\n      \n      const upText = container.querySelector(\".tutu-upload-text\");\n      if(upText) upText.textContent = t.upload_text;\n      \n      const toggles = container.querySelectorAll(\".tutu-toggle-text\");\n      if(toggles[0]) toggles[0].textContent = t.beginner;\n      if(toggles[1]) toggles[1].textContent = t.simplify;\n      \n      const waitHint = container.querySelector(\".tutu-wait-hint\");\n      if(waitHint) waitHint.textContent = t.wait_hint;\n      \n      const btn = container.querySelector(\".tutu-btn\");\n      if(btn) btn.textContent = t.btn;\n\n      const pinterestTitle = container.querySelector(\".tutu-pinterest-title\");\n      if(pinterestTitle) pinterestTitle.textContent = t.carousel_title;\n      \n      const tabs = container.querySelectorAll(\".tutu-pin-tab\");\n      if(tabs[0]) tabs[0].textContent = t.tab_easy;\n      if(tabs[1]) tabs[1].textContent = t.tab_medium;\n      if(tabs[2]) tabs[2].textContent = t.tab_hard;\n      if(tabs[3]) tabs[3].textContent = t.tab_couple;\n      if(tabs[4]) tabs[4].textContent = t.tab_nature;\n    });\n  }\n  \n  \/\/ Run init immediately and on DOMContentLoaded just in case\n  initAllInstances();\n  document.addEventListener('DOMContentLoaded', initAllInstances);\n\n  \/\/ Fix WordPress Page Title\n  try {\n    const wpTitles = document.querySelectorAll('h1, h2, .elementor-heading-title, .entry-title, .page-title');\n    wpTitles.forEach(el => {\n      if (el.textContent && (el.textContent.includes(\"Evaluador de Dise\u00f1o\") || el.textContent.includes(\"Design Evaluator\"))) {\n        el.textContent = t.title;\n      }\n    });\n  } catch (e) {\n    console.warn(\"TUTU: Title update failed\", e);\n  }\n\n  \/\/ Initialize Pinterest Widget immediately if visible\n  try {\n    if(window.PinUtils) {\n      window.PinUtils.build();\n    }\n  } catch(err) {\n    console.warn(\"Pinterest widget init failed:\", err);\n  }\n\n  \/\/ 2. Global Event Delegation\n  document.addEventListener('click', async (e) => {\n    \/\/ Find which component instance triggered this\n    const root = e.target.closest('.tutu-wrap');\n    if (!root) return; \/\/ Not our component\n\n    \/\/ Handle Upload Box Click (Proxy to Input)\n    const uploadBox = e.target.closest('.tutu-upload-box');\n    if (uploadBox) {\n      const fileInput = root.querySelector('input[type=\"file\"]');\n      \/\/ Only trigger if we didn't click the input itself\n      if (fileInput && e.target !== fileInput) {\n        fileInput.click();\n      }\n      return;\n    }\n\n    \/\/ Handle File Input Click (Reset value)\n    if (e.target.matches('input[type=\"file\"]')) {\n      e.target.value = null;\n      return;\n    }\n\n    \/\/ Handle Pinterest Tabs\n    if (e.target.matches('.tutu-pin-tab')) {\n      const tabs = root.querySelectorAll('.tutu-pin-tab');\n      tabs.forEach(t => t.classList.remove('active'));\n      e.target.classList.add('active');\n      \n      const targetId = e.target.dataset.target;\n      const contents = root.querySelectorAll('.tutu-pin-content');\n      contents.forEach(c => {\n        c.classList.remove('active');\n        if(c.id === targetId) {\n          c.classList.add('active');\n          if(window.PinUtils) window.PinUtils.build();\n        }\n      });\n      return;\n    }\n\n    \/\/ Handle Submit Button\n    if (e.target.matches('.tutu-btn')) {\n      handleEvaluate(e.target, root);\n    }\n  });\n\n  document.body.addEventListener('change', function(e) {\n    const root = e.target.closest('.tutu-wrap');\n    if (!root) return;\n\n    \/\/ Handle File Selection\n    if (e.target.matches('input[type=\"file\"]')) {\n      handleFileSelect(e.target, root);\n    }\n  });\n\n  \/\/ Logic Functions\n  function handleFileSelect(input, root) {\n    const file = input.files[0];\n    const uploadBox = root.querySelector('.tutu-upload-box');\n    \n    if (file) {\n      if(uploadBox) uploadBox.style.opacity = '0.5';\n      \n      const reader = new FileReader();\n      reader.onload = function(evt) {\n        if(uploadBox) uploadBox.style.opacity = '1';\n        \n        const img = root.querySelector('.tutu-preview-img');\n        const placeholder = root.querySelector('.tutu-upload-content');\n        \n        if (img) {\n          img.src = evt.target.result;\n          img.style.display = 'block';\n          \n          img.onerror = function() {\n             img.style.display = 'none';\n             if(placeholder) placeholder.style.display = 'block';\n             alert(\"Format not supported \/ \u683c\u5f0f\u4e0d\u652f\u6301\");\n          };\n        }\n        \n        if (placeholder) placeholder.style.display = 'none';\n        if (uploadBox) uploadBox.style.borderColor = '';\n      };\n      reader.readAsDataURL(file);\n    }\n  }\n\n  function fileToDataUrl(file){\n    return new Promise((resolve, reject) => {\n      const reader = new FileReader();\n      reader.onload = () => resolve(reader.result);\n      reader.onerror = reject;\n      reader.readAsDataURL(file);\n    });\n  }\n\n  async function handleEvaluate(btn, root) {\n    const resultDiv = root.querySelector('.tutu-result-container');\n    const fileInput = root.querySelector('input[type=\"file\"]');\n    const uploadBox = root.querySelector('.tutu-upload-box');\n    const sizeInput = root.querySelector('input[name=\"tutu-size\"]:checked');\n    const beginnerInput = root.querySelector('input[id*=\"beginner\"]'); \/\/ looser selector\n    const simplifyInput = root.querySelector('input[id*=\"simplify\"]');\n\n    if(!fileInput || !fileInput.files[0]){\n      if(uploadBox) {\n        uploadBox.style.borderColor = \"#ef4444\";\n        uploadBox.style.backgroundColor = \"#fef2f2\";\n        setTimeout(() => {\n          uploadBox.style.borderColor = \"\";\n          uploadBox.style.backgroundColor = \"\";\n        }, 1000);\n      }\n      return;\n    }\n\n    btn.disabled = true;\n    const originalBtnText = btn.textContent;\n    btn.textContent = t.btn_loading;\n    if(resultDiv) resultDiv.style.display = \"none\";\n    \n    \/\/ Show Pinterest Widget (Safely)\n    try {\n      const pinterest = root.querySelector('.tutu-pinterest-container');\n      if(pinterest) {\n        \/\/ pinterest.style.display = 'block'; \/\/ Already visible by CSS\n        if(window.PinUtils) {\n          window.PinUtils.build();\n        }\n      }\n    } catch(err) {\n      console.warn(\"Pinterest widget init failed:\", err);\n    }\n\n    try {\n      const payload = {\n        imageDataUrl: await fileToDataUrl(fileInput.files[0]),\n        size: sizeInput ? sizeInput.value : \"70x70\",\n        isBeginner: beginnerInput ? beginnerInput.checked : false,\n        acceptSimplify: simplifyInput ? simplifyInput.checked : true,\n        lang: siteLang\n      };\n\n      if(typeof gtag==='function') gtag('event','evaluator_submit', {size: payload.size, is_beginner: String(payload.isBeginner)});\n\n      const resp = await fetch(workerUrl, {\n        method: \"POST\",\n        headers: { \"Content-Type\":\"application\/json\" },\n        body: JSON.stringify(payload)\n      });\n\n      const data = JSON.parse(await resp.text());\n      if(typeof gtag==='function') gtag('event','evaluator_result', {grade: data.label, size: sizeInput ? sizeInput.value : '70x70', beginner_fit: data.beginner_fit});\n      if(resultDiv) {\n        resultDiv.innerHTML = renderResult(data);\n        resultDiv.style.display = \"block\";\n        resultDiv.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n\n    } catch(e) {\n      console.error(e);\n      alert(t.error);\n    } finally {\n      btn.disabled = false;\n      btn.textContent = originalBtnText;\n    }\n  }\n\n  function renderResult(data){\n    return `\n      <div class=\"tutu-card\">\n        <div class=\"tutu-result-header\">\n          <div class=\"tutu-grade-badge grade-${data.label}\">\n            <span>${data.label}<\/span>\n            <span style=\"font-size:16px; font-weight:600; opacity:0.9\">\n              ${t.level[data.label]}\n            <\/span>\n          <\/div>\n        <\/div>\n\n        <div class=\"tutu-info-grid\">\n          <div class=\"tutu-info-box\">\n            <span class=\"tutu-info-label\">${t.res_beginner}<\/span>\n            <span class=\"tutu-info-value\">${data.beginner_fit}<\/span>\n          <\/div>\n          <div class=\"tutu-info-box\">\n            <span class=\"tutu-info-label\">${t.res_size}<\/span>\n            <span class=\"tutu-info-value\">${data.size_feasibility}<\/span>\n          <\/div>\n        <\/div>\n\n        <div class=\"tutu-suggestion-box\">\n          <span class=\"tutu-suggestion-main\">\u2705 ${data.main_action}<\/span>\n          ${data.recommended_size && data.recommended_size !== \"null\" \n            ? `<div style=\"font-size:14px; margin-top:4px; opacity:0.9\">Recommended: ${data.recommended_size}<\/div>` : \"\"}\n          \n          ${data.simplify_suggestions?.length ? `\n            <ul class=\"tutu-reason-list\" style=\"margin-top:8px;\">\n              ${data.simplify_suggestions.map(s => `<li>${s}<\/li>`).join(\"\")}\n            <\/ul>\n          ` : \"\"}\n        <\/div>\n\n        <div class=\"tutu-section-title\"><span>\u2753<\/span> ${t.res_why}<\/div>\n        <ul class=\"tutu-reason-list\">\n          ${data.reasons_top3.map(r => `<li>${r}<\/li>`).join(\"\")}\n        <\/ul>\n\n        ${data.teacher_copy ? `\n          <div class=\"tutu-teacher-quote\">\n            ${data.teacher_copy}\n          <\/div>\n        ` : \"\"}\n\n        <div style=\"display:flex;gap:12px;margin-top:28px;flex-wrap:wrap\">\n          <a href=\"https:\/\/tutustudio.es\/reservas\/\" onclick=\"if(typeof gtag==='function')gtag('event','evaluator_click_reservar',{grade:'${data.label}'})\" class=\"tutu-btn\" style=\"flex:1;min-width:200px;text-decoration:none;display:flex;align-items:center;justify-content:center;gap:8px\">Reservar ahora<\/a>\n          <a href=\"https:\/\/wa.me\/34624158553?text=Hola!%20Acabo%20de%20evaluar%20mi%20dise%C3%B1o%20y%20tengo%20una%20duda\" onclick=\"if(typeof gtag==='function')gtag('event','evaluator_click_whatsapp',{grade:'${data.label}'})\" class=\"tutu-btn\" style=\"flex:1;min-width:200px;background:#25D366;text-decoration:none;display:flex;align-items:center;justify-content:center;gap:8px\">Hablar por WhatsApp<\/a>\n        <\/div>\n      <\/div>\n    `;\n  }\n\n})();\n<\/script>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Tufting Design Check \u00b7 TUTU Studio 1. Sube tu dise\u00f1o Clic para subir imagen JPG, PNG supported 2. Tama\u00f1o deseado 30x30cm 50x50cm 70x70cm 90x90cm 100x130cm Soy principiante Acepto simplificar \u2728 Evaluar Dise\u00f1o \u2728 While waiting: Design Inspiration Easy Medium Hard Couple Nature<\/p>","protected":false},"author":5,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_elementor_css":null,"footnotes":""},"class_list":["post-10706","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/tutustudio.es\/en\/wp-json\/wp\/v2\/pages\/10706","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tutustudio.es\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/tutustudio.es\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/tutustudio.es\/en\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/tutustudio.es\/en\/wp-json\/wp\/v2\/comments?post=10706"}],"version-history":[{"count":5,"href":"https:\/\/tutustudio.es\/en\/wp-json\/wp\/v2\/pages\/10706\/revisions"}],"predecessor-version":[{"id":12942,"href":"https:\/\/tutustudio.es\/en\/wp-json\/wp\/v2\/pages\/10706\/revisions\/12942"}],"wp:attachment":[{"href":"https:\/\/tutustudio.es\/en\/wp-json\/wp\/v2\/media?parent=10706"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}