{"id":30,"date":"2026-06-09T16:37:27","date_gmt":"2026-06-09T16:37:27","guid":{"rendered":"https:\/\/panaderasinculpa.online\/?page_id=30"},"modified":"2026-06-09T18:21:45","modified_gmt":"2026-06-09T18:21:45","slug":"elementor-30","status":"publish","type":"page","link":"https:\/\/panaderasinculpa.online\/?page_id=30","title":{"rendered":"Elementor #30"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"30\" class=\"elementor elementor-30\" data-elementor-post-type=\"page\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-1d75533 elementor-section-full_width elementor-section-height-default elementor-section-height-default\" data-id=\"1d75533\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-no\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b632814\" data-id=\"b632814\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-946826e elementor-widget__width-inherit elementor-widget elementor-widget-html\" data-id=\"946826e\" 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\n<style>\n@import url('https:\/\/fonts.googleapis.com\/css2?family=Lobster&family=Montserrat:wght@400;500;600;700;800;900&display=swap');\n\n#panaderia-app {\n  --orange: #f29a00;\n  --green: #2fbe63;\n  --brown: #432915;\n  --brown2: #5b371d;\n  --cream: #fff8ec;\n  --cream2: #efd9a1;\n  --white: #ffffff;\n  --text: #24160d;\n  --muted: #7b6a5d;\n  --red: #d84332;\n  font-family: 'Montserrat', Arial, sans-serif;\n  background: #fff8ec;\n  color: var(--text);\n  min-height: 100vh;\n  padding: 0;\n  margin: 0;\n}\n\n#panaderia-app * {\n  box-sizing: border-box;\n}\n\n#panaderia-app img {\n  max-width: 100%;\n  display: block;\n}\n\n.pc-app-shell {\n  max-width: 1180px;\n  margin: 0 auto;\n  padding: 22px;\n}\n\n.pc-app-hero {\n  background:\n    linear-gradient(rgba(255, 248, 236, .92), rgba(255, 248, 236, .92)),\n    url(\"data:image\/svg+xml,%3Csvg width='260' height='260' viewBox='0 0 260 260' xmlns='http:\/\/www.w3.org\/2000\/svg'%3E%3Cg fill='none' stroke='%23d8ad83' stroke-width='2' opacity='.24'%3E%3Cellipse cx='55' cy='65' rx='35' ry='17'\/%3E%3Cpath d='M25 65c12-20 48-20 60 0M35 57c10 8 27 8 40 0'\/%3E%3Crect x='135' y='28' width='62' height='42' rx='18' transform='rotate(10 166 49)'\/%3E%3Cpath d='M145 45h42M145 58h38'\/%3E%3Cellipse cx='190' cy='160' rx='38' ry='18' transform='rotate(-18 190 160)'\/%3E%3Cpath d='M156 165c19-8 46-14 73-13M172 148c7 6 23 8 37 2'\/%3E%3Cpath d='M52 170c18-26 58-28 77-4M43 180h95M61 157c4 13 12 22 25 26M90 145c0 17 8 30 24 39'\/%3E%3C\/g%3E%3C\/svg%3E\");\n  background-size: 260px;\n  border-radius: 28px;\n  padding: 36px 26px;\n  margin-bottom: 24px;\n  box-shadow: 0 18px 45px rgba(67,41,21,.10);\n  overflow: hidden;\n  position: relative;\n}\n\n.pc-app-hero-with-photo {\n  display: grid;\n  grid-template-columns: 1.1fr .9fr;\n  align-items: center;\n  gap: 24px;\n  padding-bottom: 0;\n}\n\n.pc-app-hero-text {\n  padding-bottom: 32px;\n}\n\n.pc-app-hero-photo {\n  align-self: end;\n  display: flex;\n  justify-content: center;\n  align-items: flex-end;\n}\n\n.pc-app-hero-photo img {\n  width: 100%;\n  max-width: 430px;\n  object-fit: contain;\n  margin-bottom: -4px;\n  filter: drop-shadow(0 18px 28px rgba(67, 41, 21, .18));\n}\n\n.pc-app-logo {\n  font-family: 'Lobster', cursive;\n  color: var(--orange);\n  font-size: 42px;\n  line-height: 1;\n  margin: 0 0 12px;\n}\n\n.pc-app-hero h1 {\n  font-family: 'Lobster', cursive;\n  color: var(--brown);\n  font-size: clamp(34px, 6vw, 64px);\n  line-height: .95;\n  margin: 0 0 15px;\n  max-width: 820px;\n}\n\n.pc-app-hero p {\n  font-size: clamp(17px, 2.5vw, 23px);\n  line-height: 1.35;\n  font-weight: 600;\n  max-width: 740px;\n  color: var(--brown2);\n  margin: 0 0 22px;\n}\n\n.pc-app-stats {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 10px;\n}\n\n.pc-stat {\n  background: var(--brown);\n  color: #fff;\n  border-radius: 999px;\n  padding: 10px 15px;\n  font-size: 14px;\n  font-weight: 800;\n}\n\n.pc-tabs {\n  display: flex;\n  gap: 10px;\n  overflow-x: auto;\n  padding: 4px 0 18px;\n  margin-bottom: 8px;\n}\n\n.pc-tab {\n  border: 0;\n  background: #fff;\n  color: var(--brown);\n  border-radius: 999px;\n  padding: 13px 18px;\n  font-weight: 900;\n  cursor: pointer;\n  white-space: nowrap;\n  box-shadow: 0 8px 20px rgba(67,41,21,.10);\n  font-family: 'Montserrat', Arial, sans-serif;\n}\n\n.pc-tab.active {\n  background: var(--orange);\n  color: #fff;\n}\n\n.pc-layout {\n  display: grid;\n  grid-template-columns: 300px 1fr;\n  gap: 22px;\n  align-items: start;\n}\n\n.pc-sidebar {\n  background: #fff;\n  border-radius: 24px;\n  padding: 20px;\n  box-shadow: 0 14px 35px rgba(67,41,21,.10);\n  position: sticky;\n  top: 14px;\n}\n\n.pc-side-title {\n  font-family: 'Lobster', cursive;\n  color: var(--orange);\n  font-size: 30px;\n  margin: 0 0 15px;\n}\n\n.pc-field {\n  margin-bottom: 17px;\n}\n\n.pc-field label {\n  display: block;\n  font-size: 13px;\n  font-weight: 900;\n  color: var(--brown);\n  margin-bottom: 8px;\n  text-transform: uppercase;\n}\n\n.pc-field input,\n.pc-field select {\n  width: 100%;\n  border: 2px solid #efdfc8;\n  background: #fffaf2;\n  border-radius: 14px;\n  padding: 13px 12px;\n  font-family: 'Montserrat', Arial, sans-serif;\n  font-size: 15px;\n  outline: none;\n}\n\n.pc-field input:focus,\n.pc-field select:focus {\n  border-color: var(--orange);\n}\n\n.pc-chip-list {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 8px;\n}\n\n.pc-chip {\n  border: 1px solid #efd6ad;\n  background: #fffaf2;\n  color: var(--brown);\n  border-radius: 999px;\n  padding: 8px 11px;\n  font-size: 12px;\n  font-weight: 800;\n  cursor: pointer;\n  font-family: 'Montserrat', Arial, sans-serif;\n}\n\n.pc-chip.active {\n  background: var(--brown);\n  color: #fff;\n  border-color: var(--brown);\n}\n\n.pc-clear {\n  width: 100%;\n  border: 0;\n  background: #f1e1c5;\n  color: var(--brown);\n  border-radius: 14px;\n  padding: 13px 12px;\n  font-weight: 900;\n  cursor: pointer;\n  font-family: 'Montserrat', Arial, sans-serif;\n}\n\n.pc-content-head {\n  display: flex;\n  justify-content: space-between;\n  gap: 14px;\n  align-items: center;\n  margin-bottom: 16px;\n}\n\n.pc-content-title {\n  font-family: 'Lobster', cursive;\n  color: var(--brown);\n  font-size: 36px;\n  margin: 0;\n}\n\n.pc-result-count {\n  background: #fff;\n  border-radius: 999px;\n  padding: 10px 14px;\n  font-weight: 900;\n  color: var(--brown);\n  box-shadow: 0 8px 20px rgba(67,41,21,.08);\n}\n\n.pc-recipes-grid {\n  display: grid;\n  grid-template-columns: repeat(3, minmax(0,1fr));\n  gap: 18px;\n}\n\n.pc-recipe-card {\n  background: #fff;\n  border-radius: 24px;\n  overflow: hidden;\n  box-shadow: 0 16px 35px rgba(67,41,21,.11);\n  transition: transform .16s ease;\n  display: flex;\n  flex-direction: column;\n}\n\n.pc-recipe-card:hover {\n  transform: translateY(-3px);\n}\n\n.pc-card-img {\n  height: 190px;\n  background: #ead5ad;\n  position: relative;\n  overflow: hidden;\n}\n\n.pc-card-img img {\n  width: 100%;\n  height: 100%;\n  object-fit: cover;\n}\n\n.pc-fav {\n  position: absolute;\n  right: 12px;\n  top: 12px;\n  width: 42px;\n  height: 42px;\n  border: 0;\n  border-radius: 50%;\n  background: rgba(255,255,255,.92);\n  color: var(--red);\n  font-size: 22px;\n  cursor: pointer;\n  box-shadow: 0 6px 15px rgba(0,0,0,.15);\n}\n\n.pc-card-body2 {\n  padding: 17px;\n  display: flex;\n  flex-direction: column;\n  flex: 1;\n}\n\n.pc-badge {\n  display: inline-block;\n  width: fit-content;\n  background: #fff1d2;\n  color: var(--orange);\n  border-radius: 999px;\n  padding: 6px 10px;\n  font-size: 11px;\n  font-weight: 900;\n  margin-bottom: 10px;\n}\n\n.pc-recipe-card h3 {\n  margin: 0 0 10px;\n  color: var(--brown);\n  font-size: 19px;\n  line-height: 1.12;\n  font-weight: 900;\n}\n\n.pc-recipe-card p {\n  color: var(--muted);\n  font-size: 13px;\n  line-height: 1.35;\n  margin: 0 0 12px;\n}\n\n.pc-meta {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 7px;\n  margin-top: auto;\n  margin-bottom: 14px;\n}\n\n.pc-meta span {\n  background: #fff8ec;\n  border-radius: 10px;\n  padding: 8px;\n  font-size: 12px;\n  font-weight: 800;\n  color: var(--brown2);\n}\n\n.pc-open {\n  border: 0;\n  background: var(--green);\n  color: #fff;\n  border-radius: 14px;\n  padding: 13px 12px;\n  font-weight: 900;\n  cursor: pointer;\n  font-family: 'Montserrat', Arial, sans-serif;\n  font-size: 15px;\n}\n\n.pc-empty {\n  background: #fff;\n  padding: 34px;\n  border-radius: 24px;\n  text-align: center;\n  box-shadow: 0 14px 35px rgba(67,41,21,.10);\n}\n\n.pc-empty h3 {\n  font-family: 'Lobster', cursive;\n  color: var(--orange);\n  font-size: 34px;\n  margin: 0 0 10px;\n}\n\n.pc-shopping {\n  background: #fff;\n  border-radius: 24px;\n  padding: 22px;\n  box-shadow: 0 14px 35px rgba(67,41,21,.10);\n}\n\n.pc-shopping h2 {\n  font-family: 'Lobster', cursive;\n  color: var(--orange);\n  font-size: 38px;\n  margin: 0 0 10px;\n}\n\n.pc-shopping-actions {\n  display: flex;\n  gap: 10px;\n  margin: 16px 0 20px;\n  flex-wrap: wrap;\n}\n\n.pc-action-btn {\n  border: 0;\n  background: var(--brown);\n  color: #fff;\n  border-radius: 13px;\n  padding: 12px 14px;\n  font-weight: 900;\n  cursor: pointer;\n  font-family: 'Montserrat', Arial, sans-serif;\n}\n\n.pc-action-btn.light {\n  background: #f1e1c5;\n  color: var(--brown);\n}\n\n.pc-shopping-list {\n  display: grid;\n  grid-template-columns: repeat(2, minmax(0,1fr));\n  gap: 12px;\n}\n\n.pc-shop-item {\n  background: #fff8ec;\n  border-radius: 14px;\n  padding: 13px;\n  display: flex;\n  gap: 10px;\n  align-items: flex-start;\n  font-weight: 700;\n}\n\n.pc-shop-item input {\n  margin-top: 3px;\n}\n\n.pc-shop-item.done span {\n  text-decoration: line-through;\n  color: #999;\n}\n\n.pc-modal-backdrop {\n  position: fixed;\n  inset: 0;\n  background: rgba(20,10,4,.74);\n  z-index: 99999;\n  display: none;\n  align-items: center;\n  justify-content: center;\n  padding: 18px;\n}\n\n.pc-modal-backdrop.show {\n  display: flex;\n}\n\n.pc-modal {\n  width: min(980px, 100%);\n  max-height: 92vh;\n  overflow: auto;\n  background: #fff8ec;\n  border-radius: 26px;\n  position: relative;\n  box-shadow: 0 30px 80px rgba(0,0,0,.40);\n}\n\n.pc-modal-close {\n  position: sticky;\n  top: 12px;\n  margin-left: auto;\n  right: 12px;\n  display: block;\n  z-index: 2;\n  width: 44px;\n  height: 44px;\n  border: 0;\n  border-radius: 50%;\n  background: var(--brown);\n  color: #fff;\n  font-size: 24px;\n  cursor: pointer;\n}\n\n.pc-modal-hero {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 0;\n  background: #fff;\n}\n\n.pc-modal-hero img {\n  width: 100%;\n  height: 100%;\n  min-height: 360px;\n  object-fit: cover;\n}\n\n.pc-modal-info {\n  padding: 30px;\n}\n\n.pc-modal-info h2 {\n  font-family: 'Lobster', cursive;\n  color: var(--orange);\n  font-size: 44px;\n  line-height: .96;\n  margin: 0 0 14px;\n}\n\n.pc-modal-info p {\n  font-size: 16px;\n  line-height: 1.48;\n  color: var(--brown2);\n  margin: 0 0 18px;\n  font-weight: 600;\n}\n\n.pc-modal-tags {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 8px;\n  margin-bottom: 18px;\n}\n\n.pc-modal-tags span {\n  background: #fff1d2;\n  color: var(--brown);\n  border-radius: 999px;\n  padding: 7px 11px;\n  font-size: 12px;\n  font-weight: 900;\n}\n\n.pc-modal-meta {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 9px;\n}\n\n.pc-modal-meta div {\n  background: #fff8ec;\n  border-radius: 13px;\n  padding: 12px;\n  font-size: 13px;\n  font-weight: 900;\n  color: var(--brown);\n}\n\n.pc-recipe-detail {\n  padding: 28px;\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 22px;\n}\n\n.pc-detail-box {\n  background: #fff;\n  border-radius: 20px;\n  padding: 22px;\n  box-shadow: 0 12px 28px rgba(67,41,21,.08);\n}\n\n.pc-detail-box h3 {\n  font-family: 'Lobster', cursive;\n  color: var(--brown);\n  font-size: 31px;\n  margin: 0 0 14px;\n}\n\n.pc-ingredient-item {\n  display: flex;\n  gap: 10px;\n  margin: 10px 0;\n  line-height: 1.35;\n  font-weight: 600;\n}\n\n.pc-steps {\n  margin: 0;\n  padding-left: 20px;\n}\n\n.pc-steps li {\n  margin-bottom: 12px;\n  line-height: 1.5;\n  font-weight: 600;\n}\n\n.pc-note {\n  grid-column: 1 \/ -1;\n  background: var(--brown);\n  color: #fff;\n  border-radius: 20px;\n  padding: 22px;\n  line-height: 1.45;\n  font-weight: 600;\n}\n\n.pc-note strong {\n  color: var(--orange);\n}\n\n.pc-modal-actions {\n  display: flex;\n  gap: 10px;\n  padding: 0 28px 28px;\n  flex-wrap: wrap;\n}\n\n.pc-modal-actions button {\n  border: 0;\n  border-radius: 14px;\n  padding: 14px 16px;\n  font-weight: 900;\n  cursor: pointer;\n  font-family: 'Montserrat', Arial, sans-serif;\n}\n\n.pc-modal-actions .green {\n  background: var(--green);\n  color: #fff;\n}\n\n.pc-modal-actions .orange {\n  background: var(--orange);\n  color: #fff;\n}\n\n.pc-modal-actions .brown {\n  background: var(--brown);\n  color: #fff;\n}\n\n@media (max-width: 980px) {\n  .pc-layout {\n    grid-template-columns: 1fr;\n  }\n\n  .pc-sidebar {\n    position: static;\n  }\n\n  .pc-recipes-grid {\n    grid-template-columns: repeat(2, minmax(0,1fr));\n  }\n}\n\n@media (max-width: 760px) {\n  .pc-app-hero-with-photo {\n    grid-template-columns: 1fr;\n    gap: 12px;\n    padding-bottom: 0;\n  }\n\n  .pc-app-hero-text {\n    padding-bottom: 0;\n  }\n\n  .pc-app-hero-photo img {\n    max-width: 360px;\n    margin: 0 auto -4px;\n  }\n}\n\n@media (max-width: 640px) {\n  .pc-app-shell {\n    padding: 12px;\n  }\n\n  .pc-app-hero {\n    padding: 26px 20px 0;\n    border-radius: 20px;\n  }\n\n  .pc-app-logo {\n    font-size: 34px;\n  }\n\n  .pc-tabs {\n    padding-bottom: 12px;\n  }\n\n  .pc-content-head {\n    display: block;\n  }\n\n  .pc-result-count {\n    display: inline-block;\n    margin-top: 8px;\n  }\n\n  .pc-recipes-grid {\n    grid-template-columns: 1fr;\n  }\n\n  .pc-shopping-list {\n    grid-template-columns: 1fr;\n  }\n\n  .pc-modal-hero {\n    grid-template-columns: 1fr;\n  }\n\n  .pc-modal-hero img {\n    min-height: 240px;\n  }\n\n  .pc-modal-info {\n    padding: 22px;\n  }\n\n  .pc-modal-info h2 {\n    font-size: 36px;\n  }\n\n  .pc-recipe-detail {\n    grid-template-columns: 1fr;\n    padding: 18px;\n  }\n\n  .pc-note {\n    grid-column: auto;\n  }\n\n  .pc-modal-actions {\n    padding: 0 18px 22px;\n  }\n\n  .pc-modal-actions button {\n    width: 100%;\n  }\n}\n\n\n\/* =====================================================\n   HERO CORRIGIDO - CHEF AO LADO, SEM CORTAR TEXTO\n   ===================================================== *\/\n.pc-app-hero {\n  background:\n    linear-gradient(rgba(255, 248, 236, .94), rgba(255, 248, 236, .94)),\n    url(\"data:image\/svg+xml,%3Csvg width='260' height='260' viewBox='0 0 260 260' xmlns='http:\/\/www.w3.org\/2000\/svg'%3E%3Cg fill='none' stroke='%23d8ad83' stroke-width='2' opacity='.24'%3E%3Cellipse cx='55' cy='65' rx='35' ry='17'\/%3E%3Cpath d='M25 65c12-20 48-20 60 0M35 57c10 8 27 8 40 0'\/%3E%3Crect x='135' y='28' width='62' height='42' rx='18' transform='rotate(10 166 49)'\/%3E%3Cpath d='M145 45h42M145 58h38'\/%3E%3Cellipse cx='190' cy='160' rx='38' ry='18' transform='rotate(-18 190 160)'\/%3E%3Cpath d='M156 165c19-8 46-14 73-13M172 148c7 6 23 8 37 2'\/%3E%3Cpath d='M52 170c18-26 58-28 77-4M43 180h95M61 157c4 13 12 22 25 26M90 145c0 17 8 30 24 39'\/%3E%3C\/g%3E%3C\/svg%3E\");\n  background-size: 260px;\n  border-radius: 28px;\n  margin-bottom: 24px;\n  box-shadow: 0 18px 45px rgba(67,41,21,.10);\n  overflow: hidden;\n  position: relative;\n  padding: 0;\n}\n\n.pc-app-hero-with-photo {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr) 360px;\n  align-items: stretch;\n  gap: 0;\n  min-height: 430px;\n  padding: 0;\n}\n\n.pc-app-hero-text {\n  padding: 42px 26px 42px 34px;\n  position: relative;\n  z-index: 3;\n  min-width: 0;\n}\n\n.pc-app-logo {\n  font-family: 'Lobster', cursive;\n  color: var(--orange);\n  font-size: 42px;\n  line-height: 1;\n  margin: 0 0 14px;\n}\n\n.pc-app-hero h1 {\n  font-family: 'Lobster', cursive;\n  color: var(--brown);\n  font-size: clamp(38px, 5vw, 62px);\n  line-height: .94;\n  margin: 0 0 18px;\n  max-width: 620px;\n}\n\n.pc-app-hero p {\n  font-size: clamp(18px, 2.2vw, 24px);\n  line-height: 1.28;\n  font-weight: 700;\n  max-width: 610px;\n  color: var(--brown2);\n  margin: 0 0 26px;\n}\n\n.pc-app-stats {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 10px;\n  max-width: 560px;\n}\n\n.pc-stat {\n  background: var(--brown);\n  color: #fff;\n  border-radius: 999px;\n  padding: 11px 18px;\n  font-size: 14px;\n  font-weight: 900;\n}\n\n.pc-app-hero-photo {\n  position: relative;\n  min-height: 430px;\n  display: flex;\n  align-items: flex-end;\n  justify-content: center;\n  background: radial-gradient(circle at 50% 62%, rgba(242,154,0,.22) 0%, rgba(242,154,0,.12) 35%, transparent 66%);\n  z-index: 2;\n}\n\n.pc-app-hero-photo:before {\n  content: \"\";\n  position: absolute;\n  width: 315px;\n  height: 315px;\n  border-radius: 50%;\n  background: rgba(242,154,0,.16);\n  right: 6px;\n  bottom: 32px;\n}\n\n.pc-app-hero-photo:after {\n  content: \"Chef Natasha\";\n  position: absolute;\n  left: -24px;\n  bottom: 38px;\n  background: #ffffff;\n  color: var(--brown);\n  padding: 11px 15px;\n  border-radius: 999px;\n  font-size: 13px;\n  font-weight: 900;\n  box-shadow: 0 12px 30px rgba(67,41,21,.15);\n  z-index: 4;\n}\n\n.pc-app-hero-photo img {\n  position: relative;\n  z-index: 2;\n  width: 100%;\n  max-width: 355px;\n  height: 410px;\n  object-fit: cover;\n  object-position: center top;\n  border-radius: 180px 180px 0 0;\n  box-shadow: 0 18px 35px rgba(67,41,21,.18);\n  margin: 0;\n}\n\n@media (max-width: 900px) {\n  .pc-app-hero-with-photo {\n    grid-template-columns: minmax(0, 1fr) 290px;\n  }\n\n  .pc-app-hero-text {\n    padding: 34px 18px 34px 28px;\n  }\n\n  .pc-app-hero-photo img {\n    max-width: 285px;\n    height: 380px;\n  }\n}\n\n@media (max-width: 640px) {\n  .pc-app-hero {\n    border-radius: 24px;\n    margin-bottom: 18px;\n    padding: 0;\n  }\n\n  .pc-app-hero-with-photo {\n    display: block;\n    min-height: 0;\n    padding: 0;\n    position: relative;\n    overflow: hidden;\n  }\n\n  .pc-app-hero-with-photo:after {\n    content: \"\";\n    position: absolute;\n    top: 0;\n    left: 47%;\n    width: 25%;\n    height: 100%;\n    z-index: 1;\n    background: linear-gradient(90deg, rgba(255,248,236,1) 0%, rgba(255,248,236,.94) 38%, rgba(255,248,236,0) 100%);\n    pointer-events: none;\n  }\n\n  .pc-app-hero-text {\n    position: relative;\n    z-index: 3;\n    padding: 26px 18px 22px;\n    min-height: 570px;\n    width: 54%;\n  }\n\n  .pc-app-logo {\n    font-size: 32px;\n    line-height: .95;\n    margin-bottom: 12px;\n    white-space: nowrap;\n  }\n\n  .pc-app-hero h1 {\n    font-size: 31px;\n    line-height: .94;\n    max-width: 100%;\n    margin-bottom: 13px;\n  }\n\n  .pc-app-hero p {\n    font-size: 15px;\n    line-height: 1.23;\n    max-width: 100%;\n    margin-bottom: 16px;\n    font-weight: 800;\n  }\n\n  .pc-app-stats {\n    max-width: 100%;\n    display: flex;\n    flex-direction: column;\n    align-items: flex-start;\n    gap: 8px;\n  }\n\n  .pc-stat {\n    font-size: 11px;\n    line-height: 1;\n    padding: 10px 12px;\n    white-space: nowrap;\n    border-radius: 999px;\n  }\n\n  .pc-app-hero-photo {\n    position: absolute;\n    right: -13px;\n    bottom: 0;\n    width: 54%;\n    height: 100%;\n    min-height: 0;\n    background: none;\n    pointer-events: none;\n    z-index: 2;\n  }\n\n  .pc-app-hero-photo:before {\n    width: 220px;\n    height: 220px;\n    right: -26px;\n    bottom: 112px;\n    background: rgba(242,154,0,.16);\n  }\n\n  .pc-app-hero-photo:after {\n    display: none;\n  }\n\n  .pc-app-hero-photo img {\n    position: absolute;\n    right: 0;\n    bottom: 0;\n    width: 100%;\n    max-width: none;\n    height: 510px;\n    object-fit: cover;\n    object-position: center top;\n    border-radius: 145px 145px 0 0;\n    box-shadow: -8px 18px 32px rgba(67,41,21,.18);\n  }\n}\n\n@media (max-width: 390px) {\n  .pc-app-hero-text {\n    width: 56%;\n    min-height: 555px;\n    padding: 24px 15px 20px;\n  }\n\n  .pc-app-logo {\n    font-size: 29px;\n  }\n\n  .pc-app-hero h1 {\n    font-size: 28px;\n    line-height: .94;\n  }\n\n  .pc-app-hero p {\n    font-size: 14px;\n    line-height: 1.22;\n  }\n\n  .pc-stat {\n    font-size: 10.5px;\n    padding: 9px 10px;\n  }\n\n  .pc-app-hero-photo {\n    right: -20px;\n    width: 52%;\n  }\n\n  .pc-app-hero-photo img {\n    height: 500px;\n  }\n}\n\n@media (min-width: 400px) and (max-width: 640px) {\n  .pc-app-hero-text {\n    width: 53%;\n  }\n\n  .pc-app-hero h1 {\n    font-size: 33px;\n  }\n\n  .pc-app-hero p {\n    font-size: 15.5px;\n  }\n\n  .pc-app-hero-photo {\n    right: -10px;\n    width: 53%;\n  }\n}\n\n<\/style>\n\n<div id=\"panaderia-app\">\n  <div class=\"pc-app-shell\">\n<section class=\"pc-app-hero pc-app-hero-with-photo\">\n  <div class=\"pc-app-hero-text\">\n    <div class=\"pc-app-logo\">Panader\u00eda Cero<\/div>\n\n    <h1>Recetas dulces y saladas sin az\u00facar a\u00f1adida<\/h1>\n\n    <p>\n      Panes, tortas, masas y postres para cocinar rico, simple y m\u00e1s consciente,\n      sin harinas refinadas y sin renunciar al sabor.\n    <\/p>\n\n    <div class=\"pc-app-stats\">\n      <span class=\"pc-stat\" id=\"statRecipes\">+30 recetas<\/span>\n      <span class=\"pc-stat\">Sin az\u00facar a\u00f1adida<\/span>\n      <span class=\"pc-stat\">Sin harinas refinadas<\/span>\n      <span class=\"pc-stat\">Lista de compras<\/span>\n    <\/div>\n  <\/div>\n\n  <div class=\"pc-app-hero-photo\">\n    <img decoding=\"async\"\n      src=\"https:\/\/panaderasinculpa.online\/wp-content\/uploads\/2026\/06\/ChatGPT-Image-9-de-jun.-de-2026-11_36_50.webp\"\n      alt=\"Chef Panader\u00eda Cero\"\n    >\n  <\/div>\n<\/section>\n\n\n\n    <div class=\"pc-tabs\">\n      <button class=\"pc-tab active\" data-view=\"recipes\">Recetas<\/button>\n      <button class=\"pc-tab\" data-view=\"favorites\">Favoritos<\/button>\n      <button class=\"pc-tab\" data-view=\"shopping\">Lista de compras<\/button>\n    <\/div>\n\n    <div class=\"pc-layout\" id=\"recipesView\">\n      <aside class=\"pc-sidebar\">\n        <h2 class=\"pc-side-title\">Filtros<\/h2>\n\n        <div class=\"pc-field\">\n          <label>Buscar receta<\/label>\n          <input type=\"text\" id=\"searchInput\" placeholder=\"Pan, chocolate, almendras...\">\n        <\/div>\n\n        <div class=\"pc-field\">\n          <label>Categor\u00eda<\/label>\n          <select id=\"categoryFilter\">\n            <option value=\"all\">Todas<\/option>\n          <\/select>\n        <\/div>\n\n        <div class=\"pc-field\">\n          <label>Tiempo total<\/label>\n          <select id=\"timeFilter\">\n            <option value=\"all\">Todos<\/option>\n            <option value=\"15\">Hasta 15 minutos<\/option>\n            <option value=\"30\">Hasta 30 minutos<\/option>\n            <option value=\"45\">Hasta 45 minutos<\/option>\n            <option value=\"60\">Hasta 60 minutos<\/option>\n          <\/select>\n        <\/div>\n\n        <div class=\"pc-field\">\n          <label>Dificultad<\/label>\n          <select id=\"difficultyFilter\">\n            <option value=\"all\">Todas<\/option>\n            <option value=\"F\u00e1cil\">F\u00e1cil<\/option>\n            <option value=\"Media\">Media<\/option>\n            <option value=\"Avanzada\">Avanzada<\/option>\n          <\/select>\n        <\/div>\n\n        <div class=\"pc-field\">\n          <label>Filtrar por ingredientes<\/label>\n          <div class=\"pc-chip-list\" id=\"ingredientChips\"><\/div>\n        <\/div>\n\n        <button class=\"pc-clear\" id=\"clearFilters\">Limpiar filtros<\/button>\n      <\/aside>\n\n      <main>\n        <div class=\"pc-content-head\">\n          <h2 class=\"pc-content-title\">Recetario<\/h2>\n          <div class=\"pc-result-count\" id=\"resultCount\">0 recetas<\/div>\n        <\/div>\n\n        <div class=\"pc-recipes-grid\" id=\"recipesGrid\"><\/div>\n      <\/main>\n    <\/div>\n\n    <div id=\"favoritesView\" style=\"display:none;\">\n      <div class=\"pc-content-head\">\n        <h2 class=\"pc-content-title\">Favoritos<\/h2>\n        <div class=\"pc-result-count\" id=\"favCount\">0 favoritas<\/div>\n      <\/div>\n      <div class=\"pc-recipes-grid\" id=\"favoritesGrid\"><\/div>\n    <\/div>\n\n    <div id=\"shoppingView\" style=\"display:none;\">\n      <div class=\"pc-shopping\">\n        <h2>Lista de compras<\/h2>\n        <p class=\"pc-text\">Agrega ingredientes desde cada receta y marca lo que ya compraste.<\/p>\n        <div class=\"pc-shopping-actions\">\n          <button class=\"pc-action-btn light\" id=\"clearShopping\">Limpiar lista<\/button>\n          <button class=\"pc-action-btn\" id=\"copyShopping\">Copiar lista<\/button>\n        <\/div>\n        <div class=\"pc-shopping-list\" id=\"shoppingList\"><\/div>\n      <\/div>\n    <\/div>\n\n  <\/div>\n\n  <div class=\"pc-modal-backdrop\" id=\"recipeModal\">\n    <div class=\"pc-modal\">\n      <button class=\"pc-modal-close\" id=\"closeModal\">\u00d7<\/button>\n      <div id=\"modalContent\"><\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<script>\n(function(){\n  const recipes = [\n    {\n      id: 1,\n      title: \"Pan de almendras esponjoso\",\n      category: \"Panes\",\n      difficulty: \"F\u00e1cil\",\n      calories: 180,\n      prep: 10,\n      cook: 35,\n      servings: 10,\n      image: \"https:\/\/images.unsplash.com\/photo-1509440159596-0249088772ff?auto=format&fit=crop&w=900&q=80\",\n      description: \"Un pan suave, saciante y sin harina blanca, perfecto para desayunos o meriendas.\",\n      tags: [\"Sin az\u00facar a\u00f1adida\", \"Sin harina blanca\", \"Bajo en carbohidratos\"],\n      ingredients: [\"Harina de almendras\", \"Huevos\", \"Aceite de oliva\", \"Polvo de hornear\", \"Psyllium\", \"Sal\", \"Agua tibia\", \"Vinagre de manzana\"],\n      steps: [\n        \"Precalienta el horno a 180 \u00b0C.\",\n        \"Mezcla harina de almendras, polvo de hornear, psyllium y sal.\",\n        \"Bate los huevos con aceite de oliva y vinagre.\",\n        \"Une ambas mezclas y agrega agua tibia poco a poco.\",\n        \"Coloca la masa en un molde peque\u00f1o.\",\n        \"Hornea durante 35 minutos y deja enfriar antes de cortar.\"\n      ],\n      substitutions: [\"Puedes agregar semillas por encima.\", \"Puedes reemplazar harina de almendras por harina de nuez.\"]\n    },\n    {\n      id: 2,\n      title: \"Pan de linaza dorada\",\n      category: \"Panes\",\n      difficulty: \"F\u00e1cil\",\n      calories: 145,\n      prep: 8,\n      cook: 30,\n      servings: 8,\n      image: \"https:\/\/images.unsplash.com\/photo-1608198093002-ad4e005484ec?auto=format&fit=crop&w=900&q=80\",\n      description: \"Pan rico en fibra, con textura firme y sabor suave.\",\n      tags: [\"Alto en fibra\", \"Sin az\u00facar a\u00f1adida\", \"Apto para congelar\"],\n      ingredients: [\"Linaza molida\", \"Huevos\", \"Agua tibia\", \"Polvo de hornear\", \"Sal\", \"Aceite de oliva\"],\n      steps: [\n        \"Mezcla la linaza, polvo de hornear y sal.\",\n        \"A\u00f1ade huevos, agua y aceite.\",\n        \"Deja reposar 10 minutos.\",\n        \"Coloca en molde y hornea a 180 \u00b0C por 30 minutos.\"\n      ],\n      substitutions: [\"Puedes a\u00f1adir or\u00e9gano.\", \"Puedes usar semillas de s\u00e9samo.\"]\n    },\n    {\n      id: 3,\n      title: \"Pan r\u00e1pido en sart\u00e9n\",\n      category: \"Panes\",\n      difficulty: \"F\u00e1cil\",\n      calories: 120,\n      prep: 5,\n      cook: 8,\n      servings: 2,\n      image: \"https:\/\/images.unsplash.com\/photo-1558961363-fa8fdf82db35?auto=format&fit=crop&w=900&q=80\",\n      description: \"Una opci\u00f3n r\u00e1pida para preparar pan sin horno en pocos minutos.\",\n      tags: [\"15 minutos\", \"Sin horno\", \"R\u00e1pido\"],\n      ingredients: [\"Harina de avena integral\", \"Huevo\", \"Yogur natural sin az\u00facar\", \"Polvo de hornear\", \"Sal\"],\n      steps: [\n        \"Mezcla todos los ingredientes en un bowl.\",\n        \"Calienta una sart\u00e9n antiadherente.\",\n        \"Cocina la mezcla por ambos lados hasta dorar.\",\n        \"Sirve tibio.\"\n      ],\n      substitutions: [\"Puedes usar harina de almendras.\", \"Puedes a\u00f1adir semillas.\"]\n    },\n    {\n      id: 4,\n      title: \"Pan nube bajo en carbohidratos\",\n      category: \"Panes\",\n      difficulty: \"Media\",\n      calories: 95,\n      prep: 12,\n      cook: 20,\n      servings: 6,\n      image: \"https:\/\/images.unsplash.com\/photo-1612198790700-0ff08cb726e5?auto=format&fit=crop&w=900&q=80\",\n      description: \"Pan ligero, suave y sin harina refinada.\",\n      tags: [\"Bajo en carbohidratos\", \"Sin harina blanca\"],\n      ingredients: [\"Huevos\", \"Queso crema\", \"Polvo de hornear\", \"Sal\"],\n      steps: [\n        \"Separa claras y yemas.\",\n        \"Bate las claras a punto nieve.\",\n        \"Mezcla yemas con queso crema y polvo de hornear.\",\n        \"Incorpora las claras con movimientos suaves.\",\n        \"Forma porciones y hornea a 160 \u00b0C durante 20 minutos.\"\n      ],\n      substitutions: [\"Puedes usar yogur griego natural.\", \"Puedes agregar especias.\"]\n    },\n    {\n      id: 5,\n      title: \"Bizcocho de vainilla sin az\u00facar\",\n      category: \"Tortas y bizcochos\",\n      difficulty: \"F\u00e1cil\",\n      calories: 155,\n      prep: 12,\n      cook: 30,\n      servings: 8,\n      image: \"https:\/\/images.unsplash.com\/photo-1519915028121-7d3463d20b13?auto=format&fit=crop&w=900&q=80\",\n      description: \"Bizcocho suave y arom\u00e1tico para acompa\u00f1ar caf\u00e9 o t\u00e9.\",\n      tags: [\"Sin az\u00facar a\u00f1adida\", \"Dulce saludable\"],\n      ingredients: [\"Harina de avena integral\", \"Harina de almendras\", \"Huevos\", \"Yogur natural sin az\u00facar\", \"Eritritol\", \"Vainilla\", \"Polvo de hornear\", \"Aceite de coco\", \"Sal\"],\n      steps: [\n        \"Precalienta el horno a 180 \u00b0C.\",\n        \"Bate huevos, yogur, vainilla y aceite de coco.\",\n        \"A\u00f1ade harinas, endulzante, polvo de hornear y sal.\",\n        \"Vierte en molde y hornea durante 30 minutos.\",\n        \"Deja enfriar antes de servir.\"\n      ],\n      substitutions: [\"Puedes usar monk fruit.\", \"Puedes agregar ralladura de lim\u00f3n.\"]\n    },\n    {\n      id: 6,\n      title: \"Torta de chocolate saludable\",\n      category: \"Tortas y bizcochos\",\n      difficulty: \"F\u00e1cil\",\n      calories: 190,\n      prep: 15,\n      cook: 32,\n      servings: 10,\n      image: \"https:\/\/images.unsplash.com\/photo-1605807646983-377bc5a76493?auto=format&fit=crop&w=900&q=80\",\n      description: \"Torta h\u00fameda con cacao puro y sin az\u00facar a\u00f1adida.\",\n      tags: [\"Chocolate\", \"Sin az\u00facar a\u00f1adida\"],\n      ingredients: [\"Harina de almendras\", \"Cacao puro sin az\u00facar\", \"Huevos\", \"Yogur natural sin az\u00facar\", \"Eritritol\", \"Polvo de hornear\", \"Aceite de coco\"],\n      steps: [\n        \"Mezcla ingredientes secos.\",\n        \"Bate huevos, yogur y aceite.\",\n        \"Une ambas mezclas.\",\n        \"Coloca en molde y hornea a 180 \u00b0C por 32 minutos.\"\n      ],\n      substitutions: [\"Puedes decorar con frutos rojos.\", \"Puedes usar leche vegetal sin az\u00facar.\"]\n    },\n    {\n      id: 7,\n      title: \"Brownie sin az\u00facar a\u00f1adida\",\n      category: \"Tortas y bizcochos\",\n      difficulty: \"F\u00e1cil\",\n      calories: 170,\n      prep: 10,\n      cook: 22,\n      servings: 9,\n      image: \"https:\/\/images.unsplash.com\/photo-1606313564200-e75d5e30476c?auto=format&fit=crop&w=900&q=80\",\n      description: \"Brownie intenso, h\u00famedo y f\u00e1cil de preparar.\",\n      tags: [\"Chocolate\", \"R\u00e1pido\"],\n      ingredients: [\"Cacao puro sin az\u00facar\", \"Harina de almendras\", \"Huevos\", \"Eritritol\", \"Aceite de coco\", \"Vainilla\", \"Nueces\"],\n      steps: [\n        \"Mezcla huevos, aceite, vainilla y endulzante.\",\n        \"Agrega cacao y harina de almendras.\",\n        \"Incorpora nueces.\",\n        \"Hornea durante 22 minutos a 180 \u00b0C.\"\n      ],\n      substitutions: [\"Puedes usar almendras picadas.\", \"Puedes omitir las nueces.\"]\n    },\n    {\n      id: 8,\n      title: \"Muffins de ar\u00e1ndanos sin az\u00facar\",\n      category: \"Tortas y bizcochos\",\n      difficulty: \"F\u00e1cil\",\n      calories: 135,\n      prep: 12,\n      cook: 22,\n      servings: 8,\n      image: \"https:\/\/images.unsplash.com\/photo-1607958996333-41aef7caefaa?auto=format&fit=crop&w=900&q=80\",\n      description: \"Muffins suaves con fruta natural y textura esponjosa.\",\n      tags: [\"Sin az\u00facar a\u00f1adida\", \"Merienda\"],\n      ingredients: [\"Harina de avena integral\", \"Huevos\", \"Yogur natural sin az\u00facar\", \"Ar\u00e1ndanos\", \"Polvo de hornear\", \"Vainilla\", \"Eritritol\"],\n      steps: [\n        \"Mezcla ingredientes h\u00famedos.\",\n        \"A\u00f1ade harina, polvo de hornear y endulzante.\",\n        \"Incorpora ar\u00e1ndanos.\",\n        \"Divide en moldes y hornea por 22 minutos.\"\n      ],\n      substitutions: [\"Puedes usar frutos rojos.\", \"Puedes reemplazar yogur por leche vegetal.\"]\n    },\n    {\n      id: 9,\n      title: \"Pizza con base de coliflor\",\n      category: \"Masas saladas\",\n      difficulty: \"Media\",\n      calories: 210,\n      prep: 20,\n      cook: 25,\n      servings: 4,\n      image: \"https:\/\/images.unsplash.com\/photo-1513104890138-7c749659a591?auto=format&fit=crop&w=900&q=80\",\n      description: \"Pizza ligera y sabrosa sin harina blanca.\",\n      tags: [\"Sin harina blanca\", \"Cena saludable\"],\n      ingredients: [\"Coliflor\", \"Huevo\", \"Queso mozzarella\", \"Harina de almendras\", \"Or\u00e9gano\", \"Sal\", \"Salsa de tomate sin az\u00facar\", \"Tomate\", \"Champi\u00f1ones\"],\n      steps: [\n        \"Ralla la coliflor y coc\u00ednala 5 minutos.\",\n        \"Escurre muy bien el exceso de agua.\",\n        \"Mezcla con huevo, queso, harina, sal y or\u00e9gano.\",\n        \"Forma una base y hornea 15 minutos.\",\n        \"Agrega salsa y toppings.\",\n        \"Hornea 10 minutos m\u00e1s.\"\n      ],\n      substitutions: [\"Puedes usar queso bajo en grasa.\", \"Puedes preparar mini pizzas.\"]\n    },\n    {\n      id: 10,\n      title: \"Masa de pizza de almendras\",\n      category: \"Masas saladas\",\n      difficulty: \"Media\",\n      calories: 230,\n      prep: 15,\n      cook: 20,\n      servings: 4,\n      image: \"https:\/\/images.unsplash.com\/photo-1593560708920-61dd98c46a4e?auto=format&fit=crop&w=900&q=80\",\n      description: \"Base de pizza con buena textura y sin harina refinada.\",\n      tags: [\"Sin harina blanca\", \"Bajo en carbohidratos\"],\n      ingredients: [\"Harina de almendras\", \"Huevo\", \"Queso mozzarella\", \"Psyllium\", \"Or\u00e9gano\", \"Sal\"],\n      steps: [\n        \"Mezcla todos los ingredientes.\",\n        \"Forma una masa compacta.\",\n        \"Extiende sobre papel de horno.\",\n        \"Prehornea 12 minutos.\",\n        \"Agrega toppings y hornea nuevamente.\"\n      ],\n      substitutions: [\"Puedes usar harina de linaza.\", \"Puedes a\u00f1adir ajo en polvo.\"]\n    },\n    {\n      id: 11,\n      title: \"Wrap saludable de espinaca\",\n      category: \"Masas saladas\",\n      difficulty: \"F\u00e1cil\",\n      calories: 125,\n      prep: 8,\n      cook: 7,\n      servings: 2,\n      image: \"https:\/\/images.unsplash.com\/photo-1604908176997-125f25cc6f3d?auto=format&fit=crop&w=900&q=80\",\n      description: \"Wrap flexible, verde y r\u00e1pido para almuerzos ligeros.\",\n      tags: [\"15 minutos\", \"Sin harina blanca\"],\n      ingredients: [\"Espinaca\", \"Huevos\", \"Harina de avena integral\", \"Sal\", \"Aceite de oliva\"],\n      steps: [\n        \"Licua espinaca, huevos, harina y sal.\",\n        \"Calienta una sart\u00e9n antiadherente.\",\n        \"Cocina por ambos lados.\",\n        \"Rellena con vegetales, pollo o queso.\"\n      ],\n      substitutions: [\"Puedes usar acelga.\", \"Puedes a\u00f1adir semillas.\"]\n    },\n    {\n      id: 12,\n      title: \"Crackers de semillas\",\n      category: \"Masas saladas\",\n      difficulty: \"F\u00e1cil\",\n      calories: 95,\n      prep: 10,\n      cook: 25,\n      servings: 12,\n      image: \"https:\/\/images.unsplash.com\/photo-1621939514649-280e2ee25f60?auto=format&fit=crop&w=900&q=80\",\n      description: \"Crackers crocantes, ricos en fibra y perfectos para dips.\",\n      tags: [\"Alto en fibra\", \"Snack\"],\n      ingredients: [\"Ch\u00eda\", \"Linaza\", \"Semillas de girasol\", \"S\u00e9samo\", \"Agua\", \"Sal\", \"Or\u00e9gano\"],\n      steps: [\n        \"Mezcla semillas, agua y sal.\",\n        \"Deja reposar 15 minutos.\",\n        \"Extiende en una capa fina.\",\n        \"Hornea a 170 \u00b0C por 25 minutos.\",\n        \"Corta y deja enfriar.\"\n      ],\n      substitutions: [\"Puedes agregar piment\u00f3n dulce.\", \"Puedes usar semillas de calabaza.\"]\n    },\n    {\n      id: 13,\n      title: \"Mousse de cacao sin az\u00facar\",\n      category: \"Postres\",\n      difficulty: \"F\u00e1cil\",\n      calories: 130,\n      prep: 10,\n      cook: 0,\n      servings: 4,\n      image: \"https:\/\/images.unsplash.com\/photo-1511381939415-e44015466834?auto=format&fit=crop&w=900&q=80\",\n      description: \"Postre cremoso, r\u00e1pido y con sabor intenso a chocolate.\",\n      tags: [\"Sin horno\", \"15 minutos\", \"Chocolate\"],\n      ingredients: [\"Aguacate\", \"Cacao puro sin az\u00facar\", \"Yogur natural sin az\u00facar\", \"Vainilla\", \"Eritritol\", \"Sal\", \"Frutos rojos\"],\n      steps: [\n        \"Coloca todos los ingredientes en una licuadora.\",\n        \"Procesa hasta obtener una crema lisa.\",\n        \"Ajusta el dulzor.\",\n        \"Sirve en vasos y decora con frutos rojos.\"\n      ],\n      substitutions: [\"Puedes usar leche de coco sin az\u00facar.\", \"Puedes agregar canela.\"]\n    },\n    {\n      id: 14,\n      title: \"Pud\u00edn de ch\u00eda con frutos rojos\",\n      category: \"Postres\",\n      difficulty: \"F\u00e1cil\",\n      calories: 115,\n      prep: 8,\n      cook: 0,\n      servings: 2,\n      image: \"https:\/\/images.unsplash.com\/photo-1511690743698-d9d85f2fbf38?auto=format&fit=crop&w=900&q=80\",\n      description: \"Postre fresco, simple y rico en fibra.\",\n      tags: [\"Sin horno\", \"Alto en fibra\"],\n      ingredients: [\"Ch\u00eda\", \"Leche vegetal sin az\u00facar\", \"Vainilla\", \"Eritritol\", \"Frutos rojos\", \"Canela\"],\n      steps: [\n        \"Mezcla ch\u00eda, leche, vainilla y endulzante.\",\n        \"Refrigera al menos 2 horas.\",\n        \"Sirve con frutos rojos y canela.\"\n      ],\n      substitutions: [\"Puedes usar yogur natural sin az\u00facar.\", \"Puedes agregar coco rallado.\"]\n    },\n    {\n      id: 15,\n      title: \"Flan de vainilla sin az\u00facar\",\n      category: \"Postres\",\n      difficulty: \"Media\",\n      calories: 140,\n      prep: 12,\n      cook: 35,\n      servings: 6,\n      image: \"https:\/\/images.unsplash.com\/photo-1627308595229-7830a5c91f9f?auto=format&fit=crop&w=900&q=80\",\n      description: \"Flan suave, cremoso y sin az\u00facar a\u00f1adida.\",\n      tags: [\"Postre cl\u00e1sico\", \"Sin az\u00facar a\u00f1adida\"],\n      ingredients: [\"Huevos\", \"Leche vegetal sin az\u00facar\", \"Vainilla\", \"Eritritol\", \"Canela\"],\n      steps: [\n        \"Bate huevos con leche, vainilla y endulzante.\",\n        \"Vierte en moldes.\",\n        \"Cocina a ba\u00f1o Mar\u00eda durante 35 minutos.\",\n        \"Enfr\u00eda antes de servir.\"\n      ],\n      substitutions: [\"Puedes usar leche de almendras.\", \"Puedes aromatizar con lim\u00f3n.\"]\n    },\n    {\n      id: 16,\n      title: \"Galletas de almendra y canela\",\n      category: \"Postres\",\n      difficulty: \"F\u00e1cil\",\n      calories: 105,\n      prep: 12,\n      cook: 15,\n      servings: 12,\n      image: \"https:\/\/images.unsplash.com\/photo-1499636136210-6f4ee915583e?auto=format&fit=crop&w=900&q=80\",\n      description: \"Galletas simples, arom\u00e1ticas y sin harina blanca.\",\n      tags: [\"Snack\", \"Sin harina blanca\"],\n      ingredients: [\"Harina de almendras\", \"Huevo\", \"Canela\", \"Eritritol\", \"Aceite de coco\", \"Vainilla\"],\n      steps: [\n        \"Mezcla todos los ingredientes.\",\n        \"Forma peque\u00f1as galletas.\",\n        \"Coloca en bandeja.\",\n        \"Hornea durante 15 minutos a 180 \u00b0C.\"\n      ],\n      substitutions: [\"Puedes agregar coco rallado.\", \"Puedes usar nueces picadas.\"]\n    },\n    {\n      id: 17,\n      title: \"Torta de zanahoria saludable\",\n      category: \"Tortas y bizcochos\",\n      difficulty: \"Media\",\n      calories: 185,\n      prep: 18,\n      cook: 35,\n      servings: 10,\n      image: \"https:\/\/images.unsplash.com\/photo-1621303837174-89787a7d4729?auto=format&fit=crop&w=900&q=80\",\n      description: \"Torta h\u00fameda con zanahoria, canela y harina integral.\",\n      tags: [\"Sin az\u00facar a\u00f1adida\", \"Alta en fibra\"],\n      ingredients: [\"Zanahoria\", \"Harina de avena integral\", \"Huevos\", \"Canela\", \"Nueces\", \"Polvo de hornear\", \"Eritritol\", \"Aceite de oliva\"],\n      steps: [\n        \"Ralla la zanahoria.\",\n        \"Bate huevos con aceite y endulzante.\",\n        \"Agrega harina, canela y polvo de hornear.\",\n        \"Incorpora zanahoria y nueces.\",\n        \"Hornea a 180 \u00b0C por 35 minutos.\"\n      ],\n      substitutions: [\"Puedes usar harina de almendras.\", \"Puedes a\u00f1adir jengibre.\"]\n    },\n    {\n      id: 18,\n      title: \"Helado de yogur y frutos rojos\",\n      category: \"Postres\",\n      difficulty: \"F\u00e1cil\",\n      calories: 100,\n      prep: 10,\n      cook: 0,\n      servings: 4,\n      image: \"https:\/\/images.unsplash.com\/photo-1501443762994-82bd5dace89a?auto=format&fit=crop&w=900&q=80\",\n      description: \"Helado casero, cremoso y sin az\u00facar a\u00f1adida.\",\n      tags: [\"Sin horno\", \"R\u00e1pido\"],\n      ingredients: [\"Yogur natural sin az\u00facar\", \"Frutos rojos\", \"Vainilla\", \"Eritritol\"],\n      steps: [\n        \"Licua todos los ingredientes.\",\n        \"Lleva al congelador.\",\n        \"Remueve cada 30 minutos durante 2 horas.\",\n        \"Sirve cremoso.\"\n      ],\n      substitutions: [\"Puedes usar leche de coco.\", \"Puedes agregar ralladura de lim\u00f3n.\"]\n    },\n    {\n      id: 19,\n      title: \"Manzana horneada con canela\",\n      category: \"Postres\",\n      difficulty: \"F\u00e1cil\",\n      calories: 90,\n      prep: 5,\n      cook: 20,\n      servings: 2,\n      image: \"https:\/\/images.unsplash.com\/photo-1506808547685-e2ba962ded60?auto=format&fit=crop&w=900&q=80\",\n      description: \"Postre tibio, simple y arom\u00e1tico.\",\n      tags: [\"F\u00e1cil\", \"Sin az\u00facar a\u00f1adida\"],\n      ingredients: [\"Manzana\", \"Canela\", \"Nueces\", \"Yogur natural sin az\u00facar\"],\n      steps: [\n        \"Corta la manzana.\",\n        \"Agrega canela y nueces.\",\n        \"Hornea durante 20 minutos.\",\n        \"Sirve con yogur natural.\"\n      ],\n      substitutions: [\"Puedes usar pera.\", \"Puedes a\u00f1adir vainilla.\"]\n    },\n    {\n      id: 20,\n      title: \"Cheesecake saludable en vaso\",\n      category: \"Postres\",\n      difficulty: \"F\u00e1cil\",\n      calories: 160,\n      prep: 15,\n      cook: 0,\n      servings: 4,\n      image: \"https:\/\/images.unsplash.com\/photo-1533134242443-d4fd215305ad?auto=format&fit=crop&w=900&q=80\",\n      description: \"Postre cremoso en capas, sin horno y muy pr\u00e1ctico.\",\n      tags: [\"Sin horno\", \"15 minutos\"],\n      ingredients: [\"Queso crema\", \"Yogur natural sin az\u00facar\", \"Vainilla\", \"Eritritol\", \"Harina de almendras\", \"Frutos rojos\"],\n      steps: [\n        \"Mezcla queso crema, yogur, vainilla y endulzante.\",\n        \"Coloca harina de almendras en el fondo del vaso.\",\n        \"Agrega crema y frutos rojos.\",\n        \"Refrigera antes de servir.\"\n      ],\n      substitutions: [\"Puedes usar ricota.\", \"Puedes agregar lim\u00f3n.\"]\n    },\n    {\n      id: 21,\n      title: \"Panqueques de avena integral\",\n      category: \"Desayunos\",\n      difficulty: \"F\u00e1cil\",\n      calories: 150,\n      prep: 7,\n      cook: 8,\n      servings: 4,\n      image: \"https:\/\/images.unsplash.com\/photo-1528207776546-365bb710ee93?auto=format&fit=crop&w=900&q=80\",\n      description: \"Panqueques suaves para desayunos saludables.\",\n      tags: [\"15 minutos\", \"Desayuno\"],\n      ingredients: [\"Harina de avena integral\", \"Huevos\", \"Leche vegetal sin az\u00facar\", \"Canela\", \"Vainilla\", \"Polvo de hornear\"],\n      steps: [\n        \"Mezcla todos los ingredientes.\",\n        \"Calienta una sart\u00e9n.\",\n        \"Cocina peque\u00f1as porciones por ambos lados.\",\n        \"Sirve con yogur o frutos rojos.\"\n      ],\n      substitutions: [\"Puedes usar harina de almendras.\", \"Puedes a\u00f1adir ch\u00eda.\"]\n    },\n    {\n      id: 22,\n      title: \"Yogur con ch\u00eda y canela\",\n      category: \"Desayunos\",\n      difficulty: \"F\u00e1cil\",\n      calories: 110,\n      prep: 5,\n      cook: 0,\n      servings: 1,\n      image: \"https:\/\/images.unsplash.com\/photo-1488477181946-6428a0291777?auto=format&fit=crop&w=900&q=80\",\n      description: \"Desayuno r\u00e1pido, fresco y saciante.\",\n      tags: [\"5 minutos\", \"Sin horno\"],\n      ingredients: [\"Yogur natural sin az\u00facar\", \"Ch\u00eda\", \"Canela\", \"Frutos rojos\", \"Nueces\"],\n      steps: [\n        \"Coloca yogur en un bowl.\",\n        \"Agrega ch\u00eda y canela.\",\n        \"Decora con frutos rojos y nueces.\",\n        \"Sirve de inmediato.\"\n      ],\n      substitutions: [\"Puedes usar leche vegetal.\", \"Puedes a\u00f1adir coco rallado.\"]\n    },\n    {\n      id: 23,\n      title: \"Tostadas de linaza expr\u00e9s\",\n      category: \"Desayunos\",\n      difficulty: \"F\u00e1cil\",\n      calories: 135,\n      prep: 5,\n      cook: 8,\n      servings: 2,\n      image: \"https:\/\/images.unsplash.com\/photo-1525351484163-7529414344d8?auto=format&fit=crop&w=900&q=80\",\n      description: \"Tostadas r\u00e1pidas, crujientes y ricas en fibra.\",\n      tags: [\"15 minutos\", \"Alto en fibra\"],\n      ingredients: [\"Linaza molida\", \"Huevo\", \"Agua\", \"Sal\", \"Or\u00e9gano\"],\n      steps: [\n        \"Mezcla linaza, huevo, agua y sal.\",\n        \"Extiende en una sart\u00e9n.\",\n        \"Cocina por ambos lados.\",\n        \"Corta en tostadas.\"\n      ],\n      substitutions: [\"Puedes agregar semillas.\", \"Puedes usar especias.\"]\n    },\n    {\n      id: 24,\n      title: \"Quiche sin harina blanca\",\n      category: \"Masas saladas\",\n      difficulty: \"Media\",\n      calories: 240,\n      prep: 18,\n      cook: 35,\n      servings: 6,\n      image: \"https:\/\/images.unsplash.com\/photo-1535920527002-b35e96722eb9?auto=format&fit=crop&w=900&q=80\",\n      description: \"Quiche salada con base saludable y relleno cremoso.\",\n      tags: [\"Sin harina blanca\", \"Cena\"],\n      ingredients: [\"Harina de almendras\", \"Huevo\", \"Aceite de oliva\", \"Sal\", \"Espinaca\", \"Queso crema\", \"Queso mozzarella\"],\n      steps: [\n        \"Prepara la base con harina, huevo, aceite y sal.\",\n        \"Prehornea durante 10 minutos.\",\n        \"Mezcla espinaca, queso crema y mozzarella.\",\n        \"Rellena la base y hornea 25 minutos.\"\n      ],\n      substitutions: [\"Puedes usar acelga.\", \"Puedes agregar champi\u00f1ones.\"]\n    },\n    {\n      id: 25,\n      title: \"Trufas de cacao y coco\",\n      category: \"Postres\",\n      difficulty: \"F\u00e1cil\",\n      calories: 85,\n      prep: 15,\n      cook: 0,\n      servings: 12,\n      image: \"https:\/\/images.unsplash.com\/photo-1541783245831-57d6fb0926d3?auto=format&fit=crop&w=900&q=80\",\n      description: \"Bocaditos dulces sin az\u00facar a\u00f1adida, ideales para antojos.\",\n      tags: [\"Sin horno\", \"Snack\"],\n      ingredients: [\"Cacao puro sin az\u00facar\", \"Coco rallado\", \"Harina de almendras\", \"Aceite de coco\", \"Eritritol\", \"Vainilla\"],\n      steps: [\n        \"Mezcla todos los ingredientes.\",\n        \"Forma bolitas peque\u00f1as.\",\n        \"Reboza con coco rallado.\",\n        \"Refrigera 20 minutos.\"\n      ],\n      substitutions: [\"Puedes agregar nueces.\", \"Puedes usar canela.\"]\n    },\n    {\n      id: 26,\n      title: \"Barritas de coco y cacao\",\n      category: \"Postres\",\n      difficulty: \"F\u00e1cil\",\n      calories: 145,\n      prep: 15,\n      cook: 0,\n      servings: 8,\n      image: \"https:\/\/images.unsplash.com\/photo-1599599810769-bcde5a160d32?auto=format&fit=crop&w=900&q=80\",\n      description: \"Barritas pr\u00e1cticas para guardar y comer como snack.\",\n      tags: [\"Sin horno\", \"Snack\"],\n      ingredients: [\"Coco rallado\", \"Cacao puro sin az\u00facar\", \"Aceite de coco\", \"Eritritol\", \"Harina de almendras\"],\n      steps: [\n        \"Mezcla ingredientes hasta formar una pasta.\",\n        \"Presiona en un molde peque\u00f1o.\",\n        \"Refrigera hasta endurecer.\",\n        \"Corta en barritas.\"\n      ],\n      substitutions: [\"Puedes agregar mantequilla de almendras.\", \"Puedes decorar con cacao.\"]\n    },\n    {\n      id: 27,\n      title: \"Empanadas con masa de avena\",\n      category: \"Masas saladas\",\n      difficulty: \"Media\",\n      calories: 220,\n      prep: 25,\n      cook: 25,\n      servings: 8,\n      image: \"https:\/\/images.unsplash.com\/photo-1601050690597-df0568f70950?auto=format&fit=crop&w=900&q=80\",\n      description: \"Empanadas caseras con una masa m\u00e1s consciente.\",\n      tags: [\"Sin harina blanca\", \"Almuerzo\"],\n      ingredients: [\"Harina de avena integral\", \"Huevo\", \"Aceite de oliva\", \"Agua\", \"Sal\", \"Pollo\", \"Cebolla\", \"Piment\u00f3n\"],\n      steps: [\n        \"Prepara la masa con harina, huevo, aceite, agua y sal.\",\n        \"Deja reposar 15 minutos.\",\n        \"Cocina el relleno.\",\n        \"Rellena las empanadas.\",\n        \"Hornea durante 25 minutos.\"\n      ],\n      substitutions: [\"Puedes rellenar con vegetales.\", \"Puedes usar carne magra.\"]\n    },\n    {\n      id: 28,\n      title: \"Mug cake de cacao sin az\u00facar\",\n      category: \"Postres\",\n      difficulty: \"F\u00e1cil\",\n      calories: 160,\n      prep: 5,\n      cook: 2,\n      servings: 1,\n      image: \"https:\/\/images.unsplash.com\/photo-1578985545062-69928b1d9587?auto=format&fit=crop&w=900&q=80\",\n      description: \"Pastel individual r\u00e1pido para preparar en minutos.\",\n      tags: [\"15 minutos\", \"Chocolate\", \"R\u00e1pido\"],\n      ingredients: [\"Huevo\", \"Harina de almendras\", \"Cacao puro sin az\u00facar\", \"Eritritol\", \"Polvo de hornear\", \"Leche vegetal sin az\u00facar\"],\n      steps: [\n        \"Mezcla todos los ingredientes en una taza.\",\n        \"Cocina en microondas por 90 segundos.\",\n        \"Deja reposar 1 minuto.\",\n        \"Sirve tibio.\"\n      ],\n      substitutions: [\"Puedes a\u00f1adir vainilla.\", \"Puedes decorar con yogur.\"]\n    },\n    {\n      id: 29,\n      title: \"Crema de lim\u00f3n sin az\u00facar\",\n      category: \"Postres\",\n      difficulty: \"F\u00e1cil\",\n      calories: 125,\n      prep: 12,\n      cook: 5,\n      servings: 4,\n      image: \"https:\/\/images.unsplash.com\/photo-1505253716362-afaea1d3d1af?auto=format&fit=crop&w=900&q=80\",\n      description: \"Crema c\u00edtrica, fresca y suave.\",\n      tags: [\"Sin az\u00facar a\u00f1adida\", \"Postre fresco\"],\n      ingredients: [\"Lim\u00f3n\", \"Huevos\", \"Eritritol\", \"Yogur natural sin az\u00facar\", \"Vainilla\"],\n      steps: [\n        \"Bate huevos con lim\u00f3n y endulzante.\",\n        \"Cocina a fuego bajo hasta espesar.\",\n        \"Deja enfriar.\",\n        \"Mezcla con yogur y sirve.\"\n      ],\n      substitutions: [\"Puedes usar lima.\", \"Puedes agregar ralladura.\"]\n    },\n    {\n      id: 30,\n      title: \"Pan de calabac\u00edn saludable\",\n      category: \"Panes\",\n      difficulty: \"F\u00e1cil\",\n      calories: 155,\n      prep: 15,\n      cook: 35,\n      servings: 8,\n      image: \"https:\/\/images.unsplash.com\/photo-1586444248902-2f64eddc13df?auto=format&fit=crop&w=900&q=80\",\n      description: \"Pan h\u00famedo y suave con vegetales integrados.\",\n      tags: [\"Sin az\u00facar a\u00f1adida\", \"Alto en fibra\"],\n      ingredients: [\"Calabac\u00edn\", \"Harina de avena integral\", \"Huevos\", \"Aceite de oliva\", \"Polvo de hornear\", \"Sal\", \"Semillas de girasol\"],\n      steps: [\n        \"Ralla el calabac\u00edn y retira exceso de agua.\",\n        \"Mezcla con huevos y aceite.\",\n        \"Agrega harina, polvo de hornear y sal.\",\n        \"Incorpora semillas.\",\n        \"Hornea 35 minutos.\"\n      ],\n      substitutions: [\"Puedes usar zanahoria.\", \"Puedes agregar queso.\"]\n    }\n  ];\n\n  const state = {\n    view: \"recipes\",\n    search: \"\",\n    category: \"all\",\n    time: \"all\",\n    difficulty: \"all\",\n    ingredients: [],\n    favorites: JSON.parse(localStorage.getItem(\"pc_favorites\") || \"[]\"),\n    shopping: JSON.parse(localStorage.getItem(\"pc_shopping\") || \"[]\")\n  };\n\n  const categories = [...new Set(recipes.map(r => r.category))];\n\n  const popularIngredients = [\n    \"Harina de almendras\",\n    \"Huevos\",\n    \"Yogur natural sin az\u00facar\",\n    \"Cacao puro sin az\u00facar\",\n    \"Harina de avena integral\",\n    \"Ch\u00eda\",\n    \"Linaza\",\n    \"Eritritol\",\n    \"Frutos rojos\",\n    \"Queso mozzarella\",\n    \"Aceite de coco\",\n    \"Canela\"\n  ];\n\n  const el = {\n    tabs: document.querySelectorAll(\".pc-tab\"),\n    recipesView: document.getElementById(\"recipesView\"),\n    favoritesView: document.getElementById(\"favoritesView\"),\n    shoppingView: document.getElementById(\"shoppingView\"),\n    recipesGrid: document.getElementById(\"recipesGrid\"),\n    favoritesGrid: document.getElementById(\"favoritesGrid\"),\n    shoppingList: document.getElementById(\"shoppingList\"),\n    resultCount: document.getElementById(\"resultCount\"),\n    favCount: document.getElementById(\"favCount\"),\n    searchInput: document.getElementById(\"searchInput\"),\n    categoryFilter: document.getElementById(\"categoryFilter\"),\n    timeFilter: document.getElementById(\"timeFilter\"),\n    difficultyFilter: document.getElementById(\"difficultyFilter\"),\n    ingredientChips: document.getElementById(\"ingredientChips\"),\n    clearFilters: document.getElementById(\"clearFilters\"),\n    clearShopping: document.getElementById(\"clearShopping\"),\n    copyShopping: document.getElementById(\"copyShopping\"),\n    modal: document.getElementById(\"recipeModal\"),\n    modalContent: document.getElementById(\"modalContent\"),\n    closeModal: document.getElementById(\"closeModal\"),\n    statRecipes: document.getElementById(\"statRecipes\")\n  };\n\n  el.statRecipes.textContent = \"+\" + recipes.length + \" recetas\";\n\n  function totalTime(recipe){\n    return recipe.prep + recipe.cook;\n  }\n\n  function saveFavorites(){\n    localStorage.setItem(\"pc_favorites\", JSON.stringify(state.favorites));\n  }\n\n  function saveShopping(){\n    localStorage.setItem(\"pc_shopping\", JSON.stringify(state.shopping));\n  }\n\n  function initFilters(){\n    categories.forEach(cat => {\n      const option = document.createElement(\"option\");\n      option.value = cat;\n      option.textContent = cat;\n      el.categoryFilter.appendChild(option);\n    });\n\n    popularIngredients.forEach(ing => {\n      const btn = document.createElement(\"button\");\n      btn.className = \"pc-chip\";\n      btn.type = \"button\";\n      btn.textContent = ing;\n      btn.addEventListener(\"click\", () => {\n        if(state.ingredients.includes(ing)){\n          state.ingredients = state.ingredients.filter(i => i !== ing);\n        } else {\n          state.ingredients.push(ing);\n        }\n        renderIngredientChips();\n        renderRecipes();\n      });\n      el.ingredientChips.appendChild(btn);\n    });\n\n    renderIngredientChips();\n  }\n\n  function renderIngredientChips(){\n    [...el.ingredientChips.children].forEach(btn => {\n      btn.classList.toggle(\"active\", state.ingredients.includes(btn.textContent));\n    });\n  }\n\n  function filteredRecipes(){\n    return recipes.filter(recipe => {\n      const query = state.search.toLowerCase().trim();\n      const searchable = [\n        recipe.title,\n        recipe.category,\n        recipe.description,\n        recipe.difficulty,\n        recipe.tags.join(\" \"),\n        recipe.ingredients.join(\" \")\n      ].join(\" \").toLowerCase();\n\n      const matchSearch = !query || searchable.includes(query);\n      const matchCategory = state.category === \"all\" || recipe.category === state.category;\n      const matchTime = state.time === \"all\" || totalTime(recipe) <= Number(state.time);\n      const matchDifficulty = state.difficulty === \"all\" || recipe.difficulty === state.difficulty;\n      const matchIngredients = state.ingredients.length === 0 || state.ingredients.every(ing => recipe.ingredients.includes(ing));\n\n      return matchSearch && matchCategory && matchTime && matchDifficulty && matchIngredients;\n    });\n  }\n\n  function recipeCard(recipe){\n    const isFav = state.favorites.includes(recipe.id);\n    return `\n      <article class=\"pc-recipe-card\">\n        <div class=\"pc-card-img\">\n          <img decoding=\"async\" src=\"${recipe.image}\" alt=\"${recipe.title}\">\n          <button class=\"pc-fav\" data-fav=\"${recipe.id}\" title=\"Guardar favorito\">${isFav ? \"\u2665\" : \"\u2661\"}<\/button>\n        <\/div>\n        <div class=\"pc-card-body2\">\n          <span class=\"pc-badge\">${recipe.category}<\/span>\n          <h3>${recipe.title}<\/h3>\n          <p>${recipe.description}<\/p>\n          <div class=\"pc-meta\">\n            <span>\ud83d\udd25 ${recipe.calories} kcal<\/span>\n            <span>\u23f1\ufe0f ${totalTime(recipe)} min<\/span>\n            <span>\ud83c\udf7d\ufe0f ${recipe.servings} porciones<\/span>\n            <span>\u2b50 ${recipe.difficulty}<\/span>\n          <\/div>\n          <button class=\"pc-open\" data-open=\"${recipe.id}\">Ver receta<\/button>\n        <\/div>\n      <\/article>\n    `;\n  }\n\n  function renderRecipes(){\n    const list = filteredRecipes();\n    el.resultCount.textContent = list.length + (list.length === 1 ? \" receta\" : \" recetas\");\n\n    if(list.length === 0){\n      el.recipesGrid.innerHTML = `\n        <div class=\"pc-empty\" style=\"grid-column:1\/-1;\">\n          <h3>No encontramos recetas<\/h3>\n          <p>Prueba quitar alg\u00fan filtro o buscar otro ingrediente.<\/p>\n        <\/div>\n      `;\n      return;\n    }\n\n    el.recipesGrid.innerHTML = list.map(recipeCard).join(\"\");\n    bindRecipeButtons();\n  }\n\n  function renderFavorites(){\n    const list = recipes.filter(r => state.favorites.includes(r.id));\n    el.favCount.textContent = list.length + (list.length === 1 ? \" favorita\" : \" favoritas\");\n\n    if(list.length === 0){\n      el.favoritesGrid.innerHTML = `\n        <div class=\"pc-empty\" style=\"grid-column:1\/-1;\">\n          <h3>A\u00fan no tienes favoritos<\/h3>\n          <p>Toca el coraz\u00f3n en tus recetas preferidas para guardarlas aqu\u00ed.<\/p>\n        <\/div>\n      `;\n      return;\n    }\n\n    el.favoritesGrid.innerHTML = list.map(recipeCard).join(\"\");\n    bindRecipeButtons();\n  }\n\n  function renderShopping(){\n    if(state.shopping.length === 0){\n      el.shoppingList.innerHTML = `\n        <div class=\"pc-empty\" style=\"grid-column:1\/-1;\">\n          <h3>Lista vac\u00eda<\/h3>\n          <p>Abre una receta y toca \u201cAgregar ingredientes\u201d.<\/p>\n        <\/div>\n      `;\n      return;\n    }\n\n    el.shoppingList.innerHTML = state.shopping.map((item, index) => `\n      <label class=\"pc-shop-item ${item.done ? \"done\" : \"\"}\">\n        <input type=\"checkbox\" data-shop=\"${index}\" ${item.done ? \"checked\" : \"\"}>\n        <span>${item.name}<\/span>\n      <\/label>\n    `).join(\"\");\n\n    document.querySelectorAll(\"[data-shop]\").forEach(input => {\n      input.addEventListener(\"change\", () => {\n        const index = Number(input.dataset.shop);\n        state.shopping[index].done = input.checked;\n        saveShopping();\n        renderShopping();\n      });\n    });\n  }\n\n  function bindRecipeButtons(){\n    document.querySelectorAll(\"[data-open]\").forEach(btn => {\n      btn.addEventListener(\"click\", () => {\n        const recipe = recipes.find(r => r.id === Number(btn.dataset.open));\n        openModal(recipe);\n      });\n    });\n\n    document.querySelectorAll(\"[data-fav]\").forEach(btn => {\n      btn.addEventListener(\"click\", () => {\n        toggleFavorite(Number(btn.dataset.fav));\n      });\n    });\n  }\n\n  function toggleFavorite(id){\n    if(state.favorites.includes(id)){\n      state.favorites = state.favorites.filter(f => f !== id);\n    } else {\n      state.favorites.push(id);\n    }\n\n    saveFavorites();\n    renderRecipes();\n    renderFavorites();\n  }\n\n  function openModal(recipe){\n    el.modalContent.innerHTML = `\n      <div class=\"pc-modal-hero\">\n        <img decoding=\"async\" src=\"${recipe.image}\" alt=\"${recipe.title}\">\n        <div class=\"pc-modal-info\">\n          <h2>${recipe.title}<\/h2>\n          <p>${recipe.description}<\/p>\n          <div class=\"pc-modal-tags\">\n            ${recipe.tags.map(t => `<span>${t}<\/span>`).join(\"\")}\n          <\/div>\n          <div class=\"pc-modal-meta\">\n            <div>\ud83d\udd25 ${recipe.calories} kcal por porci\u00f3n<\/div>\n            <div>\u23f1\ufe0f ${totalTime(recipe)} min total<\/div>\n            <div>\ud83e\udd63 ${recipe.prep} min preparaci\u00f3n<\/div>\n            <div>\ud83d\udd25 ${recipe.cook} min cocci\u00f3n<\/div>\n            <div>\ud83c\udf7d\ufe0f ${recipe.servings} porciones<\/div>\n            <div>\u2b50 ${recipe.difficulty}<\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"pc-recipe-detail\">\n        <div class=\"pc-detail-box\">\n          <h3>Ingredientes<\/h3>\n          ${recipe.ingredients.map((ing, index) => `\n            <label class=\"pc-ingredient-item\">\n              <input type=\"checkbox\" data-ingredient=\"${index}\">\n              <span>${ing}<\/span>\n            <\/label>\n          `).join(\"\")}\n        <\/div>\n\n        <div class=\"pc-detail-box\">\n          <h3>Preparaci\u00f3n<\/h3>\n          <ol class=\"pc-steps\">\n            ${recipe.steps.map(step => `<li>${step}<\/li>`).join(\"\")}\n          <\/ol>\n        <\/div>\n\n        <div class=\"pc-detail-box\">\n          <h3>Sustituciones<\/h3>\n          <ol class=\"pc-steps\">\n            ${recipe.substitutions.map(item => `<li>${item}<\/li>`).join(\"\")}\n          <\/ol>\n        <\/div>\n\n        <div class=\"pc-detail-box\">\n          <h3>Consejo pr\u00e1ctico<\/h3>\n          <p class=\"pc-text\">Para una mejor organizaci\u00f3n, puedes preparar esta receta con anticipaci\u00f3n, guardar porciones y acompa\u00f1arla con prote\u00ednas, fibra o grasas saludables seg\u00fan tus necesidades.<\/p>\n        <\/div>\n\n        <div class=\"pc-note\">\n          <strong>Nota:<\/strong> Las recetas son opciones sin az\u00facar a\u00f1adida y sin harinas refinadas, pensadas para una alimentaci\u00f3n m\u00e1s consciente. No reemplazan la orientaci\u00f3n de un profesional de salud.\n        <\/div>\n      <\/div>\n\n      <div class=\"pc-modal-actions\">\n        <button class=\"orange\" id=\"modalFav\">${state.favorites.includes(recipe.id) ? \"Quitar de favoritos\" : \"Guardar en favoritos\"}<\/button>\n        <button class=\"green\" id=\"addAllIngredients\">Agregar todos los ingredientes<\/button>\n        <button class=\"brown\" id=\"addCheckedIngredients\">Agregar ingredientes seleccionados<\/button>\n      <\/div>\n    `;\n\n    el.modal.classList.add(\"show\");\n\n    document.getElementById(\"modalFav\").addEventListener(\"click\", () => {\n      toggleFavorite(recipe.id);\n      openModal(recipe);\n    });\n\n    document.getElementById(\"addAllIngredients\").addEventListener(\"click\", () => {\n      addIngredientsToShopping(recipe.ingredients);\n    });\n\n    document.getElementById(\"addCheckedIngredients\").addEventListener(\"click\", () => {\n      const checked = [...document.querySelectorAll(\"[data-ingredient]:checked\")].map(input => {\n        return recipe.ingredients[Number(input.dataset.ingredient)];\n      });\n      addIngredientsToShopping(checked);\n    });\n  }\n\n  function addIngredientsToShopping(ingredients){\n    ingredients.forEach(name => {\n      const exists = state.shopping.some(item => item.name === name);\n      if(!exists){\n        state.shopping.push({ name, done: false });\n      }\n    });\n\n    saveShopping();\n    renderShopping();\n    alert(\"Ingredientes agregados a la lista de compras.\");\n  }\n\n  function switchView(view){\n    state.view = view;\n\n    el.tabs.forEach(tab => {\n      tab.classList.toggle(\"active\", tab.dataset.view === view);\n    });\n\n    el.recipesView.style.display = view === \"recipes\" ? \"grid\" : \"none\";\n    el.favoritesView.style.display = view === \"favorites\" ? \"block\" : \"none\";\n    el.shoppingView.style.display = view === \"shopping\" ? \"block\" : \"none\";\n\n    if(view === \"favorites\") renderFavorites();\n    if(view === \"shopping\") renderShopping();\n  }\n\n  el.tabs.forEach(tab => {\n    tab.addEventListener(\"click\", () => switchView(tab.dataset.view));\n  });\n\n  el.searchInput.addEventListener(\"input\", e => {\n    state.search = e.target.value;\n    renderRecipes();\n  });\n\n  el.categoryFilter.addEventListener(\"change\", e => {\n    state.category = e.target.value;\n    renderRecipes();\n  });\n\n  el.timeFilter.addEventListener(\"change\", e => {\n    state.time = e.target.value;\n    renderRecipes();\n  });\n\n  el.difficultyFilter.addEventListener(\"change\", e => {\n    state.difficulty = e.target.value;\n    renderRecipes();\n  });\n\n  el.clearFilters.addEventListener(\"click\", () => {\n    state.search = \"\";\n    state.category = \"all\";\n    state.time = \"all\";\n    state.difficulty = \"all\";\n    state.ingredients = [];\n\n    el.searchInput.value = \"\";\n    el.categoryFilter.value = \"all\";\n    el.timeFilter.value = \"all\";\n    el.difficultyFilter.value = \"all\";\n\n    renderIngredientChips();\n    renderRecipes();\n  });\n\n  el.clearShopping.addEventListener(\"click\", () => {\n    if(confirm(\"\u00bfQuieres limpiar toda la lista de compras?\")){\n      state.shopping = [];\n      saveShopping();\n      renderShopping();\n    }\n  });\n\n  el.copyShopping.addEventListener(\"click\", () => {\n    if(state.shopping.length === 0){\n      alert(\"Tu lista est\u00e1 vac\u00eda.\");\n      return;\n    }\n\n    const text = state.shopping.map(item => \"- \" + item.name).join(\"\\n\");\n\n    if(navigator.clipboard){\n      navigator.clipboard.writeText(text);\n      alert(\"Lista copiada.\");\n    } else {\n      alert(text);\n    }\n  });\n\n  el.closeModal.addEventListener(\"click\", () => {\n    el.modal.classList.remove(\"show\");\n  });\n\n  el.modal.addEventListener(\"click\", e => {\n    if(e.target === el.modal){\n      el.modal.classList.remove(\"show\");\n    }\n  });\n\n  initFilters();\n  renderRecipes();\n  renderFavorites();\n  renderShopping();\n})();\n<\/script>\n```\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Panader\u00eda Cero Recetas dulces y saladas sin az\u00facar a\u00f1adida Panes, tortas, masas y postres para cocinar rico, simple y m\u00e1s consciente, sin harinas refinadas y sin renunciar al sabor. +30 recetas Sin az\u00facar a\u00f1adida Sin harinas refinadas Lista de compras Recetas Favoritos Lista de compras Filtros Buscar receta Categor\u00eda Todas Tiempo total TodosHasta 15 minutosHasta [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-30","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/panaderasinculpa.online\/index.php?rest_route=\/wp\/v2\/pages\/30","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/panaderasinculpa.online\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/panaderasinculpa.online\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/panaderasinculpa.online\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/panaderasinculpa.online\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=30"}],"version-history":[{"count":16,"href":"https:\/\/panaderasinculpa.online\/index.php?rest_route=\/wp\/v2\/pages\/30\/revisions"}],"predecessor-version":[{"id":75,"href":"https:\/\/panaderasinculpa.online\/index.php?rest_route=\/wp\/v2\/pages\/30\/revisions\/75"}],"wp:attachment":[{"href":"https:\/\/panaderasinculpa.online\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=30"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}