{"id":7343,"date":"2025-11-14T16:09:28","date_gmt":"2025-11-14T16:09:28","guid":{"rendered":"https:\/\/torofirenze.com\/home\/?page_id=7343"},"modified":"2025-11-14T16:46:11","modified_gmt":"2025-11-14T16:46:11","slug":"reviews","status":"publish","type":"page","link":"https:\/\/torofirenze.com\/home\/reviews\/","title":{"rendered":"Reviews"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"7343\" class=\"elementor elementor-7343\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-55d05cf e-con-full e-flex wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no e-con e-parent\" data-id=\"55d05cf\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-767b9e9 elementor-widget elementor-widget-html\" data-id=\"767b9e9\" 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<!-- TORO FIRENZE \u2013 REVIEW WIDGET (PHOTO \/ VIDEO) -->\n<div id=\"tf-review\" class=\"tf-review-wrap\"\n     data-rest=\"https:\/\/torofirenze.com\/home\/wp-json\/tf\/v1\/review\"\n     aria-live=\"polite\">\n\n  <div class=\"tf-review-card\">\n    <h2 class=\"tf-review-title\">Share your Toro Firenze experience<\/h2>\n    <p class=\"tf-review-sub\">\n      Tell us about your piece and help other clients discover our handcrafted leather goods.\n    <\/p>\n\n    <form id=\"tf-review-form\" class=\"tf-review-form\" novalidate enctype=\"multipart\/form-data\">\n      <div class=\"tf-row tf-row-half\">\n        <label>\n          <span>Name *<\/span>\n          <input type=\"text\" name=\"name\" required autocomplete=\"name\" placeholder=\"Your full name\">\n        <\/label>\n        <label>\n          <span>Email *<\/span>\n          <input type=\"email\"\n                 name=\"email\"\n                 id=\"tf-review-email\"\n                 required\n                 autocomplete=\"email\"\n                 inputmode=\"email\"\n                 placeholder=\"your@email.com\">\n        <\/label>\n      <\/div>\n\n      <div class=\"tf-row tf-row-half\">\n        <label>\n          <span>Product<\/span>\n          <input type=\"text\" name=\"product\" placeholder=\"Bag, jacket, wallet\u2026\">\n        <\/label>\n        <!-- Rating -->\n        <div class=\"tf-rating-block\">\n          <span class=\"tf-rating-label\">Rating *<\/span>\n          <div class=\"tf-rating-stars\" id=\"tf-rating-stars\" aria-label=\"Rating from 1 to 5 stars\">\n            <button type=\"button\" class=\"tf-star\" data-value=\"1\">\u2605<\/button>\n            <button type=\"button\" class=\"tf-star\" data-value=\"2\">\u2605<\/button>\n            <button type=\"button\" class=\"tf-star\" data-value=\"3\">\u2605<\/button>\n            <button type=\"button\" class=\"tf-star\" data-value=\"4\">\u2605<\/button>\n            <button type=\"button\" class=\"tf-star\" data-value=\"5\">\u2605<\/button>\n          <\/div>\n          <input type=\"hidden\" name=\"rating\" id=\"tf-rating-value\" value=\"\">\n        <\/div>\n      <\/div>\n\n      <div class=\"tf-row\">\n        <label>\n          <span>Your review *<\/span>\n          <textarea name=\"message\" rows=\"5\" required placeholder=\"Tell us how the leather feels, how you use the piece, and why you chose Toro Firenze.\"><\/textarea>\n        <\/label>\n      <\/div>\n\n      <div class=\"tf-row tf-row-half\">\n        <label>\n          <span>Photo (optional)<\/span>\n          <input type=\"file\" name=\"photo\" accept=\"image\/*\">\n        <\/label>\n        <label>\n          <span>Video (optional)<\/span>\n          <input type=\"file\" name=\"video\" accept=\"video\/*\">\n        <\/label>\n      <\/div>\n\n      <div class=\"tf-review-consent\">\n        By submitting, you agree that your review and media may be used on Toro Firenze channels after moderation.\n      <\/div>\n\n      <button type=\"submit\" class=\"tf-btn tf-btn-primary\" id=\"tf-review-send\" disabled>\n        Submit review\n      <\/button>\n\n      <div class=\"tf-msg\" id=\"tf-review-msg\" role=\"status\" aria-live=\"polite\"><\/div>\n    <\/form>\n  <\/div>\n<\/div>\n\n<style>\n  .tf-review-wrap{\n    --gold:#d4af37; --gold-2:#f5d66b; --bg:#050505; --fg:#ffffff; --muted:#cfcfcf;\n    max-width:760px;\n    margin:0 auto;\n    padding:8px;\n  }\n  .tf-review-card{\n    padding: clamp(20px, 3vw, 32px);\n    border-radius:20px;\n    background:\n      radial-gradient(1200px 200px at 50% -10%, rgba(212,175,55,.16), transparent 60%),\n      radial-gradient(900px 200px at 50% 120%, rgba(212,175,55,.10), transparent 60%),\n      #050505;\n    border:1px solid #222;\n    box-shadow:0 20px 60px rgba(0,0,0,.55);\n    color:var(--fg);\n  }\n  .tf-review-title{\n    margin:0 0 6px;\n    font-size: clamp(22px, 3vw, 32px);\n    font-weight:700;\n    letter-spacing:-.01em;\n  }\n  .tf-review-sub{\n    margin:0 0 18px;\n    font-size:14px;\n    color:var(--muted);\n  }\n\n  .tf-review-form{\n    display:grid;\n    gap:12px;\n  }\n\n  .tf-row{\n    width:100%;\n  }\n  .tf-row-half{\n    display:grid;\n    grid-template-columns:1fr 1fr;\n    gap:10px;\n  }\n  @media (max-width:600px){\n    .tf-row-half{ grid-template-columns:1fr; }\n  }\n\n  .tf-row label{\n    display:block;\n    text-align:left;\n    font-size:12px;\n    letter-spacing:.08em;\n    text-transform:uppercase;\n    color:#bdbdbd;\n  }\n  .tf-row label span{\n    display:block;\n    margin-bottom:4px;\n  }\n  .tf-row input,\n  .tf-row textarea{\n    width:100%;\n    padding:10px 12px;\n    border-radius:12px;\n    border:1px solid rgba(255,255,255,.14);\n    background:rgba(10,10,10,.9);\n    color:#fff;\n    outline:none;\n    font-size:13px;\n    font-family:inherit;\n    resize:vertical;\n  }\n  .tf-row input::placeholder,\n  .tf-row textarea::placeholder{\n    color:#777;\n  }\n  .tf-row input:focus,\n  .tf-row textarea:focus{\n    border-color:var(--gold);\n    box-shadow:0 0 0 1px rgba(212,175,55,.4);\n  }\n\n  .tf-review-consent{\n    font-size:11px;\n    color:#bdbdbd;\n    text-align:left;\n    margin-top:4px;\n  }\n\n  .tf-btn{\n    display:inline-flex;\n    align-items:center;\n    justify-content:center;\n    border-radius:999px;\n    padding:11px 22px;\n    font-weight:600;\n    text-decoration:none;\n    transition:transform .15s ease, box-shadow .15s ease, background .15s ease;\n    border:1px solid rgba(255,255,255,.16);\n    color:#111;\n    cursor:pointer;\n    margin-top:6px;\n  }\n  .tf-btn-primary{\n    background:linear-gradient(90deg,var(--gold),var(--gold-2));\n    border-color:transparent;\n    box-shadow:0 10px 24px rgba(212,175,55,.32);\n  }\n  .tf-btn:hover{\n    transform:translateY(-1px);\n  }\n  button[disabled]{\n    opacity:.6;\n    cursor:not-allowed;\n    box-shadow:none;\n  }\n\n  .tf-msg{\n    margin-top:6px;\n    font-size:13px;\n    color:#cfcfcf;\n  }\n  .tf-msg.ok{\n    color:#83f28f;\n  }\n  .tf-msg.err{\n    color:#ff9d9d;\n  }\n\n  .tf-row input.invalid{\n    border-color:#ff7a7a;\n    box-shadow:0 0 0 3px rgba(255,122,122,.15);\n  }\n\n  \/* estrelas de rating *\/\n  .tf-rating-block{\n    text-align:left;\n    display:flex;\n    flex-direction:column;\n    gap:4px;\n  }\n  .tf-rating-label{\n    font-size:12px;\n    letter-spacing:.08em;\n    text-transform:uppercase;\n    color:#bdbdbd;\n  }\n  .tf-rating-stars{\n    display:inline-flex;\n    gap:4px;\n  }\n  .tf-rating-stars .tf-star{\n    border:none;\n    background:transparent;\n    padding:4px 6px;\n    font-size:20px;\n    cursor:pointer;\n    color:#555;\n    transition:transform .12s ease, color .12s ease, text-shadow .12s ease;\n  }\n  .tf-rating-stars .tf-star.active{\n    color:#f5d66b;\n    text-shadow:0 0 10px rgba(245,214,107,.6);\n    transform:translateY(-1px);\n  }\n\n<\/style>\n\n<script>\n(function(){\n  'use strict';\n\n  var root = document.getElementById('tf-review') || document.querySelector('.tf-review-wrap');\n  if (!root) return;\n\n  var form         = root.querySelector('#tf-review-form');\n  var msg          = root.querySelector('#tf-review-msg');\n  var btn          = root.querySelector('#tf-review-send');\n  var emailInput   = root.querySelector('#tf-review-email');\n  var nameInput    = root.querySelector('input[name=\"name\"]');\n  var messageInput = root.querySelector('textarea[name=\"message\"]');\n  var ratingInput  = root.querySelector('#tf-rating-value');\n  var starsWrap    = root.querySelector('#tf-rating-stars');\n\n  function isValidEmail(v){\n  return \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$\/.test(String(v || '').trim());\n}\n\n\n  function updateRatingUI(value){\n    if (!starsWrap) return;\n    var stars = starsWrap.querySelectorAll('.tf-star');\n    stars.forEach(function(btn){\n      var v = parseInt(btn.getAttribute('data-value'), 10);\n      if (v <= value) btn.classList.add('active');\n      else btn.classList.remove('active');\n    });\n  }\n\n  if (starsWrap && ratingInput){\n    starsWrap.addEventListener('click', function(e){\n      var btnStar = e.target.closest('.tf-star');\n      if (!btnStar) return;\n      var val = parseInt(btnStar.getAttribute('data-value'), 10) || 0;\n      ratingInput.value = val;\n      updateRatingUI(val);\n      updateButtonState();\n    });\n  }\n\n  function updateButtonState(){\n    if (!btn || !nameInput || !emailInput || !messageInput || !ratingInput) return;\n    var nameOk   = (nameInput.value || '').trim().length > 1;\n    var emailOk  = isValidEmail(emailInput.value);\n    var msgText  = (messageInput.value || '').trim();\n    var messageOk = msgText.length >= 20;\n    var ratingOk = parseInt(ratingInput.value, 10) >= 1;\n\n    btn.disabled = !(nameOk && emailOk && messageOk && ratingOk);\n\n    if (emailInput.value.length === 0){\n      emailInput.classList.remove('invalid');\n    } else if (!emailOk){\n      emailInput.classList.add('invalid');\n    } else {\n      emailInput.classList.remove('invalid');\n    }\n  }\n\n  if (nameInput)    nameInput.addEventListener('input', updateButtonState);\n  if (emailInput)   emailInput.addEventListener('input', updateButtonState);\n  if (messageInput) messageInput.addEventListener('input', updateButtonState);\n\n  updateButtonState();\n\n  function postMultipart(url, formData){\n    return fetch(url, {\n      method:'POST',\n      body: formData,\n      credentials:'same-origin',\n      headers:{\n        'Accept':'application\/json'\n        \/\/ N\u00c3O colocar Content-Type aqui, o browser define o boundary do multipart\n      }\n    }).then(function(res){\n      return res.text().then(function(text){\n        var data = null;\n        try{ data = JSON.parse(text); }catch(e){}\n        return { ok: res.ok && data && data.success, raw:text, data:data };\n      });\n    });\n  }\n\n  if (form && btn && msg){\n    form.addEventListener('submit', function(e){\n      e.preventDefault();\n      if (btn.disabled) return;\n\n      msg.className = 'tf-msg';\n      msg.textContent = '';\n      btn.disabled = true;\n      btn.textContent = 'Sending review...';\n\n      var fd = new FormData(form);\n\n      var origin = window.location.origin;\n      var restCandidates = [\n        root.getAttribute('data-rest') || (origin + '\/home\/wp-json\/tf\/v1\/review'),\n        origin + '\/wp-json\/tf\/v1\/review'\n      ];\n\n      (async function(){\n        try{\n          for (var i=0;i<restCandidates.length;i++){\n            var url = restCandidates[i];\n            var r = await postMultipart(url, fd);\n            if (r.ok){\n              msg.className = 'tf-msg ok';\n              msg.textContent = 'Thank you! Your review was received and will be published after moderation.';\n              form.reset();\n              updateRatingUI(0);\n              ratingInput.value = '';\n              updateButtonState();\n              btn.textContent = 'Submit review';\n              btn.disabled = false;\n              return;\n            }\n          }\n          throw new Error('No endpoint accepted the request');\n        }catch(err){\n          console.error('Review error:', err);\n          msg.className = 'tf-msg err';\n          msg.textContent = 'Couldn\u2019t send your review right now. Please try again in a moment.';\n        }finally{\n          if (msg.className !== 'tf-msg ok'){\n            btn.textContent = 'Submit review';\n            updateButtonState();\n          }\n        }\n      })();\n    });\n  }\n})();\n<\/script>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Share your Toro Firenze experience Tell us about your piece and help other clients discover our handcrafted leather goods. Name * Email * Product Rating * \u2605 \u2605 \u2605 \u2605 \u2605 Your review * Photo (optional) Video (optional) By submitting, you agree that your review and media may be used on Toro Firenze channels after moderation. Submit review<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"footnotes":""},"class_list":["post-7343","page","type-page","status-publish","hentry"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/torofirenze.com\/home\/wp-json\/wp\/v2\/pages\/7343","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/torofirenze.com\/home\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/torofirenze.com\/home\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/torofirenze.com\/home\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/torofirenze.com\/home\/wp-json\/wp\/v2\/comments?post=7343"}],"version-history":[{"count":9,"href":"https:\/\/torofirenze.com\/home\/wp-json\/wp\/v2\/pages\/7343\/revisions"}],"predecessor-version":[{"id":7370,"href":"https:\/\/torofirenze.com\/home\/wp-json\/wp\/v2\/pages\/7343\/revisions\/7370"}],"wp:attachment":[{"href":"https:\/\/torofirenze.com\/home\/wp-json\/wp\/v2\/media?parent=7343"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}