{"id":2205,"date":"2026-11-12T19:27:23","date_gmt":"2026-11-12T18:27:23","guid":{"rendered":"https:\/\/jpllamasmecanizados.com\/?page_id=2205"},"modified":"2026-11-12T22:11:08","modified_gmt":"2026-11-12T21:11:08","slug":"galeria","status":"publish","type":"page","link":"https:\/\/jpllamasmecanizados.com\/en\/galeria\/","title":{"rendered":"Galeria"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"2205\" class=\"elementor elementor-2205\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5638f88 e-con-full e-flex e-con e-parent\" data-id=\"5638f88\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7a0a47d elementor-widget__width-inherit elementor-widget elementor-widget-html\" data-id=\"7a0a47d\" 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<!-- ==============================================\n JP LLAMAS MECANIZADOS\n GALER\u00cdA COMPLETA \u00b7 FOTOS Y V\u00cdDEOS\n PEGAR EN UN SOLO WIDGET HTML DE ELEMENTOR\n============================================== -->\n\n<section id=\"jp-gallery\">\n\n  <!-- PORTADA -->\n  <header class=\"jpg-hero\">\n    <div class=\"jpg-hero-image\"><\/div>\n    <div class=\"jpg-hero-overlay\"><\/div>\n\n    <div class=\"jpg-shell jpg-hero-content\">\n\n      <div class=\"jpg-eyebrow\">\n        JP LLAMAS MECANIZADOS \u00b7 LORCA\n      <\/div>\n\n      <h1>\n        LA PRECISI\u00d3N\n        <span>EN CADA DETALLE.<\/span>\n      <\/h1>\n\n      <p>\n        Cada pieza cuenta una historia de precisi\u00f3n.\n        Descubre nuestros trabajos de mecanizado,\n        fabricaci\u00f3n y reparaci\u00f3n industrial.\n      <\/p>\n\n      <a href=\"#jpg-content\" class=\"jpg-button\">\n        EXPLORAR GALER\u00cdA\n        <span>\u2197<\/span>\n      <\/a>\n\n      <div class=\"jpg-hero-bottom\">\n        <span>PRECISI\u00d3N \u00b7 EXPERIENCIA \u00b7 TECNOLOG\u00cdA<\/span>\n        <span>DESLIZA PARA EXPLORAR \u2193<\/span>\n      <\/div>\n\n    <\/div>\n  <\/header>\n\n\n  <!-- GALER\u00cdA -->\n  <section class=\"jpg-main\" id=\"jpg-content\">\n    <div class=\"jpg-shell\">\n\n      <div class=\"jpg-heading\">\n        <div>\n          <div class=\"jpg-eyebrow\">\n            NUESTRO TRABAJO\n          <\/div>\n\n          <h2>\n            PROYECTOS\n            <span>REALES.<\/span>\n          <\/h2>\n        <\/div>\n\n        <p>\n          Una selecci\u00f3n de nuestros trabajos,\n          procesos y soluciones industriales.\n          Explora nuestras fotograf\u00edas y v\u00eddeos\n          o descubre cada especialidad.\n        <\/p>\n      <\/div>\n\n\n      <!-- CAMBIO DE VISTA -->\n      <div class=\"jpg-view-switch\">\n\n        <button type=\"button\"\n                class=\"jpg-view active\"\n                data-view=\"all\">\n          TODA LA GALER\u00cdA\n        <\/button>\n\n        <button type=\"button\"\n                class=\"jpg-view\"\n                data-view=\"projects\">\n          VER POR PROYECTOS\n        <\/button>\n\n      <\/div>\n\n\n      <!-- FILTROS -->\n      <div class=\"jpg-filters\">\n\n        <button class=\"jpg-filter active\"\n                data-cat=\"all\" type=\"button\">\n          TODOS\n        <\/button>\n\n        <button class=\"jpg-filter\"\n                data-cat=\"mandrinado\" type=\"button\">\n          MANDRINADOR PORT\u00c1TIL\n        <\/button>\n\n        <button class=\"jpg-filter\"\n                data-cat=\"maquinaria\" type=\"button\">\n          MAQUINARIA INDUSTRIAL\n        <\/button>\n\n        <button class=\"jpg-filter\"\n                data-cat=\"cnc\" type=\"button\">\n          FABRICACI\u00d3N CNC\n        <\/button>\n\n        <button class=\"jpg-filter\"\n                data-cat=\"torno\" type=\"button\">\n          TORNO GRAN VOLTEO\n        <\/button>\n\n        <button class=\"jpg-filter\"\n                data-cat=\"hidraulica\" type=\"button\">\n          BOTELLAS HIDR\u00c1ULICAS\n        <\/button>\n\n      <\/div>\n\n\n      <!-- RESULTADOS -->\n      <div class=\"jpg-results\">\n        <span id=\"jpg-label\">\n          TODAS LAS IM\u00c1GENES Y V\u00cdDEOS\n        <\/span>\n\n        <span id=\"jpg-count\"><\/span>\n      <\/div>\n\n\n      <!-- TARJETAS -->\n      <div class=\"jpg-grid\" id=\"jpg-grid\"><\/div>\n\n\n      <!-- SIN RESULTADOS -->\n      <div class=\"jpg-empty\" id=\"jpg-empty\" hidden>\n        <h3>PR\u00d3XIMAMENTE M\u00c1S TRABAJOS<\/h3>\n        <p>\n          Todav\u00eda no hay archivos\n          en esta categor\u00eda.\n        <\/p>\n      <\/div>\n\n\n      <!-- CARGAR M\u00c1S -->\n      <div class=\"jpg-more-area\">\n        <button id=\"jpg-more\" type=\"button\" hidden>\n          CARGAR M\u00c1S TRABAJOS +\n        <\/button>\n      <\/div>\n\n    <\/div>\n  <\/section>\n\n\n  <!-- CTA -->\n  <section class=\"jpg-cta\">\n    <div class=\"jpg-shell jpg-cta-content\">\n\n      <div>\n        <div class=\"jpg-eyebrow\">\n          \u00bfTIENES UN PROYECTO?\n        <\/div>\n\n        <h2>\n          TU IDEA.\n          <span>NUESTRA PRECISI\u00d3N.<\/span>\n        <\/h2>\n\n        <p>\n          Estudiamos tus necesidades para ofrecerte\n          una soluci\u00f3n de mecanizado a medida.\n        <\/p>\n      <\/div>\n\n      <a href=\"\/contacto\/\" class=\"jpg-button\">\n        SOLICITAR PRESUPUESTO\n        <span>\u2197<\/span>\n      <\/a>\n\n    <\/div>\n  <\/section>\n\n\n  <!-- VISOR MULTIMEDIA -->\n  <div id=\"jpg-modal\"\n       class=\"jpg-modal\"\n       role=\"dialog\"\n       aria-modal=\"true\"\n       aria-label=\"Visor multimedia\"\n       aria-hidden=\"true\"\n       tabindex=\"-1\">\n\n    <div class=\"jpg-modal-header\">\n      <div>\n        <strong>JP LLAMAS MECANIZADOS<\/strong>\n        <small id=\"jpg-modal-count\"><\/small>\n      <\/div>\n\n      <button id=\"jpg-close\"\n              type=\"button\"\n              class=\"jpg-close\"\n              aria-label=\"Cerrar visor\">\n        <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n          <path d=\"M5 5L19 19M19 5L5 19\"\/>\n        <\/svg>\n      <\/button>\n    <\/div>\n\n    <div class=\"jpg-modal-center\">\n\n      <button id=\"jpg-prev\"\n              class=\"jpg-arrow\"\n              type=\"button\"\n              aria-label=\"Anterior\">\n        <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n          <path d=\"M15 4L7 12L15 20\"\/>\n        <\/svg>\n      <\/button>\n\n      <div id=\"jpg-stage\" class=\"jpg-stage\"><\/div>\n\n      <button id=\"jpg-next\"\n              class=\"jpg-arrow\"\n              type=\"button\"\n              aria-label=\"Siguiente\">\n        <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n          <path d=\"M9 4L17 12L9 20\"\/>\n        <\/svg>\n      <\/button>\n\n    <\/div>\n\n    <div class=\"jpg-modal-footer\">\n      <strong id=\"jpg-modal-title\"><\/strong>\n      <span id=\"jpg-modal-cat\"><\/span>\n    <\/div>\n\n  <\/div>\n\n<\/section>\n\n\n<style>\n\n\/* =========================================\n   CONFIGURACI\u00d3N GENERAL\n========================================= *\/\n\n#jp-gallery {\n  --red: #C80000;\n  --red2: #EE2929;\n  --black: #050505;\n\n  position: relative;\n  left: 50%;\n  width: 100vw !important;\n  max-width: none !important;\n  margin-left: -50vw !important;\n  margin-right: 0 !important;\n\n  background: #050505;\n  color: #FFFFFF;\n  font-family: Arial, Helvetica, sans-serif;\n  overflow: clip;\n}\n\n#jp-gallery *,\n#jp-gallery *::before,\n#jp-gallery *::after {\n  box-sizing: border-box;\n}\n\n#jp-gallery [hidden] {\n  display: none !important;\n}\n\n#jp-gallery .jpg-shell {\n  width: min(1360px, calc(100% - 80px));\n  margin: 0 auto;\n}\n\n#jp-gallery button {\n  cursor: pointer;\n}\n\n#jp-gallery button:focus-visible,\n#jp-gallery a:focus-visible {\n  outline: 2px solid white;\n  outline-offset: 3px;\n}\n\n\n\/* =========================================\n   PORTADA\n========================================= *\/\n\n#jp-gallery .jpg-hero {\n  position: relative;\n  min-height: min(800px, 88svh);\n  display: flex;\n  align-items: center;\n  isolation: isolate;\n  overflow: hidden;\n  background: #080808;\n}\n\n#jp-gallery .jpg-hero-image {\n  position: absolute;\n  inset: 0;\n  z-index: -2;\n\n  background-image:\n    url(\"https:\/\/jpllamasmecanizados.com\/wp-content\/uploads\/2023\/05\/mandrinadorportatil.jpg\");\n\n  background-size: cover;\n  background-position: center;\n  animation: jpgZoom 15s ease-out both;\n}\n\n#jp-gallery .jpg-hero-overlay {\n  position: absolute;\n  inset: 0;\n  z-index: -1;\n\n  background:\n    linear-gradient(\n      90deg,\n      rgba(0,0,0,.97),\n      rgba(0,0,0,.80) 45%,\n      rgba(0,0,0,.35)\n    ),\n    linear-gradient(\n      0deg,\n      rgba(0,0,0,.90),\n      transparent 40%\n    );\n}\n\n#jp-gallery .jpg-hero::after {\n  content: \"\";\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: 5px;\n  background: var(--red);\n}\n\n#jp-gallery .jpg-hero-content {\n  position: relative;\n  padding: 105px 0 120px;\n}\n\n#jp-gallery .jpg-eyebrow {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  color: #DDDDDD;\n  font-size: 11px;\n  font-weight: 900;\n  letter-spacing: 2px;\n  line-height: 1.7;\n  text-transform: uppercase;\n}\n\n#jp-gallery .jpg-eyebrow::before {\n  content: \"\";\n  display: inline-block;\n  width: 32px;\n  height: 3px;\n  flex: 0 0 32px;\n  background: var(--red);\n}\n\n#jp-gallery .jpg-hero h1 {\n  max-width: 1050px;\n  margin: 28px 0 !important;\n  color: white !important;\n\n  font-size: clamp(50px, 7.4vw, 115px) !important;\n  font-weight: 900 !important;\n  line-height: .96 !important;\n  letter-spacing: -.06em;\n  text-transform: uppercase;\n}\n\n#jp-gallery .jpg-hero h1 span {\n  display: block;\n  color: var(--red2);\n}\n\n#jp-gallery .jpg-hero-content > p {\n  max-width: 580px;\n  margin: 0 0 32px;\n  color: #DEDEDE;\n  font-size: 17px;\n  line-height: 1.8;\n}\n\n#jp-gallery .jpg-button {\n  display: inline-flex;\n  justify-content: space-between;\n  align-items: center;\n  gap: 25px;\n\n  min-height: 57px;\n  padding: 16px 22px;\n  background: var(--red);\n  border: 1px solid var(--red);\n  border-radius: 4px;\n\n  color: #FFFFFF !important;\n  text-decoration: none !important;\n  font-size: 12px;\n  font-weight: 900;\n  letter-spacing: .5px;\n  transition: .2s ease;\n}\n\n#jp-gallery .jpg-button:hover {\n  background: #A60000;\n  color: white !important;\n  transform: translateY(-3px);\n}\n\n#jp-gallery .jpg-button span {\n  font-size: 23px;\n}\n\n#jp-gallery .jpg-hero-bottom {\n  position: absolute;\n  bottom: 35px;\n  left: 0;\n  right: 0;\n\n  display: flex;\n  justify-content: space-between;\n  gap: 20px;\n\n  color: #C6C6C6;\n  font-size: 10px;\n  font-weight: 800;\n  letter-spacing: 1.5px;\n}\n\n\n\/* =========================================\n   SECCI\u00d3N PRINCIPAL\n========================================= *\/\n\n#jp-gallery .jpg-main {\n  padding: 95px 0 110px;\n  scroll-margin-top: 100px;\n\n  background:\n    radial-gradient(\n      ellipse at 90% 5%,\n      rgba(200,0,0,.10),\n      transparent 42%\n    ),\n    #090909;\n}\n\n#jp-gallery .jpg-heading {\n  display: flex;\n  justify-content: space-between;\n  align-items: end;\n  gap: 40px;\n  margin-bottom: 40px;\n}\n\n#jp-gallery .jpg-heading h2 {\n  margin: 19px 0 0 !important;\n  color: #FFFFFF !important;\n\n  font-size: clamp(40px, 5vw, 68px) !important;\n  font-weight: 900 !important;\n  line-height: 1 !important;\n  letter-spacing: -2px;\n}\n\n#jp-gallery .jpg-heading h2 span {\n  display: block;\n  color: var(--red2);\n}\n\n#jp-gallery .jpg-heading > p {\n  max-width: 435px;\n  margin: 0;\n  color: #B8B8B8;\n  font-size: 14px;\n  line-height: 1.8;\n}\n\n\n\/* =========================================\n   PESTA\u00d1AS\n========================================= *\/\n\n#jp-gallery .jpg-view-switch {\n  display: inline-flex;\n  gap: 5px;\n  padding: 5px;\n  margin-bottom: 32px;\n\n  background: #191919;\n  border: 1px solid #343434;\n  border-radius: 7px;\n}\n\n#jp-gallery .jpg-view {\n  padding: 13px 20px;\n  min-height: 44px;\n  background: transparent;\n  border: 0;\n  border-radius: 5px;\n\n  color: #C7C7C7;\n  font-size: 11px;\n  font-weight: 900;\n  cursor: pointer;\n}\n\n#jp-gallery .jpg-view.active {\n  color: white;\n  background: var(--red);\n}\n\n\n\/* =========================================\n   FILTROS\n========================================= *\/\n\n#jp-gallery .jpg-filters {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 10px;\n  margin-bottom: 37px;\n}\n\n#jp-gallery .jpg-filter {\n  min-height: 45px;\n  padding: 12px 17px;\n\n  background: #151515;\n  border: 1px solid #373737;\n  border-radius: 4px;\n\n  color: #DDDDDD;\n  font-size: 11px;\n  font-weight: 800;\n  line-height: 1.4;\n\n  transition: .2s ease;\n}\n\n#jp-gallery .jpg-filter:hover {\n  border-color: var(--red);\n}\n\n#jp-gallery .jpg-filter.active {\n  color: white;\n  background: var(--red);\n  border-color: var(--red);\n}\n\n\n\/* =========================================\n   RESULTADOS\n========================================= *\/\n\n#jp-gallery .jpg-results {\n  display: flex;\n  justify-content: space-between;\n  gap: 15px;\n\n  padding-bottom: 17px;\n  margin-bottom: 20px;\n\n  border-bottom: 1px solid #383838;\n\n  color: #C9C9C9;\n  font-size: 10px;\n  font-weight: 900;\n  letter-spacing: 1.5px;\n}\n\n\n\/* =========================================\n   TARJETAS\n========================================= *\/\n\n#jp-gallery .jpg-grid {\n  display: grid;\n  grid-template-columns: repeat(3, minmax(0,1fr));\n  gap: 20px;\n}\n\n#jp-gallery .jpg-card {\n  position: relative;\n  display: block;\n  width: 100%;\n  min-width: 0;\n  padding: 0;\n\n  background: #131313;\n  border: 1px solid #292929;\n  border-radius: 5px;\n  overflow: hidden;\n\n  color: white;\n  text-align: left;\n\n  cursor: pointer;\n  appearance: none;\n\n  transition: transform .25s, border-color .25s;\n  animation: jpgAppear .35s ease both;\n}\n\n#jp-gallery .jpg-card:hover {\n  transform: translateY(-6px);\n  border-color: var(--red);\n}\n\n#jp-gallery .jpg-card-image {\n  display: block;\n  position: relative;\n  width: 100%;\n  aspect-ratio: 4\/3;\n  overflow: hidden;\n  background: #242424;\n}\n\n#jp-gallery .jpg-card-image img {\n  width: 100%;\n  height: 100%;\n  display: block;\n  object-fit: cover;\n  filter: saturate(.85) contrast(1.06);\n  transition: transform .4s ease;\n}\n\n#jp-gallery .jpg-card:hover img {\n  transform: scale(1.06);\n}\n\n#jp-gallery .jpg-card-image::after {\n  content: \"\";\n  position: absolute;\n  inset: 0;\n  background: linear-gradient(\n    0deg,\n    rgba(0,0,0,.55),\n    transparent 55%\n  );\n  pointer-events: none;\n}\n\n#jp-gallery .jpg-card-tag {\n  position: absolute;\n  z-index: 2;\n  top: 14px;\n  left: 14px;\n\n  padding: 8px 11px;\n\n  background: rgba(0,0,0,.86);\n  border-left: 3px solid var(--red);\n\n  color: white;\n  font-size: 9px;\n  font-weight: 900;\n  letter-spacing: .7px;\n  text-transform: uppercase;\n}\n\n#jp-gallery .jpg-card-arrow {\n  position: absolute;\n  z-index: 2;\n  right: 15px;\n  bottom: 15px;\n\n  display: grid;\n  place-items: center;\n\n  width: 43px;\n  height: 43px;\n\n  background: var(--red);\n  border-radius: 50%;\n  color: white;\n}\n\n#jp-gallery .jpg-card-arrow svg {\n  display: block;\n  width: 19px;\n  height: 19px;\n  fill: none;\n  stroke: white;\n  stroke-width: 2.2;\n  stroke-linecap: round;\n  stroke-linejoin: round;\n}\n\n#jp-gallery .jpg-play {\n  position: absolute;\n  z-index: 3;\n  top: 50%;\n  left: 50%;\n\n  display: grid;\n  place-items: center;\n  width: 66px;\n  height: 66px;\n\n  background: rgba(200,0,0,.9);\n  border: 2px solid white;\n  border-radius: 50%;\n\n  transform: translate(-50%, -50%);\n}\n\n#jp-gallery .jpg-play svg {\n  display: block;\n  width: 25px;\n  height: 25px;\n  fill: white;\n  margin-left: 3px;\n}\n\n#jp-gallery .jpg-card-body {\n  display: block;\n  padding: 20px 19px 22px;\n}\n\n#jp-gallery .jpg-card-kicker {\n  display: block;\n  margin-bottom: 9px;\n  color: #EF6262;\n  font-size: 10px;\n  font-weight: 900;\n  letter-spacing: 1.2px;\n}\n\n#jp-gallery .jpg-card-title {\n  display: block;\n  color: white;\n  font-size: 19px;\n  font-weight: 900;\n  line-height: 1.35;\n}\n\n#jp-gallery .jpg-card-desc {\n  display: block;\n  margin-top: 10px;\n  color: #BBBBBB;\n  font-size: 12px;\n  line-height: 1.7;\n}\n\n#jp-gallery .jpg-card-count {\n  display: block;\n  margin-top: 17px;\n  color: #CCCCCC;\n  font-size: 10px;\n  font-weight: 800;\n  letter-spacing: 1px;\n}\n\n\n\/* VISTA POR PROYECTOS *\/\n\n#jp-gallery .jpg-grid.projects {\n  grid-template-columns: repeat(2,minmax(0,1fr));\n}\n\n#jp-gallery .jpg-grid.projects\n.jpg-card-image {\n  aspect-ratio: 16\/10;\n}\n\n#jp-gallery .jpg-grid.projects\n.jpg-card-title {\n  font-size: 24px;\n}\n\n\n\/* =========================================\n   SIN RESULTADOS \/ CARGAR M\u00c1S\n========================================= *\/\n\n#jp-gallery .jpg-empty {\n  padding: 65px 20px;\n  text-align: center;\n  background: #111;\n  border: 1px dashed #444;\n}\n\n#jp-gallery .jpg-empty h3 {\n  color: white !important;\n  font-size: 23px;\n  font-weight: 900;\n}\n\n#jp-gallery .jpg-empty p {\n  color: #BBBBBB;\n}\n\n#jp-gallery .jpg-more-area {\n  display: flex;\n  justify-content: center;\n  margin-top: 38px;\n}\n\n#jp-gallery #jpg-more {\n  padding: 16px 25px;\n\n  background: #111;\n  color: white;\n  border: 1px solid #666;\n  border-radius: 4px;\n\n  font-size: 12px;\n  font-weight: 900;\n}\n\n#jp-gallery #jpg-more:hover {\n  border-color: var(--red);\n}\n\n\n\/* =========================================\n   CTA\n========================================= *\/\n\n#jp-gallery .jpg-cta {\n  position: relative;\n  padding: 90px 0;\n\n  background:\n    radial-gradient(\n      ellipse at 90% 50%,\n      rgba(200,0,0,.26),\n      transparent 50%\n    ),\n    #151515;\n\n  border-top: 1px solid #383838;\n}\n\n#jp-gallery .jpg-cta::before {\n  content: \"\";\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: 5px;\n  background: var(--red);\n}\n\n#jp-gallery .jpg-cta-content {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 40px;\n}\n\n#jp-gallery .jpg-cta h2 {\n  margin: 19px 0 !important;\n  color: white !important;\n  font-size: clamp(36px,4.5vw,67px) !important;\n  line-height: 1.06 !important;\n  font-weight: 900 !important;\n  letter-spacing: -2px;\n}\n\n#jp-gallery .jpg-cta h2 span {\n  display: block;\n  color: var(--red2);\n}\n\n#jp-gallery .jpg-cta p {\n  max-width: 560px;\n  margin: 0;\n  color: #C7C7C7;\n  font-size: 14px;\n  line-height: 1.8;\n}\n\n#jp-gallery .jpg-cta .jpg-button {\n  flex-shrink: 0;\n}\n\n\n\/* =========================================\n   VISOR A PANTALLA COMPLETA\n========================================= *\/\n\n.jpg-modal {\n  position: fixed !important;\n  inset: 0 !important;\n  z-index: 2147483000 !important;\n\n  display: none;\n  grid-template-rows:\n    76px minmax(0,1fr) 76px;\n\n  width: 100% !important;\n  height: 100dvh !important;\n\n  background: rgba(3,3,3,.98);\n  color: white;\n  font-family: Arial,Helvetica,sans-serif;\n\n  overflow: hidden;\n}\n\n.jpg-modal,\n.jpg-modal * {\n  box-sizing: border-box;\n}\n\n.jpg-modal.open {\n  display: grid !important;\n}\n\nbody.jpg-no-scroll {\n  overflow: hidden !important;\n}\n\n.jpg-modal button {\n  appearance: none !important;\n  padding: 0 !important;\n  margin: 0 !important;\n  min-width: 0 !important;\n  min-height: 0 !important;\n  box-shadow: none !important;\n  line-height: 1 !important;\n  cursor: pointer;\n}\n\n\n\/* CABECERA DEL VISOR *\/\n\n.jpg-modal-header {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  padding: 12px 28px;\n  border-bottom: 1px solid #333;\n}\n\n.jpg-modal-header > div {\n  display: flex;\n  flex-direction: column;\n  gap: 6px;\n}\n\n.jpg-modal-header strong {\n  color: white;\n  font-size: 11px;\n  font-weight: 900;\n  letter-spacing: 1.3px;\n}\n\n.jpg-modal-header small {\n  color: #BBBBBB;\n  font-size: 11px;\n}\n\n\n\/* BOT\u00d3N CERRAR CENTRADO *\/\n\n.jpg-modal .jpg-close {\n  display: grid !important;\n  place-items: center !important;\n\n  width: 48px !important;\n  height: 48px !important;\n\n  background: #202020 !important;\n  border: 1px solid #666 !important;\n  border-radius: 50% !important;\n\n  color: white !important;\n}\n\n.jpg-modal .jpg-close:hover {\n  background: #C80000 !important;\n  border-color: #C80000 !important;\n}\n\n.jpg-modal .jpg-close svg {\n  display: block;\n  width: 21px;\n  height: 21px;\n\n  fill: none;\n  stroke: white;\n  stroke-width: 2.3;\n  stroke-linecap: round;\n  stroke-linejoin: round;\n}\n\n\n\/* CENTRO DEL VISOR *\/\n\n.jpg-modal-center {\n  display: grid;\n  grid-template-columns:\n    68px minmax(0,1fr) 68px;\n  align-items: center;\n  gap: 10px;\n  padding: 16px 20px;\n\n  min-width: 0;\n  min-height: 0;\n}\n\n.jpg-stage {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n\n  width: 100%;\n  height: 100%;\n  min-width: 0;\n  min-height: 0;\n  overflow: hidden;\n}\n\n.jpg-stage img {\n  display: block;\n  width: auto !important;\n  height: auto !important;\n  max-width: 100% !important;\n  max-height: 100% !important;\n  object-fit: contain !important;\n}\n\n.jpg-stage video {\n  display: block;\n  width: min(100%,1100px);\n  max-height: 100%;\n  background: black;\n}\n\n\n\/* FLECHAS SVG CENTRADAS *\/\n\n.jpg-modal .jpg-arrow {\n  display: grid !important;\n  place-items: center !important;\n\n  justify-self: center;\n\n  width: 52px !important;\n  height: 58px !important;\n\n  background: #202020 !important;\n  border: 1px solid #555 !important;\n  border-radius: 6px !important;\n  color: white !important;\n}\n\n.jpg-modal .jpg-arrow:hover {\n  background: #C80000 !important;\n  border-color: #C80000 !important;\n}\n\n.jpg-modal .jpg-arrow svg {\n  display: block;\n  width: 25px;\n  height: 25px;\n\n  fill: none;\n  stroke: white;\n  stroke-width: 2.3;\n  stroke-linecap: round;\n  stroke-linejoin: round;\n}\n\n\n\/* PIE DEL VISOR *\/\n\n.jpg-modal-footer {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  gap: 20px;\n\n  padding: 15px 28px;\n  border-top: 1px solid #333;\n}\n\n.jpg-modal-footer strong {\n  color: white;\n  font-size: 12px;\n}\n\n.jpg-modal-footer span {\n  color: #EE7777;\n  font-size: 11px;\n  font-weight: 900;\n  text-align: right;\n  text-transform: uppercase;\n}\n\n\n\/* =========================================\n   ANIMACIONES\n========================================= *\/\n\n@keyframes jpgZoom {\n  from {transform: scale(1.10);}\n  to {transform: scale(1);}\n}\n\n@keyframes jpgAppear {\n  from {\n    opacity: 0;\n    transform: translateY(15px);\n  }\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\n\n\/* =========================================\n   TABLET\n========================================= *\/\n\n@media(max-width:1024px) {\n\n  #jp-gallery .jpg-shell {\n    width: calc(100% - 48px);\n  }\n\n  #jp-gallery .jpg-grid {\n    grid-template-columns:\n      repeat(2,minmax(0,1fr));\n  }\n\n  #jp-gallery .jpg-cta-content {\n    flex-direction: column;\n    align-items: flex-start;\n  }\n}\n\n\n\/* =========================================\n   M\u00d3VIL\n========================================= *\/\n\n@media(max-width:767px) {\n\n  #jp-gallery .jpg-shell {\n    width: calc(100% - 32px);\n  }\n\n  #jp-gallery .jpg-hero {\n    min-height: 80svh;\n  }\n\n  #jp-gallery .jpg-hero-content {\n    padding: 80px 0 95px;\n  }\n\n  #jp-gallery .jpg-hero h1 {\n    font-size:\n      clamp(42px,10.5vw,70px) !important;\n  }\n\n  #jp-gallery .jpg-hero-content > p {\n    font-size: 14px;\n  }\n\n  #jp-gallery .jpg-hero-bottom\n  span:last-child {\n    display: none;\n  }\n\n  #jp-gallery .jpg-main {\n    padding: 65px 0 75px;\n  }\n\n  #jp-gallery .jpg-heading {\n    display: block;\n  }\n\n  #jp-gallery .jpg-heading h2 {\n    font-size: 43px !important;\n  }\n\n  #jp-gallery .jpg-heading > p {\n    margin-top: 22px;\n  }\n\n  #jp-gallery .jpg-view-switch {\n    display: flex;\n    width: 100%;\n  }\n\n  #jp-gallery .jpg-view {\n    flex: 1;\n    padding: 12px 8px;\n    font-size: 10px;\n  }\n\n  #jp-gallery .jpg-filters {\n    flex-wrap: nowrap;\n    overflow-x: auto;\n    padding-bottom: 12px;\n  }\n\n  #jp-gallery .jpg-filter {\n    flex: 0 0 auto;\n    white-space: nowrap;\n  }\n\n  #jp-gallery .jpg-grid,\n  #jp-gallery .jpg-grid.projects {\n    grid-template-columns: 1fr;\n  }\n\n  #jp-gallery .jpg-grid.projects\n  .jpg-card-title {\n    font-size: 20px;\n  }\n\n  #jp-gallery .jpg-cta {\n    padding: 65px 0;\n  }\n\n  #jp-gallery .jpg-cta-content {\n    align-items: stretch;\n  }\n\n  #jp-gallery .jpg-cta h2 {\n    font-size: 40px !important;\n  }\n\n  .jpg-modal {\n    grid-template-rows:\n      65px minmax(0,1fr) 80px;\n  }\n\n  .jpg-modal-header {\n    padding: 10px 15px;\n  }\n\n  .jpg-modal .jpg-close {\n    width: 43px !important;\n    height: 43px !important;\n  }\n\n  .jpg-modal-center {\n    grid-template-columns: 1fr 1fr;\n    grid-template-rows:\n      minmax(0,1fr) 46px;\n\n    padding: 10px 15px;\n  }\n\n  .jpg-stage {\n    grid-column: 1 \/ -1;\n    grid-row: 1;\n  }\n\n  #jpg-prev {\n    grid-column: 1;\n    grid-row: 2;\n    justify-self: start;\n  }\n\n  #jpg-next {\n    grid-column: 2;\n    grid-row: 2;\n    justify-self: end;\n  }\n\n  .jpg-modal .jpg-arrow {\n    width: 46px !important;\n    height: 46px !important;\n  }\n\n  .jpg-modal-footer {\n    flex-direction: column;\n    align-items: flex-start;\n    justify-content: center;\n    gap: 5px;\n    padding: 10px 15px;\n  }\n\n  .jpg-modal-footer span {\n    text-align: left;\n  }\n}\n\n@media(prefers-reduced-motion:reduce) {\n  #jp-gallery *,\n  #jp-gallery *::before,\n  #jp-gallery *::after {\n    animation: none !important;\n    transition: none !important;\n  }\n}\n\n<\/style>\n\n\n<script>\n(function () {\n  \"use strict\";\n\n  function initGallery() {\n\n    const root = document.getElementById(\"jp-gallery\");\n\n    if (!root || root.dataset.ready === \"1\") return;\n\n    root.dataset.ready = \"1\";\n\n    \/* =====================================\n       CATEGOR\u00cdAS\n    ===================================== *\/\n\n    const labels = {\n      mandrinado: \"Mandrinador port\u00e1til\",\n      maquinaria: \"Maquinaria industrial\",\n      cnc: \"Fabricaci\u00f3n CNC\",\n      torno: \"Torno de gran volteo\",\n      hidraulica: \"Botellas hidr\u00e1ulicas\"\n    };\n\n\n    \/* =====================================\n       PROYECTOS\n    ===================================== *\/\n\n    const projects = [\n      {\n        id: \"mandrinado-01\",\n        title: \"Mandrinado port\u00e1til\",\n        category: \"mandrinado\",\n        description:\n          \"Trabajos, equipos y procesos de mandrinado port\u00e1til.\"\n      },\n      {\n        id: \"maquinaria-01\",\n        title: \"Maquinaria industrial\",\n        category: \"maquinaria\",\n        description:\n          \"Instalaciones, reparaci\u00f3n y mecanizado industrial.\"\n      },\n      {\n        id: \"cnc-01\",\n        title: \"Fabricaci\u00f3n CNC\",\n        category: \"cnc\",\n        description:\n          \"Trabajos de fabricaci\u00f3n y mecanizado CNC.\"\n      },\n      {\n        id: \"torno-01\",\n        title: \"Torno de gran volteo\",\n        category: \"torno\",\n        description:\n          \"Procesos de torneado de grandes dimensiones.\"\n      },\n      {\n        id: \"hidraulica-01\",\n        title: \"Botellas hidr\u00e1ulicas\",\n        category: \"hidraulica\",\n        description:\n          \"Trabajos relacionados con cilindros hidr\u00e1ulicos.\"\n      }\n    ];\n\n\n    \/* =====================================\n       ENLACES DE LA GALER\u00cdA\n\n       Son \u00fanicamente los que nos has pasado.\n\n       Para simplificar el mantenimiento,\n       organizamos todos los archivos por\n       categor\u00eda.\n\n       El c\u00f3digo reconoce autom\u00e1ticamente\n       los v\u00eddeos por su extensi\u00f3n .mp4.\n    ===================================== *\/\n\n    const base23 =\n      \"https:\/\/jpllamasmecanizados.com\/wp-content\/uploads\/2023\/05\/\";\n\n    const base26 =\n      \"https:\/\/jpllamasmecanizados.com\/wp-content\/uploads\/2026\/11\/\";\n\n\n    const files = {\n\n      \/* MANDRINADOR PORT\u00c1TIL: 6 *\/\n\n      mandrinado: [\n        base26 + \"MANDRINADOR-PORTATIL-2.mp4\",\n        base26 + \"MANDRINADOR-PORTATIL-1.mp4\",\n        base26 + \"MANDRINADOR-PORTATIL-3.mp4\",\n        base26 + \"mandrinador-4.mp4\",\n\n        base23 + \"mandrinador-.jpg\",\n        base23 + \"mandrinadorportatil.jpg\"\n      ],\n\n\n      \/* MAQUINARIA INDUSTRIAL: 6 *\/\n\n      maquinaria: [\n        base23 + \"photo_12_2023-03-16_17-43-00-2.jpg\",\n        base23 + \"reparacion.png\",\n        base23 + \"rsz_dsc_1147.png\",\n        base23 + \"TORNO-GRANDE.jpeg\",\n        base23 + \"tornovolteo.png\",\n        base23 + \"TORNO-GRANDE-1.jpg\"\n      ],\n\n\n      \/* FABRICACI\u00d3N CNC: 21 *\/\n\n      cnc: [\n        base26 + \"photo_1_2023-03-16_17-43-00.jpg\",\n        base26 + \"photo_11_2023-03-16_17-43-00.jpg\",\n        base26 + \"photo_15_2023-03-16_17-43-00.jpg\",\n        base26 + \"photo_31_2023-03-16_17-43-00.jpg\",\n\n        base23 + \"photo_9_2023-03-16_17-43-00.jpg\",\n        base23 + \"photo_13_2023-03-16_17-43-00.jpg\",\n        base23 + \"cnc2.png\",\n        base23 + \"cnc3.png\",\n        base23 + \"cnc4.png\",\n        base23 + \"cnc.png\",\n        base23 + \"jpllamas.png\",\n        base23 + \"photo_3_2023-03-16_17-43-00.jpg\",\n        base23 + \"cnc5.png\",\n\n        base26 + \"cnc8.mp4\",\n        base26 + \"cnc7.mp4\",\n        base26 + \"cnc6.mp4\",\n        base26 + \"cnc5.mp4\",\n        base26 + \"cnc4.mp4\",\n        base26 + \"cnc3.mp4\",\n        base26 + \"cnc2.mp4\",\n        base26 + \"CNC-1.mp4\"\n      ],\n\n\n      \/* TORNO GRAN VOLTEO: 8 *\/\n\n      torno: [\n        base26 + \"gran-volteo-5.mp4\",\n        base26 + \"TORNO-GRAN-VOLTEO-2.mp4\",\n        base23 + \"torno-gran-volteo-4.mp4\",\n\n        base23 + \"DSC_0050.MOV_00.10.png\",\n        base23 + \"tornovolteo.png\",\n        base23 + \"TORNO-GRANDE-1.jpg\",\n        base23 + \"TORNO-GRANDE.jpeg\",\n        base23 + \"rsz_dsc_1147.png\"\n      ],\n\n\n      \/* BOTELLAS HIDR\u00c1ULICAS: 5 *\/\n\n      hidraulica: [\n        base23 + \"photo_3_2023-03-16_17-43-00.jpg\",\n        base26 + \"photo_3_2023-03-16_17-43-00.jpg\",\n        base26 + \"photo_4_2023-03-16_17-43-00.jpg\",\n        base26 + \"photo_5_2023-03-16_17-43-00.jpg\",\n        base26 + \"photo_2_2023-03-16_17-43-00.jpg\"\n      ]\n\n    };\n\n\n    \/* =====================================\n       PORTADAS DE V\u00cdDEOS\n\n       Usamos im\u00e1genes propias de JP Llamas.\n       Estas portadas son provisionales.\n    ===================================== *\/\n\n    const posters = {\n\n      mandrinado:\n        base23 + \"mandrinadorportatil.jpg\",\n\n      maquinaria:\n        base23 + \"reparacion.png\",\n\n      cnc:\n        base23 + \"cnc2.png\",\n\n      torno:\n        base23 + \"TORNO-GRANDE.jpeg\",\n\n      hidraulica:\n        base26 + \"photo_4_2023-03-16_17-43-00.jpg\"\n\n    };\n\n\n    \/* =====================================\n       CONSTRUIR CAT\u00c1LOGO\n    ===================================== *\/\n\n    const media = [];\n\n    Object.keys(files).forEach(function (category) {\n\n      files[category].forEach(function (url, index) {\n\n        const video = \/\\.mp4(?:\\?|$)\/i.test(url);\n\n        media.push({\n          type: video ? \"video\" : \"image\",\n          src: url,\n          poster: video ? posters[category] : \"\",\n          title: labels[category] +\n            \" \u00b7 \" +\n            (video ? \"V\u00eddeo \" : \"Fotograf\u00eda \") +\n            String(index + 1).padStart(2, \"0\"),\n          category: category,\n          project: category + \"-01\"\n        });\n\n      });\n\n    });\n\n\n    \/* =====================================\n       ELEMENTOS\n    ===================================== *\/\n\n    const grid = root.querySelector(\"#jpg-grid\");\n    const empty = root.querySelector(\"#jpg-empty\");\n    const count = root.querySelector(\"#jpg-count\");\n    const label = root.querySelector(\"#jpg-label\");\n    const more = root.querySelector(\"#jpg-more\");\n\n    const modal = root.querySelector(\"#jpg-modal\");\n    const stage = modal.querySelector(\"#jpg-stage\");\n\n    const modalTitle =\n      modal.querySelector(\"#jpg-modal-title\");\n\n    const modalCat =\n      modal.querySelector(\"#jpg-modal-cat\");\n\n    const modalCount =\n      modal.querySelector(\"#jpg-modal-count\");\n\n    const closeButton =\n      modal.querySelector(\"#jpg-close\");\n\n    \/* Mover visor fuera de Elementor *\/\n    document.body.appendChild(modal);\n\n    let currentCat = \"all\";\n    let currentView = \"all\";\n    let visibleLimit = 12;\n\n    let activeItems = [];\n    let activeIndex = 0;\n    let previousFocus = null;\n\n\n    \/* =====================================\n       UTILIDADES\n    ===================================== *\/\n\n    function el(tag, className, text) {\n      const node = document.createElement(tag);\n\n      if (className) node.className = className;\n\n      if (text !== undefined) {\n        node.textContent = text;\n      }\n\n      return node;\n    }\n\n    const arrowSVG =\n      '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">' +\n      '<path d=\"M5 19L19 5M7 5H19V17\"\/>' +\n      '<\/svg>';\n\n    const playSVG =\n      '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">' +\n      '<path d=\"M7 4L21 12L7 20Z\"\/>' +\n      '<\/svg>';\n\n\n    \/* =====================================\n       FILTRAR ARCHIVOS\n    ===================================== *\/\n\n    function filteredMedia() {\n      return media.filter(function (item) {\n        return currentCat === \"all\" ||\n          item.category === currentCat;\n      });\n    }\n\n    function getProjectMedia(id) {\n      return media.filter(function (item) {\n        return item.project === id;\n      });\n    }\n\n    function filteredProjects() {\n      return projects.filter(function (project) {\n        return (\n          currentCat === \"all\" ||\n          project.category === currentCat\n        ) && getProjectMedia(project.id).length > 0;\n      }).map(function (project) {\n\n        const items = getProjectMedia(project.id);\n\n        const imageCover =\n          items.find(function (item) {\n            return item.type === \"image\";\n          });\n\n        return {\n          ...project,\n          items: items,\n          cover: imageCover\n            ? imageCover.src\n            : items[0].poster\n        };\n\n      });\n    }\n\n\n    \/* =====================================\n       CREAR TARJETA\n    ===================================== *\/\n\n    function createCard(item, index, list, isProject) {\n\n      const card = el(\"button\", \"jpg-card\");\n      card.type = \"button\";\n\n      card.style.animationDelay =\n        Math.min(index * 40, 350) + \"ms\";\n\n      const picture = el(\n        \"span\", \"jpg-card-image\"\n      );\n\n      const image = document.createElement(\"img\");\n\n      image.src = isProject\n        ? item.cover\n        : (\n            item.type === \"video\"\n              ? item.poster\n              : item.src\n          );\n\n      image.alt = item.title;\n      image.loading = \"lazy\";\n      image.decoding = \"async\";\n\n      picture.appendChild(image);\n\n      picture.appendChild(\n        el(\n          \"span\",\n          \"jpg-card-tag\",\n          labels[item.category]\n        )\n      );\n\n      if (!isProject && item.type === \"video\") {\n        const play = el(\"span\", \"jpg-play\");\n        play.innerHTML = playSVG;\n\n        play.setAttribute(\"aria-hidden\", \"true\");\n        picture.appendChild(play);\n      }\n\n      const arrow = el(\"span\", \"jpg-card-arrow\");\n      arrow.innerHTML = arrowSVG;\n      arrow.setAttribute(\"aria-hidden\", \"true\");\n\n      picture.appendChild(arrow);\n\n      const body = el(\"span\", \"jpg-card-body\");\n\n      body.appendChild(\n        el(\n          \"span\",\n          \"jpg-card-kicker\",\n          isProject ? \"PROYECTO\" : \"NUESTRO TRABAJO\"\n        )\n      );\n\n      body.appendChild(\n        el(\"span\", \"jpg-card-title\", item.title)\n      );\n\n      if (isProject) {\n\n        body.appendChild(\n          el(\n            \"span\",\n            \"jpg-card-desc\",\n            item.description\n          )\n        );\n\n        body.appendChild(\n          el(\n            \"span\",\n            \"jpg-card-count\",\n            item.items.length + \" ARCHIVOS DISPONIBLES\"\n          )\n        );\n\n      }\n\n      card.setAttribute(\n        \"aria-label\",\n        (isProject\n          ? \"Abrir proyecto \"\n          : \"Ampliar \") + item.title\n      );\n\n      card.addEventListener(\"click\", function () {\n        if (isProject) {\n          openModal(item.items, 0);\n        } else {\n          openModal(list, index);\n        }\n      });\n\n      card.appendChild(picture);\n      card.appendChild(body);\n\n      return card;\n    }\n\n\n    \/* =====================================\n       DIBUJAR GALER\u00cdA\n    ===================================== *\/\n\n    function render() {\n\n      const isProject = currentView === \"projects\";\n\n      const items = isProject\n        ? filteredProjects()\n        : filteredMedia();\n\n      grid.classList.toggle(\n        \"projects\", isProject\n      );\n\n      const fragment =\n        document.createDocumentFragment();\n\n      items.slice(0, visibleLimit)\n        .forEach(function (item, index) {\n\n          fragment.appendChild(\n            createCard(\n              item,\n              index,\n              items,\n              isProject\n            )\n          );\n\n        });\n\n      grid.replaceChildren(fragment);\n\n      label.textContent = isProject\n        ? \"PROYECTOS DE JP LLAMAS\"\n        : (\n            currentCat === \"all\"\n              ? \"TODAS LAS IM\u00c1GENES Y V\u00cdDEOS\"\n              : labels[currentCat].toUpperCase()\n          );\n\n      count.textContent =\n        items.length +\n        (isProject ? \" PROYECTOS\" : \" ARCHIVOS\");\n\n      empty.hidden = items.length > 0;\n      more.hidden = items.length <= visibleLimit;\n    }\n\n\n    \/* =====================================\n       FILTROS\n    ===================================== *\/\n\n    root.querySelectorAll(\".jpg-filter\")\n      .forEach(function (button) {\n\n        button.addEventListener(\"click\", function () {\n\n          currentCat = button.dataset.cat;\n          visibleLimit = 12;\n\n          root.querySelectorAll(\".jpg-filter\")\n            .forEach(function (b) {\n              b.classList.toggle(\n                \"active\", b === button\n              );\n            });\n\n          render();\n        });\n\n      });\n\n\n    \/* =====================================\n       CAMBIAR VISTA\n    ===================================== *\/\n\n    root.querySelectorAll(\".jpg-view\")\n      .forEach(function (button) {\n\n        button.addEventListener(\"click\", function () {\n\n          currentView = button.dataset.view;\n          visibleLimit = 12;\n\n          root.querySelectorAll(\".jpg-view\")\n            .forEach(function (b) {\n              b.classList.toggle(\n                \"active\", b === button\n              );\n            });\n\n          render();\n        });\n\n      });\n\n\n    \/* =====================================\n       CARGAR M\u00c1S\n    ===================================== *\/\n\n    more.addEventListener(\"click\", function () {\n      visibleLimit += 12;\n      render();\n    });\n\n\n    \/* =====================================\n       VISOR MULTIMEDIA\n    ===================================== *\/\n\n    function showItem() {\n\n      const item = activeItems[activeIndex];\n\n      if (!item) return;\n\n      stage.replaceChildren();\n\n      let element;\n\n      if (item.type === \"video\") {\n\n        element = document.createElement(\"video\");\n        element.src = item.src;\n        element.controls = true;\n        element.playsInline = true;\n        element.preload = \"metadata\";\n\n        if (item.poster) {\n          element.poster = item.poster;\n        }\n\n      } else {\n\n        element = document.createElement(\"img\");\n        element.src = item.src;\n        element.alt = item.title;\n\n      }\n\n      stage.appendChild(element);\n\n      modalTitle.textContent = item.title;\n      modalCat.textContent = labels[item.category];\n\n      modalCount.textContent =\n        String(activeIndex + 1).padStart(2, \"0\") +\n        \" \/ \" +\n        String(activeItems.length).padStart(2, \"0\");\n    }\n\n\n    function openModal(items, index) {\n\n      activeItems = items;\n      activeIndex = index;\n      previousFocus = document.activeElement;\n\n      modal.classList.add(\"open\");\n      modal.setAttribute(\"aria-hidden\", \"false\");\n\n      document.body.classList.add(\n        \"jpg-no-scroll\"\n      );\n\n      showItem();\n      closeButton.focus();\n    }\n\n\n    function move(direction) {\n\n      activeIndex =\n        (\n          activeIndex +\n          direction +\n          activeItems.length\n        ) % activeItems.length;\n\n      showItem();\n    }\n\n\n    function closeModal() {\n\n      modal.classList.remove(\"open\");\n      modal.setAttribute(\"aria-hidden\", \"true\");\n\n      stage.replaceChildren();\n\n      document.body.classList.remove(\n        \"jpg-no-scroll\"\n      );\n\n      if (\n        previousFocus &&\n        document.contains(previousFocus)\n      ) {\n        previousFocus.focus();\n      }\n    }\n\n\n    modal.querySelector(\"#jpg-prev\")\n      .addEventListener(\"click\", function () {\n        move(-1);\n      });\n\n    modal.querySelector(\"#jpg-next\")\n      .addEventListener(\"click\", function () {\n        move(1);\n      });\n\n    closeButton.addEventListener(\n      \"click\", closeModal\n    );\n\n\n    modal.addEventListener(\"click\", function (event) {\n      if (\n        event.target === modal ||\n        event.target === stage\n      ) {\n        closeModal();\n      }\n    });\n\n\n    \/* =====================================\n       CONTROL POR TECLADO\n    ===================================== *\/\n\n    document.addEventListener(\"keydown\", function (e) {\n\n      if (!modal.classList.contains(\"open\")) {\n        return;\n      }\n\n      if (e.key === \"Escape\") {\n        e.preventDefault();\n        closeModal();\n      }\n\n      if (e.key === \"ArrowLeft\") {\n        e.preventDefault();\n        move(-1);\n      }\n\n      if (e.key === \"ArrowRight\") {\n        e.preventDefault();\n        move(1);\n      }\n\n      if (e.key === \"Tab\") {\n        const controls = Array.from(\n          modal.querySelectorAll(\n            \"button, video[controls]\"\n          )\n        ).filter(function (node) {\n          return node.getClientRects().length > 0;\n        });\n\n        if (!controls.length) return;\n\n        const first = controls[0];\n        const last = controls[controls.length - 1];\n\n        if (\n          e.shiftKey &&\n          document.activeElement === first\n        ) {\n          e.preventDefault();\n          last.focus();\n        }\n\n        if (\n          !e.shiftKey &&\n          document.activeElement === last\n        ) {\n          e.preventDefault();\n          first.focus();\n        }\n      }\n    });\n\n\n    \/* =====================================\n       INICIAR\n    ===================================== *\/\n\n    render();\n  }\n\n  if (document.readyState === \"loading\") {\n    document.addEventListener(\n      \"DOMContentLoaded\",\n      initGallery\n    );\n  } else {\n    initGallery();\n  }\n\n  window.addEventListener(\"load\", initGallery);\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>JP LLAMAS MECANIZADOS \u00b7 LORCA LA PRECISI\u00d3N EN CADA DETALLE. Cada pieza cuenta una historia de precisi\u00f3n. Descubre nuestros trabajos de mecanizado, fabricaci\u00f3n y reparaci\u00f3n industrial. EXPLORAR GALER\u00cdA \u2197 PRECISI\u00d3N \u00b7 EXPERIENCIA \u00b7 TECNOLOG\u00cdA DESLIZA PARA EXPLORAR \u2193 NUESTRO TRABAJO PROYECTOS REALES. Una selecci\u00f3n de nuestros trabajos, procesos y soluciones industriales. Explora nuestras fotograf\u00edas y [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"_monsterinsights_skip_tracking":false,"footnotes":""},"class_list":["post-2205","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Trabajos de Mecanizado Industrial | JP Llamas<\/title>\n<meta name=\"description\" content=\"Explora nuestros trabajos de mecanizado industrial en Lorca (Murcia): fabricaci\u00f3n CNC, mandrinado port\u00e1til y torno de gran volteo.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/jpllamasmecanizados.com\/en\/galeria\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Trabajos de Mecanizado Industrial | JP Llamas\" \/>\n<meta property=\"og:description\" content=\"Explora nuestros trabajos de mecanizado industrial en Lorca (Murcia): fabricaci\u00f3n CNC, mandrinado port\u00e1til y torno de gran volteo.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/jpllamasmecanizados.com\/en\/galeria\/\" \/>\n<meta property=\"og:site_name\" content=\"JPLlamas Mecanizado\" \/>\n<meta property=\"article:modified_time\" content=\"2026-11-12T21:11:08+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/jpllamasmecanizados.com\\\/galeria\\\/\",\"url\":\"https:\\\/\\\/jpllamasmecanizados.com\\\/galeria\\\/\",\"name\":\"Trabajos de Mecanizado Industrial | JP Llamas\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/jpllamasmecanizados.com\\\/#website\"},\"datePublished\":\"2026-11-12T18:27:23+00:00\",\"dateModified\":\"2026-11-12T21:11:08+00:00\",\"description\":\"Explora nuestros trabajos de mecanizado industrial en Lorca (Murcia): fabricaci\u00f3n CNC, mandrinado port\u00e1til y torno de gran volteo.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/jpllamasmecanizados.com\\\/galeria\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/jpllamasmecanizados.com\\\/galeria\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/jpllamasmecanizados.com\\\/galeria\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/jpllamasmecanizados.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Galeria\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/jpllamasmecanizados.com\\\/#website\",\"url\":\"https:\\\/\\\/jpllamasmecanizados.com\\\/\",\"name\":\"JP LLAMAS MECANIZADOS\",\"description\":\"Construcci\u00f3n y Reparaci\u00f3n de Piezas\",\"publisher\":{\"@id\":\"https:\\\/\\\/jpllamasmecanizados.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/jpllamasmecanizados.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/jpllamasmecanizados.com\\\/#organization\",\"name\":\"JP LLAMAS MECANIZADOS\",\"url\":\"https:\\\/\\\/jpllamasmecanizados.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/jpllamasmecanizados.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/jpllamasmecanizados.com\\\/wp-content\\\/uploads\\\/2023\\\/05\\\/cropped-e752c3a8-1b17-4263-93c8-468699016c1a-1-e1794325512506.png\",\"contentUrl\":\"https:\\\/\\\/jpllamasmecanizados.com\\\/wp-content\\\/uploads\\\/2023\\\/05\\\/cropped-e752c3a8-1b17-4263-93c8-468699016c1a-1-e1794325512506.png\",\"width\":1523,\"height\":435,\"caption\":\"JP LLAMAS MECANIZADOS\"},\"image\":{\"@id\":\"https:\\\/\\\/jpllamasmecanizados.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Trabajos de Mecanizado Industrial | JP Llamas","description":"Explora nuestros trabajos de mecanizado industrial en Lorca (Murcia): fabricaci\u00f3n CNC, mandrinado port\u00e1til y torno de gran volteo.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/jpllamasmecanizados.com\/en\/galeria\/","og_locale":"en_US","og_type":"article","og_title":"Trabajos de Mecanizado Industrial | JP Llamas","og_description":"Explora nuestros trabajos de mecanizado industrial en Lorca (Murcia): fabricaci\u00f3n CNC, mandrinado port\u00e1til y torno de gran volteo.","og_url":"https:\/\/jpllamasmecanizados.com\/en\/galeria\/","og_site_name":"JPLlamas Mecanizado","article_modified_time":"2026-11-12T21:11:08+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/jpllamasmecanizados.com\/galeria\/","url":"https:\/\/jpllamasmecanizados.com\/galeria\/","name":"Trabajos de Mecanizado Industrial | JP Llamas","isPartOf":{"@id":"https:\/\/jpllamasmecanizados.com\/#website"},"datePublished":"2026-11-12T18:27:23+00:00","dateModified":"2026-11-12T21:11:08+00:00","description":"Explora nuestros trabajos de mecanizado industrial en Lorca (Murcia): fabricaci\u00f3n CNC, mandrinado port\u00e1til y torno de gran volteo.","breadcrumb":{"@id":"https:\/\/jpllamasmecanizados.com\/galeria\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/jpllamasmecanizados.com\/galeria\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/jpllamasmecanizados.com\/galeria\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/jpllamasmecanizados.com\/"},{"@type":"ListItem","position":2,"name":"Galeria"}]},{"@type":"WebSite","@id":"https:\/\/jpllamasmecanizados.com\/#website","url":"https:\/\/jpllamasmecanizados.com\/","name":"JP FLAMES MACHINED","description":"Construcci\u00f3n y Reparaci\u00f3n de Piezas","publisher":{"@id":"https:\/\/jpllamasmecanizados.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/jpllamasmecanizados.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/jpllamasmecanizados.com\/#organization","name":"JP FLAMES MACHINED","url":"https:\/\/jpllamasmecanizados.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/jpllamasmecanizados.com\/#\/schema\/logo\/image\/","url":"https:\/\/jpllamasmecanizados.com\/wp-content\/uploads\/2023\/05\/cropped-e752c3a8-1b17-4263-93c8-468699016c1a-1-e1794325512506.png","contentUrl":"https:\/\/jpllamasmecanizados.com\/wp-content\/uploads\/2023\/05\/cropped-e752c3a8-1b17-4263-93c8-468699016c1a-1-e1794325512506.png","width":1523,"height":435,"caption":"JP LLAMAS MECANIZADOS"},"image":{"@id":"https:\/\/jpllamasmecanizados.com\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/jpllamasmecanizados.com\/en\/wp-json\/wp\/v2\/pages\/2205","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jpllamasmecanizados.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/jpllamasmecanizados.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/jpllamasmecanizados.com\/en\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/jpllamasmecanizados.com\/en\/wp-json\/wp\/v2\/comments?post=2205"}],"version-history":[{"count":16,"href":"https:\/\/jpllamasmecanizados.com\/en\/wp-json\/wp\/v2\/pages\/2205\/revisions"}],"predecessor-version":[{"id":2236,"href":"https:\/\/jpllamasmecanizados.com\/en\/wp-json\/wp\/v2\/pages\/2205\/revisions\/2236"}],"wp:attachment":[{"href":"https:\/\/jpllamasmecanizados.com\/en\/wp-json\/wp\/v2\/media?parent=2205"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}