{"id":5535,"date":"2026-03-04T17:27:58","date_gmt":"2026-03-04T16:27:58","guid":{"rendered":"https:\/\/teetimespain.com\/?page_id=5535"},"modified":"2026-03-23T09:39:47","modified_gmt":"2026-03-23T08:39:47","slug":"barcos","status":"publish","type":"page","link":"https:\/\/teetimespain.com\/es\/barcos\/","title":{"rendered":"Barcos"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"5535\" class=\"elementor elementor-5535\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-91eb8c3 e-flex e-con-boxed e-con e-parent\" data-id=\"91eb8c3\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-64b73e9 elementor-widget elementor-widget-html\" data-id=\"64b73e9\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n  <meta charset=\"UTF-8\" \/>\r\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" \/>\r\n  <title>Boat Booking<\/title>\r\n  <style>\r\n    :root{\r\n      --bg:#f4f7fb;\r\n      --card:#ffffff;\r\n      --text:#0f1720;\r\n      --muted:#5f6b7a;\r\n      --line:#d8e1eb;\r\n      --sea:#0f2740;\r\n      --sea-2:#163f66;\r\n      --gold:#c7a86b;\r\n      --gold-2:#9b7a3f;\r\n      --ok:#1e7b50;\r\n      --danger:#b42318;\r\n      --shadow:0 18px 46px rgba(2,12,27,.10);\r\n      --radius:22px;\r\n    }\r\n\r\n    *{box-sizing:border-box}\r\n    html{scroll-behavior:smooth}\r\n    body{\r\n      margin:0;\r\n      font-family:Arial, Helvetica, sans-serif;\r\n      background:var(--bg);\r\n      color:var(--text);\r\n    }\r\n\r\n    .hero{\r\n      min-height:64vh;\r\n      padding:38px 14px 96px;\r\n      background:\r\n        linear-gradient(rgba(6,18,31,.45), rgba(6,18,31,.72)),\r\n        url('https:\/\/images.unsplash.com\/photo-1507525428034-b723cf961d3e?auto=format&fit=crop&w=1800&q=80') center\/cover no-repeat;\r\n      display:flex;\r\n      align-items:center;\r\n    }\r\n\r\n    .wrap{\r\n      width:min(1880px, calc(100% - 18px));\r\n      margin:0 auto;\r\n    }\r\n\r\n    .hero-box{\r\n      max-width:1000px;\r\n      background:rgba(255,255,255,.96);\r\n      border:1px solid rgba(255,255,255,.45);\r\n      backdrop-filter:blur(10px);\r\n      border-radius:30px;\r\n      padding:40px;\r\n      box-shadow:0 24px 60px rgba(2,12,27,.18);\r\n    }\r\n\r\n    .eyebrow{\r\n      display:inline-block;\r\n      font-size:13px;\r\n      font-weight:800;\r\n      text-transform:uppercase;\r\n      letter-spacing:.18em;\r\n      color:var(--gold-2);\r\n      margin-bottom:14px;\r\n      padding:8px 14px;\r\n      border-radius:999px;\r\n      background:rgba(199,168,107,.14);\r\n    }\r\n\r\n    h1,h2,h3,h4{margin:0;line-height:1.14}\r\n    h1{font-size:clamp(52px, 7vw, 92px); margin-bottom:16px; font-weight:900; color:#0b2037}\r\n    h2{font-size:clamp(30px, 4vw, 50px)}\r\n    h3{font-size:28px}\r\n    p{line-height:1.75}\r\n\r\n    .hero-box p{margin:0; font-size:21px; color:#1f3347; font-weight:600; line-height:1.85}\r\n\r\n    .main{\r\n      margin-top:-64px;\r\n      padding:0 0 40px;\r\n    }\r\n\r\n    .section-card{\r\n      background:var(--card);\r\n      border:1px solid #e7edf4;\r\n      border-radius:28px;\r\n      box-shadow:var(--shadow);\r\n      padding:30px;\r\n      margin-bottom:24px;\r\n    }\r\n\r\n    .section-head{margin-bottom:18px}\r\n    .section-head p{margin:10px 0 0; color:var(--muted); font-size:16px}\r\n\r\n    .catalog-alert{\r\n      color:#c1121f;\r\n      font-weight:900;\r\n      font-size:19px;\r\n      line-height:1.75;\r\n      background:rgba(193,18,31,.06);\r\n      border:1px solid rgba(193,18,31,.22);\r\n      padding:12px 14px;\r\n      border-radius:14px;\r\n      margin-top:12px;\r\n    }\r\n\r\n    .category-block{margin-top:22px}\r\n    .category-head{\r\n      margin-bottom:16px;\r\n      padding-bottom:12px;\r\n      border-bottom:1px solid #e8eef5;\r\n    }\r\n    .category-head h3{font-size:25px; color:var(--sea)}\r\n\r\n    .boats-grid{\r\n      display:grid;\r\n      grid-template-columns:repeat(3, minmax(0, 1fr));\r\n      gap:24px;\r\n    }\r\n\r\n    .boat-card{\r\n      border:1px solid var(--line);\r\n      border-radius:22px;\r\n      overflow:hidden;\r\n      background:#fff;\r\n      display:flex;\r\n      flex-direction:column;\r\n      min-height:100%;\r\n    }\r\n\r\n    .boat-media{\r\n      height:260px;\r\n      background-size:cover;\r\n      background-position:center;\r\n      position:relative;\r\n    }\r\n\r\n    .boat-media::after{\r\n      content:'';\r\n      position:absolute;\r\n      inset:0;\r\n      background:linear-gradient(180deg, rgba(0,0,0,.04), rgba(0,0,0,.28));\r\n    }\r\n\r\n    .boat-body{padding:22px; display:flex; flex-direction:column; flex:1}\r\n    .boat-body p{margin:10px 0 16px; color:var(--muted); font-size:15px}\r\n\r\n    .meta-list{\r\n      display:grid;\r\n      gap:8px;\r\n      margin-bottom:16px;\r\n      padding:14px;\r\n      border:1px solid #e9eef5;\r\n      border-radius:16px;\r\n      background:#f8fbff;\r\n    }\r\n\r\n    .meta-list div{\r\n      font-size:14px;\r\n      color:#334155;\r\n      line-height:1.6;\r\n    }\r\n\r\n    .price{\r\n      margin-top:auto;\r\n      font-size:30px;\r\n      font-weight:800;\r\n      color:var(--sea);\r\n    }\r\n\r\n    .price small{\r\n      font-size:14px;\r\n      font-weight:700;\r\n      color:var(--muted);\r\n    }\r\n\r\n    .boat-actions{\r\n      display:flex;\r\n      gap:10px;\r\n      margin-top:18px;\r\n      flex-wrap:wrap;\r\n    }\r\n\r\n    .btn{\r\n      border:none;\r\n      min-height:52px;\r\n      padding:13px 18px;\r\n      border-radius:999px;\r\n      font-size:14px;\r\n      font-weight:800;\r\n      cursor:pointer;\r\n      font-family:inherit;\r\n      transition:transform .18s ease, box-shadow .18s ease, filter .18s ease;\r\n      box-shadow:0 12px 24px rgba(15,39,64,.14);\r\n    }\r\n\r\n    .btn:hover{\r\n      transform:translateY(-2px);\r\n      filter:brightness(1.03);\r\n      box-shadow:0 16px 30px rgba(15,39,64,.18);\r\n    }\r\n\r\n    .btn:active,\r\n    .slot-btn:active{\r\n      transform:scale(.97);\r\n    }\r\n\r\n    .btn-primary{\r\n      background:linear-gradient(135deg,var(--gold),var(--gold-2));\r\n      color:#fff;\r\n    }\r\n\r\n    .booking-box{scroll-margin-top:24px}\r\n\r\n    .booking-layout{\r\n      display:grid;\r\n      grid-template-columns:1.2fr .8fr;\r\n      gap:24px;\r\n      align-items:start;\r\n    }\r\n\r\n    .form-box,\r\n    .summary-box{\r\n      border:1px solid #e7edf4;\r\n      border-radius:22px;\r\n      padding:22px;\r\n      background:#fbfdff;\r\n    }\r\n\r\n    .reserve-grid{\r\n      display:grid;\r\n      grid-template-columns:repeat(2, minmax(0,1fr));\r\n      gap:16px;\r\n    }\r\n\r\n    label{\r\n      display:block;\r\n      font-size:13px;\r\n      font-weight:800;\r\n      margin-bottom:8px;\r\n      color:#334155;\r\n    }\r\n\r\n    input, select, button{\r\n      width:100%;\r\n      min-height:52px;\r\n      padding:12px 14px;\r\n      border-radius:14px;\r\n      border:1px solid #cfdae6;\r\n      font-size:15px;\r\n      font-family:inherit;\r\n    }\r\n\r\n    input:focus, select:focus{\r\n      outline:none;\r\n      border-color:#89a7c7;\r\n      box-shadow:0 0 0 4px rgba(137,167,199,.12);\r\n    }\r\n\r\n    .full{grid-column:1 \/ -1}\r\n\r\n    .slots{\r\n      display:grid;\r\n      grid-template-columns:repeat(3, minmax(0,1fr));\r\n      gap:10px;\r\n    }\r\n\r\n    .slot-btn{\r\n      background:#fff;\r\n      color:#13283f;\r\n      font-weight:700;\r\n      cursor:pointer;\r\n      transition:transform .18s ease, box-shadow .18s ease, filter .18s ease;\r\n    }\r\n\r\n    .slot-btn:hover{\r\n      transform:translateY(-1px);\r\n      box-shadow:0 10px 20px rgba(15,39,64,.10);\r\n    }\r\n\r\n    .slot-btn.active{\r\n      border-color:transparent;\r\n      background:linear-gradient(135deg,var(--gold),var(--gold-2));\r\n      color:#fff;\r\n    }\r\n\r\n    .slot-btn[disabled]{\r\n      cursor:not-allowed;\r\n      opacity:.55;\r\n      transform:none !important;\r\n      box-shadow:none !important;\r\n      filter:none !important;\r\n    }\r\n\r\n    .summary-line{\r\n      display:flex;\r\n      justify-content:space-between;\r\n      gap:12px;\r\n      padding:12px 0;\r\n      border-bottom:1px solid #eef3f7;\r\n      font-size:15px;\r\n    }\r\n\r\n    .summary-line:last-child{border-bottom:none}\r\n\r\n    .cart-items{\r\n      display:grid;\r\n      gap:14px;\r\n      margin-bottom:18px;\r\n    }\r\n\r\n    .cart-item{\r\n      border:1px solid #e7edf4;\r\n      border-radius:16px;\r\n      padding:14px;\r\n      background:#fff;\r\n    }\r\n\r\n    .cart-item-top{\r\n      display:flex;\r\n      justify-content:space-between;\r\n      gap:12px;\r\n      margin-bottom:8px;\r\n    }\r\n\r\n    .cart-item h4{font-size:16px}\r\n    .cart-mini{font-size:13px; color:var(--muted); line-height:1.6}\r\n\r\n    .remove-link{\r\n      border:none;\r\n      background:none;\r\n      color:var(--danger);\r\n      cursor:pointer;\r\n      font-weight:800;\r\n      width:auto;\r\n      min-height:auto;\r\n      padding:0;\r\n    }\r\n\r\n    .empty{\r\n      border:1px dashed #cfdae6;\r\n      border-radius:16px;\r\n      padding:18px;\r\n      text-align:center;\r\n      color:var(--muted);\r\n      background:#fff;\r\n      font-size:14px;\r\n    }\r\n\r\n    .totals{\r\n      border-top:1px solid #eef3f7;\r\n      padding-top:8px;\r\n      margin-top:8px;\r\n    }\r\n\r\n    .checkout-form{\r\n      display:grid;\r\n      gap:12px;\r\n      margin-top:18px;\r\n      padding-top:18px;\r\n      border-top:1px solid #e8eef5;\r\n    }\r\n\r\n    .notice{\r\n      margin-top:14px;\r\n      padding:14px;\r\n      border-radius:14px;\r\n      font-size:14px;\r\n      line-height:1.6;\r\n      display:none;\r\n    }\r\n\r\n    .notice.ok{display:block; background:#edfdf3; color:var(--ok); border:1px solid #b7ebcc}\r\n    .notice.error{display:block; background:#fff4f2; color:var(--danger); border:1px solid #f4c7c3}\r\n\r\n    @media (max-width: 1280px){\r\n      .boats-grid{grid-template-columns:repeat(2, minmax(0,1fr))}\r\n      .booking-layout{grid-template-columns:1fr}\r\n    }\r\n\r\n    @media (max-width: 860px){\r\n      .hero{padding:24px 10px 72px}\r\n      .wrap{width:min(1880px, calc(100% - 10px))}\r\n      .section-card{padding:18px}\r\n      .hero-box{padding:22px}\r\n      .boats-grid,\r\n      .reserve-grid,\r\n      .slots{grid-template-columns:1fr}\r\n      .boat-media{height:220px}\r\n      .main{margin-top:-32px}\r\n      h1{font-size:clamp(40px, 11vw, 62px)}\r\n      .hero-box p{font-size:18px}\r\n      .catalog-alert{font-size:17px}\r\n    }\r\n    \r\n    .hero-box {\r\n  position: relative;\r\n}\r\n\r\n.hero-location-btn {\r\n  position: absolute;\r\n  bottom: 20px;\r\n  right: 20px;\r\n}\r\n  <\/style>\r\n<\/head>\r\n<body>\r\n  <section class=\"hero\">\r\n    <div class=\"wrap\">\r\n      <div class=\"hero-box\">\r\n  <span class=\"eyebrow\">Reservas n\u00e1uticas<\/span>\r\n  <h1>Choose your boat in Torrevieja (Alicante) and book in a few steps.<\/h1>\r\n  <p>Cat\u00e1logo por categor\u00edas, calendarios mensuales y un sencillo proceso de reserva por horas y n\u00famero de invitados.<\/p>\r\n\r\n  <a href=\"https:\/\/www.google.com\/maps\/place\/Puerto+Deportivo+Marina+Salinas\/@37.9698736,-0.6832086,16z\/data=!3m2!4b1!5s0xd630753c724bfa7:0xdeeb9b3c4db83265!4m6!3m5!1s0xd6307539dd86073:0x84fea6fd0ef3a6da!8m2!3d37.9698694!4d-0.6806337!16s%2Fg%2F1ttpcn19?entry=ttu&g_ep=EgoyMDI2MDMxOC4xIKXMDSoASAFQAw%3D%3D\" target=\"_blank\" class=\"btn btn-primary hero-location-btn\">\r\n    Location\r\n  <\/a>\r\n<\/div>\r\n    <\/div>\r\n  <\/section>\r\n\r\n  <main class=\"main\">\r\n    <div class=\"wrap\">\r\n      <section class=\"section-card\">\r\n        <div class=\"section-head\">\r\n          <span class=\"eyebrow\">Cat\u00e1logo<\/span>\r\n          <h2>Barcos disponibles<\/h2>\r\n          <p class=\"catalog-alert\">\r\n            Las embarcaciones est\u00e1n separadas por categor\u00edas. Cada embarcaci\u00f3n tiene su propio horario y la disponibilidad var\u00eda en funci\u00f3n del mes seleccionado.\r\n          <\/p>\r\n        <\/div>\r\n        <div id=\"catalogContainer\"><\/div>\r\n      <\/section>\r\n\r\n      <section class=\"section-card booking-box\" id=\"bookingSection\">\r\n        <div class=\"section-head\">\r\n          <span class=\"eyebrow\">Booking<\/span>\r\n          <h2>Configure your booking and summary<\/h2>\r\n          <p>Select the boat, date, duration, guests and an available time slot.<\/p>\r\n        <\/div>\r\n\r\n        <div class=\"booking-layout\">\r\n          <div class=\"form-box\">\r\n            <div class=\"reserve-grid\">\r\n              <div>\r\n                <label for=\"boatSelect\">Boat<\/label>\r\n                <select id=\"boatSelect\"><\/select>\r\n              <\/div>\r\n\r\n              <div>\r\n                <label for=\"bookingDate\">Fecha<\/label>\r\n                <input type=\"date\" id=\"bookingDate\" \/>\r\n              <\/div>\r\n\r\n              <div>\r\n                <label for=\"hoursSelect\">Duration<\/label>\r\n                <select id=\"hoursSelect\"><\/select>\r\n              <\/div>\r\n\r\n              <div>\r\n                <label for=\"peopleSelect\">Hu\u00e9spedes<\/label>\r\n                <select id=\"peopleSelect\"><\/select>\r\n              <\/div>\r\n\r\n              <div class=\"full\">\r\n                <label>Available time slot<\/label>\r\n                <div class=\"slots\" id=\"slotsContainer\"><\/div>\r\n              <\/div>\r\n            <\/div>\r\n\r\n            <div class=\"boat-actions\" style=\"margin-top:18px;\">\r\n              <button class=\"btn btn-primary\" id=\"addToCartBtn\" type=\"button\">Add to summary<\/button>\r\n            <\/div>\r\n          <\/div>\r\n\r\n          <div class=\"summary-box\" id=\"summarySection\">\r\n            <div class=\"section-head\" style=\"margin-bottom:10px;\">\r\n              <span class=\"eyebrow\">Summary<\/span>\r\n              <h3>Your booking<\/h3>\r\n              <p>Items added will appear here before checkout.<\/p>\r\n            <\/div>\r\n\r\n            <div class=\"cart-items\" id=\"cartItems\">\r\n              <div class=\"empty\">No bookings added yet.<\/div>\r\n            <\/div>\r\n\r\n            <div class=\"totals\">\r\n              <div class=\"summary-line\"><span>Total<\/span><strong id=\"total\">\u20ac0.00<\/strong><\/div>\r\n            <\/div>\r\n\r\n            <form class=\"checkout-form\" id=\"checkoutForm\" action=\"\">\r\n              <label for=\"customerName\">Nombre Completo<\/label>\r\n              <input id=\"customerName\" type=\"text\" placeholder=\"Your name\" required \/>\r\n\r\n              <label for=\"customerEmail\">Correo Electr\u00f3nico<\/label>\r\n              <input id=\"customerEmail\" type=\"email\" placeholder=\"you@email.com\" required \/>\r\n\r\n              <label for=\"customerPhone\">Telefono<\/label>\r\n              <input id=\"customerPhone\" type=\"tel\" placeholder=\"Your phone\" required \/>\r\n\r\n              <button class=\"btn btn-primary\" type=\"submit\">Proceed to payment<\/button>\r\n            <input type=\"hidden\" name=\"trp-form-language\" value=\"es\"\/><\/form>\r\n\r\n            <div id=\"checkoutNotice\" class=\"notice\"><\/div>\r\n          <\/div>\r\n        <\/div>\r\n      <\/section>\r\n    <\/div>\r\n  <\/main>\r\n\r\n  <script>\r\n    const BOATS = [\r\n      {\r\n        id:'boat-1',\r\n        category:'2-hour boats',\r\n        name:'Catamar\u00e1n Arrecife',\r\n        image:'https:\/\/teetimespain.com\/wp-content\/uploads\/2026\/03\/catamaran-arrecife.jpeg',\r\n        description:'Short premium trip designed exclusively for 2-hour experiences.',\r\n        pricingModel:'per_person',\r\n        pricePerPerson:55,\r\n        capacity:12,\r\n        allowedHours:[2],\r\n        defaultSlots:['10:30 - 12:30','13:00 - 15:00','16:00 - 18:00','18:15 - 20:15']\r\n      },\r\n      {\r\n        id:'boat-2',\r\n        category:'2-hour boats',\r\n        name:'2-hour Yacht',\r\n        image:'https:\/\/teetimespain.com\/wp-content\/uploads\/2026\/03\/yate-adelmar.jpeg',\r\n        description:'Another short rental option with fixed 2-hour slots.',\r\n        pricingModel:'per_person',\r\n        pricePerPerson:55,\r\n        capacity:12,\r\n        allowedHours:[2],\r\n        defaultSlots:['11:00 - 13:00','19:00 - 21:00']\r\n      },\r\n      {\r\n        id:'boat-3',\r\n        category:'Licensed boats',\r\n        name:'Nuva M6 Open Aventura',\r\n        image:'https:\/\/teetimespain.com\/wp-content\/uploads\/2026\/03\/nuva-open-m6.jpg',\r\n        description:'Includes bow & stern sunbeds, extendable table, freshwater shower, swim platform and ladder, fridge, Bluetooth radio, USB, GPS sounder and bimini top.',\r\n        pricingModel:'by_duration',\r\n        pricesByHours:{ 2:190, 3:230, 4:260 },\r\n        capacity:8,\r\n        allowedHours:[2,3,4],\r\n        defaultSlots:['09:00 - 11:00','12:00 - 15:00','16:00 - 20:00']\r\n      },\r\n      {\r\n        id:'boat-4',\r\n        category:'Licensed boats',\r\n        name:'Nuva M6 Open Temptation',\r\n        image:'https:\/\/teetimespain.com\/wp-content\/uploads\/2026\/03\/nuva-open-m6-temtation.jpg',\r\n        description:'Includes bow & stern sunbeds, extendable table, freshwater shower, swim platform and ladder, fridge, Bluetooth radio, USB, GPS sounder and bimini top.',\r\n        pricingModel:'by_duration',\r\n        pricesByHours:{ 2:190, 3:230, 4:260 },\r\n        capacity:8,\r\n        allowedHours:[2,3,4],\r\n        defaultSlots:['10:00 - 12:00','13:00 - 16:00','17:00 - 21:00']\r\n      },\r\n      {\r\n        id:'boat-5',\r\n        category:'No-licence boats',\r\n        name:'Libertad y Mediterr\u00e1neo',\r\n        image:'https:\/\/teetimespain.com\/wp-content\/uploads\/2026\/03\/libertad.jpeg',\r\n        description:'No-licence boat, simple and comfortable, available for 2, 3 or 4 hours.',\r\n        pricingModel:'by_duration',\r\n        pricesByHours:{ 2:130, 3:150, 4:180 },\r\n        capacity:5,\r\n        allowedHours:[2,3,4],\r\n        defaultSlots:['10:00 - 12:00','13:00 - 16:00','17:00 - 21:00']\r\n      },\r\n      {\r\n        id:'boat-6',\r\n        category:'No-licence boats',\r\n        name:'Adelmar V2',\r\n        image:'https:\/\/teetimespain.com\/wp-content\/uploads\/2026\/03\/adelmar-v2.jpeg',\r\n        description:'Easy-to-handle no-licence option with flexible duration.',\r\n        pricingModel:'by_duration',\r\n        pricesByHours:{ 2:140, 3:170, 4:200 },\r\n        capacity:5,\r\n        allowedHours:[2,3,4],\r\n        defaultSlots:['09:30 - 11:30','12:30 - 15:30','16:30 - 20:30']\r\n      },\r\n      {\r\n        id:'boat-7',\r\n        category:'No-licence boats',\r\n        name:'Coral & Zafiro',\r\n        image:'https:\/\/teetimespain.com\/wp-content\/uploads\/2026\/03\/coral-y-zafiro.jpeg',\r\n        description:'No-licence model ideal for relaxed trips.',\r\n        pricingModel:'by_duration',\r\n        pricesByHours:{ 2:140, 3:170, 4:200 },\r\n        capacity:6,\r\n        allowedHours:[2,3,4],\r\n        defaultSlots:['10:00 - 12:00','13:00 - 16:00','17:00 - 21:00']\r\n      },\r\n      {\r\n        id:'boat-8',\r\n        category:'No-licence boats',\r\n        name:'V2 Miami',\r\n        image:'https:\/\/teetimespain.com\/wp-content\/uploads\/2026\/03\/v2-miami.jpeg',\r\n        description:'Another no-licence option with simple, clear booking slots.',\r\n        pricingModel:'by_duration',\r\n        pricesByHours:{ 2:140, 3:170, 4:200 },\r\n        capacity:6,\r\n        allowedHours:[2,3,4],\r\n        defaultSlots:['11:00 - 13:00','14:00 - 17:00','18:00 - 22:00']\r\n      },\r\n      {\r\n        id:'boat-9',\r\n        category:'Fishing charter',\r\n        name:'Fishing Charter 4H',\r\n        image:'https:\/\/teetimespain.com\/wp-content\/uploads\/2026\/03\/cahrter.jpg',\r\n        description:'4-hour fishing charter including drinks and lunch.',\r\n        pricingModel:'fixed',\r\n        fixedPrice:140, \/\/ per person\r\n        capacity:5,\r\n        allowedHours:[4],\r\n        defaultSlots:['08:00 - 12:00'],\r\n        included:'Drinks & lunch'\r\n      }\r\n    ];\r\n\r\n    const MONTHLY_SLOTS_BY_BOAT = {\r\n      'boat-1': {1:['CLOSED'],2:['CLOSED'],3:['10:30 - 12:30','13:00 - 15:00','16:00 - 18:00','18:15 - 20:15'],4:['11:00 - 13:00','13:30 - 15:30','16:30 - 18:30','19:00 - 21:00'],5:['11:00 - 13:00','13:30 - 15:30','16:30 - 18:30','19:00 - 21:00'],6:['11:00 - 13:00','13:30 - 15:30','16:30 - 18:30','19:00 - 21:00'],7:['10:00 - 12:00','12:30 - 14:30','15:00 - 17:00','17:00 - 19:00','19:30 - 21:30'],8:['10:00 - 12:00','12:30 - 14:30','15:00 - 17:00','17:00 - 19:00','19:00 - 21:00'],9:['11:00 - 13:00','13:30 - 15:30','16:30 - 18:30','18:30 - 20:30'],10:['11:00 - 13:00','13:00 - 15:00','15:30 - 17:30','18:00 - 20:00'],11:['13:30 - 15:30','17:00 - 19:00'],12:['13:30 - 15:30']},\r\n      'boat-2': {1:['CLOSED'],2:['CLOSED'],3:['10:30 - 12:30','13:00 - 15:00','16:00 - 18:00','18:15 - 20:15'],4:['11:00 - 13:00','13:30 - 15:30','16:30 - 18:30','19:00 - 21:00'],5:['11:00 - 13:00','13:30 - 15:30','16:30 - 18:30','19:00 - 21:00'],6:['11:00 - 13:00','13:30 - 15:30','16:30 - 18:30','19:00 - 21:00'],7:['10:00 - 12:00','12:30 - 14:30','15:00 - 17:00','17:00 - 19:00','19:00 - 21:00'],8:['10:00 - 12:00','12:30 - 14:30','15:00 - 17:00','17:00 - 19:00','19:00 - 21:00'],9:['11:00 - 13:00','13:30 - 15:30','16:30 - 18:30','18:30 - 20:30'],10:['11:00 - 13:00','13:00 - 15:00','15:30 - 17:30','18:00 - 20:00'],11:['13:30 - 15:30','17:00 - 19:00'],12:['13:30 - 15:30','17:00 - 19:00']},\r\n\r\n      'boat-3': {1:['09:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00'],2:['09:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00'],3:['09:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00'],4:['09:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00'],5:['09:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00'],6:['09:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00'],7:['09:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00'],8:['09:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00'],9:['09:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00'],10:['09:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00'],11:['09:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00'],12:['09:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00']},\r\n      'boat-4': {1:['09:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00'],2:['09:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00'],3:['09:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00'],4:['09:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00'],5:['09:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00'],6:['09:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00'],7:['09:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00'],8:['09:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00'],9:['09:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00'],10:['09:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00'],11:['09:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00'],12:['09:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00']},\r\n      'boat-5': {1:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],2:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],3:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],4:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],5:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],6:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],7:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],8:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],9:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],10:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],11:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],12:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00']},\r\n      'boat-6': {1:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],2:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],3:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],4:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],5:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],6:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],7:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],8:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],9:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],10:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],11:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],12:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00']},\r\n      'boat-7': {1:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],2:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],3:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],4:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],5:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],6:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],7:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],8:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],9:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],10:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],11:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],12:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00']},\r\n      'boat-8': {1:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],2:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],3:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],4:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],5:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],6:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],7:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],8:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],9:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],10:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],11:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00'],12:['9:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00']},\r\n\r\n      'boat-9': {1:['08:00','10:00','14:00'],2:['08:00','10:00','14:00'],3:['08:00','10:00','14:00'],4:['08:00','10:00','14:00'],5:['08:00','10:00','14:00'],6:['08:00','10:00','14:00'],7:['08:00','10:00','14:00'],8:['08:00','10:00','14:00'],9:['08:00','10:00','14:00'],10:['08:00','10:00','14:00'],11:['08:00','10:00','14:00'],12:['08:00','10:00','14:00']}\r\n    };\r\n\r\n    const cart = [];\r\n    let activeSlot = '';\r\n\r\n    const catalogContainer = document.getElementById('catalogContainer');\r\n    const boatSelect = document.getElementById('boatSelect');\r\n    const bookingDate = document.getElementById('bookingDate');\r\n    const hoursSelect = document.getElementById('hoursSelect');\r\n    const peopleSelect = document.getElementById('peopleSelect');\r\n    const slotsContainer = document.getElementById('slotsContainer');\r\n    const cartItems = document.getElementById('cartItems');\r\n    const totalEl = document.getElementById('total');\r\n    const noticeEl = document.getElementById('checkoutNotice');\r\n\r\n    function formatEUR(value){\r\n      return new Intl.NumberFormat('en-GB', { style:'currency', currency:'EUR' }).format(value);\r\n    }\r\n\r\n    function ttGetMainCart(){\r\n      try { return JSON.parse(localStorage.getItem('ttCartItems') || '[]'); }\r\n      catch(e){ return []; }\r\n    }\r\n\r\n    function ttSetMainCart(arr){\r\n      localStorage.setItem('ttCartItems', JSON.stringify(arr));\r\n    }\r\n\r\n    function getFromPrice(boat){\r\n      const values = boat.pricesByHours ? Object.values(boat.pricesByHours).filter(v => typeof v === 'number') : [];\r\n      if (!values.length) return null;\r\n      return Math.min(...values);\r\n    }\r\n\r\n    function getBoatPriceLabel(boat){\r\n      if (boat.pricingModel === 'per_person') return `${formatEUR(boat.pricePerPerson)} \/ person`;\r\n      if (boat.pricingModel === 'fixed') return `${formatEUR(boat.fixedPrice)} \/ person`;\r\n      if (boat.pricingModel === 'by_duration'){\r\n        const from = getFromPrice(boat);\r\n        return from !== null ? `From ${formatEUR(from)}` : 'Ask for price';\r\n      }\r\n      return 'Ask for price';\r\n    }\r\n\r\n    function getBoatCardPriceMain(boat){\r\n      if (boat.pricingModel === 'per_person') return formatEUR(boat.pricePerPerson);\r\n      if (boat.pricingModel === 'fixed') return formatEUR(boat.fixedPrice);\r\n      if (boat.pricingModel === 'by_duration'){\r\n        const from = getFromPrice(boat);\r\n        return from !== null ? `From ${formatEUR(from)}` : 'Ask for price';\r\n      }\r\n      return 'Ask for price';\r\n    }\r\n\r\n    function getBoatCardPriceSmall(boat){\r\n      if (boat.pricingModel === 'per_person') return 'per person';\r\n      if (boat.pricingModel === 'fixed') return 'per person';\r\n      if (boat.pricingModel === 'by_duration') return 'by duration';\r\n      return '';\r\n    }\r\n\r\n    function setMinDate(){\r\n      const today = new Date();\r\n      const yyyy = today.getFullYear();\r\n      const mm = String(today.getMonth()+1).padStart(2,'0');\r\n      const dd = String(today.getDate()).padStart(2,'0');\r\n      bookingDate.min = `${yyyy}-${mm}-${dd}`;\r\n      bookingDate.value = `${yyyy}-${mm}-${dd}`;\r\n    }\r\n\r\n    function getActiveMonth(){\r\n      return bookingDate.value ? (new Date(bookingDate.value).getMonth() + 1) : (new Date().getMonth() + 1);\r\n    }\r\n\r\n    function getBoatById(id){\r\n      return BOATS.find(boat => boat.id === id);\r\n    }\r\n\r\n    function getSelectedBoat(){\r\n      return getBoatById(boatSelect.value) || BOATS[0];\r\n    }\r\n\r\n    function getBoatSlots(boat, month = getActiveMonth()){\r\n      return MONTHLY_SLOTS_BY_BOAT[boat.id]?.[month] || boat.defaultSlots || [];\r\n    }\r\n\r\n    function slotLabel(slot){\r\n      if (slot === 'CLOSED') return 'Closed';\r\n      return slot;\r\n    }\r\n\r\n    function renderCatalog(){\r\n      const month = getActiveMonth();\r\n      const grouped = BOATS.reduce((acc, boat) => {\r\n        if (!acc[boat.category]) acc[boat.category] = [];\r\n        acc[boat.category].push(boat);\r\n        return acc;\r\n      }, {});\r\n\r\n      catalogContainer.innerHTML = Object.entries(grouped).map(([category, boats]) => `\r\n        <div class=\"category-block\">\r\n          <div class=\"category-head\"><h3>${category}<\/h3><\/div>\r\n          <div class=\"boats-grid\">\r\n            ${boats.map(boat => {\r\n              const slots = getBoatSlots(boat, month).map(slotLabel);\r\n              return `\r\n                <article class=\"boat-card\">\r\n                  <div class=\"boat-media\" style=\"background-image:url('${boat.image}')\"><\/div>\r\n                  <div class=\"boat-body\">\r\n                    <h3>${boat.name}<\/h3>\r\n                    <p>${boat.description}<\/p>\r\n                    <div class=\"meta-list\">\r\n                      <div><strong>Capacity:<\/strong> up to ${boat.capacity} guests<\/div>\r\n                      <div><strong>Duration:<\/strong> ${boat.allowedHours.join(' \/ ')} h<\/div>\r\n                      <div><strong>Price:<\/strong> ${getBoatPriceLabel(boat)}<\/div>\r\n                      <div><strong>Monthly schedule:<\/strong> ${slots.join(' \u00b7 ')}<\/div>\r\n                      ${boat.included ? `<div><strong>Includes:<\/strong> ${boat.included}<\/div>` : ''}\r\n                    <\/div>\r\n                    <div class=\"price\">${getBoatCardPriceMain(boat)} <small>${getBoatCardPriceSmall(boat)}<\/small><\/div>\r\n                    <div class=\"boat-actions\">\r\n                      <button type=\"button\" class=\"btn btn-primary\" data-jump-boat=\"${boat.id}\">Book this boat<\/button>\r\n                    <\/div>\r\n                  <\/div>\r\n                <\/article>\r\n              `;\r\n            }).join('')}\r\n          <\/div>\r\n        <\/div>\r\n      `).join('');\r\n\r\n      document.querySelectorAll('[data-jump-boat]').forEach(btn => {\r\n        btn.addEventListener('click', () => {\r\n          const boatId = btn.dataset.jumpBoat;\r\n          boatSelect.value = boatId;\r\n          syncHoursAndPeople();\r\n          activeSlot = '';\r\n          renderSlots();\r\n          document.getElementById('bookingSection').scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n        });\r\n      });\r\n    }\r\n\r\n    function populateBoatSelect(){\r\n      const grouped = BOATS.reduce((acc, boat) => {\r\n        if (!acc[boat.category]) acc[boat.category] = [];\r\n        acc[boat.category].push(boat);\r\n        return acc;\r\n      }, {});\r\n\r\n      boatSelect.innerHTML = Object.entries(grouped).map(([category, boats]) => `\r\n        <optgroup label=\"${category}\">\r\n          ${boats.map(boat => `<option value=\"${boat.id}\">${boat.name}<\/option>`).join('')}\r\n        <\/optgroup>\r\n      `).join('');\r\n    }\r\n\r\n    function syncHoursAndPeople(){\r\n      const boat = getSelectedBoat();\r\n\r\n      const selectedHours = Number(hoursSelect.value || boat.allowedHours[0]);\r\n      const finalHour = boat.allowedHours.includes(selectedHours) ? selectedHours : boat.allowedHours[0];\r\n      hoursSelect.innerHTML = boat.allowedHours.map(h =>\r\n        `<option value=\"${h}\" ${h === finalHour ? 'selected' : ''}>${h} hour${h === 1 ? '' : 's'}<\/option>`\r\n      ).join('');\r\n\r\n      const currentPeople = Number(peopleSelect.value || 1);\r\n      const finalPeople = Math.min(currentPeople, boat.capacity);\r\n      peopleSelect.innerHTML = Array.from({ length: boat.capacity }, (_, i) => i + 1).map(n =>\r\n        `<option value=\"${n}\" ${n === finalPeople ? 'selected' : ''}>${n} guest${n === 1 ? '' : 's'}<\/option>`\r\n      ).join('');\r\n    }\r\n\r\n    function renderSlots(){\r\n      const boat = getSelectedBoat();\r\n      const slots = getBoatSlots(boat);\r\n\r\n      if (slots.includes('CLOSED')) activeSlot = '';\r\n\r\n      slotsContainer.innerHTML = slots.map(slot => {\r\n        const isClosed = slot === 'CLOSED';\r\n        const isActive = !isClosed && slot === activeSlot;\r\n        return `\r\n          <button\r\n            type=\"button\"\r\n            class=\"slot-btn ${isActive ? 'active' : ''}\"\r\n            data-slot=\"${slot}\"\r\n            ${isClosed ? 'disabled' : ''}\r\n          >\r\n            ${slotLabel(slot)}\r\n          <\/button>\r\n        `;\r\n      }).join('');\r\n\r\n      slotsContainer.querySelectorAll('[data-slot]').forEach(btn => {\r\n        btn.addEventListener('click', () => {\r\n          const slot = btn.dataset.slot;\r\n          if (slot === 'CLOSED') return;\r\n          activeSlot = slot;\r\n          renderSlots();\r\n        });\r\n      });\r\n    }\r\n\r\n    function calculateItemTotal(boat, hours, people){\r\n      if (boat.pricingModel === 'per_person'){\r\n        return boat.pricePerPerson * people;\r\n      }\r\n      if (boat.pricingModel === 'fixed'){\r\n        return boat.fixedPrice * people; \/\/ per person\r\n      }\r\n      if (boat.pricingModel === 'by_duration'){\r\n        const price = boat.pricesByHours?.[hours];\r\n        if (typeof price !== 'number') return NaN;\r\n        return price;\r\n      }\r\n      return NaN;\r\n    }\r\n\r\n    function showNotice(message, type){\r\n      noticeEl.textContent = message;\r\n      noticeEl.className = `notice ${type}`;\r\n    }\r\n\r\n    function renderCart(){\r\n      if (!cart.length){\r\n        cartItems.innerHTML = '<div class=\"empty\">No bookings added yet.<\/div>';\r\n      } else {\r\n        cartItems.innerHTML = cart.map(item => `\r\n          <div class=\"cart-item\">\r\n            <div class=\"cart-item-top\">\r\n              <h4>${item.boatName}<\/h4>\r\n              <button type=\"button\" class=\"remove-link\" data-remove=\"${item.id}\">Remove<\/button>\r\n            <\/div>\r\n            <div class=\"cart-mini\">\r\n              Date: ${item.date}<br>\r\n              Time slot: ${slotLabel(item.slot)}<br>\r\n              Duration: ${item.hours} h<br>\r\n              Guests: ${item.people}\r\n            <\/div>\r\n            <div class=\"summary-line\" style=\"padding-bottom:0; border-bottom:none; margin-top:8px;\">\r\n              <span>Booking total<\/span>\r\n              <strong>${formatEUR(item.total)}<\/strong>\r\n            <\/div>\r\n          <\/div>\r\n        `).join('');\r\n      }\r\n\r\n      document.querySelectorAll('[data-remove]').forEach(btn => {\r\n        btn.addEventListener('click', () => {\r\n          const index = cart.findIndex(item => item.id === btn.dataset.remove);\r\n          if (index >= 0) cart.splice(index, 1);\r\n          renderCart();\r\n        });\r\n      });\r\n\r\n      const total = cart.reduce((sum, item) => sum + item.total, 0);\r\n      totalEl.textContent = formatEUR(total);\r\n    }\r\n\r\n    function addToCart(){\r\n      const boat = getSelectedBoat();\r\n      const date = bookingDate.value;\r\n      const hours = Number(hoursSelect.value);\r\n      const people = Number(peopleSelect.value);\r\n\r\n      if (!date){\r\n        showNotice('Please select a date.', 'error');\r\n        return;\r\n      }\r\n\r\n      if (!activeSlot){\r\n        showNotice('Please select an available time slot.', 'error');\r\n        return;\r\n      }\r\n\r\n      if (activeSlot === 'CLOSED'){\r\n        showNotice('This boat is closed for the selected month.', 'error');\r\n        return;\r\n      }\r\n\r\n      const totalCalc = calculateItemTotal(boat, hours, people);\r\n      if (!Number.isFinite(totalCalc)){\r\n        showNotice('No price configured for this duration. Please check 2\/3\/4-hour rates.', 'error');\r\n        return;\r\n      }\r\n\r\n      const item = {\r\n        id: `${boat.id}-${Date.now()}`,\r\n        boatId: boat.id,\r\n        boatName: boat.name,\r\n        date,\r\n        hours,\r\n        people,\r\n        slot: activeSlot,\r\n        total: totalCalc\r\n      };\r\n\r\n      cart.push(item);\r\n      renderCart();\r\n      document.getElementById('summarySection').scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n      showNotice('Booking added to the summary.', 'ok');\r\n    }\r\n\r\n    function handleCheckout(event){\r\n      event.preventDefault();\r\n\r\n      \/\/ Keep your required fields (browser already enforces required)\r\n      const name = document.getElementById('customerName').value.trim();\r\n      const email = document.getElementById('customerEmail').value.trim();\r\n      const phone = document.getElementById('customerPhone').value.trim();\r\n\r\n      if (!cart.length){\r\n        showNotice('You cannot continue without any bookings in the summary.', 'error');\r\n        return;\r\n      }\r\n\r\n      if (!name || !email || !phone){\r\n        showNotice('Please fill in your details before continuing.', 'error');\r\n        return;\r\n      }\r\n\r\n      \/\/ \u2705 Dump summary items into the REAL cart (ttCartItems) and redirect to \/carrito\/\r\n      const mainCart = ttGetMainCart();\r\n\r\n      cart.forEach(summaryItem => {\r\n        const boat = BOATS.find(b => b.id === summaryItem.boatId);\r\n\r\n        \/\/ Add rich details in \"hora\" because your cart\/email prints it as-is\r\n        const priceInfo =\r\n          boat?.pricingModel === 'per_person' ? `\u20ac${boat.pricePerPerson}\/person (2h)` :\r\n          boat?.pricingModel === 'fixed' ? `${formatEUR(boat.fixedPrice)}\/person (fixed)` :\r\n          boat?.pricingModel === 'by_duration' ? `Rate: ${formatEUR(boat.pricesByHours?.[summaryItem.hours] ?? 0)} (${summaryItem.hours}h)` :\r\n          'Rate: Ask for price';\r\n\r\n        const includesInfo = boat?.included ? ` \u2022 Includes: ${boat.included}` : '';\r\n\r\n        const horaText = `${summaryItem.slot} \u2022 ${summaryItem.hours}h \u2022 ${priceInfo}${includesInfo}`;\r\n\r\n        mainCart.push({\r\n          id: (window.crypto && crypto.randomUUID) ? crypto.randomUUID() : (Date.now() + Math.random()),\r\n          campo: { id: `boat_${summaryItem.boatId}`, nombre: summaryItem.boatName },\r\n          fecha: summaryItem.date,\r\n          hora: horaText,\r\n          jugadores: Number(summaryItem.people),\r\n          cantidades: {},\r\n          preciosAplicados: {},\r\n          pendingItems: [],\r\n          hasPendingPayment: false,\r\n          total: Number(summaryItem.total.toFixed(2)),\r\n          agregadoEn: Date.now()\r\n        });\r\n      });\r\n\r\n      ttSetMainCart(mainCart);\r\n\r\n      \/\/ Optional: clear local summary to avoid duplicates if user comes back\r\n      \/\/ cart.length = 0; renderCart();\r\n\r\n      window.location.href = '\/carrito\/';\r\n    }\r\n\r\n    boatSelect.addEventListener('change', () => {\r\n      syncHoursAndPeople();\r\n      activeSlot = '';\r\n      renderSlots();\r\n    });\r\n\r\n    bookingDate.addEventListener('change', () => {\r\n      activeSlot = '';\r\n      renderSlots();\r\n      renderCatalog();\r\n    });\r\n\r\n    document.getElementById('addToCartBtn').addEventListener('click', addToCart);\r\n    document.getElementById('checkoutForm').addEventListener('submit', handleCheckout);\r\n\r\n    setMinDate();\r\n    populateBoatSelect();\r\n    syncHoursAndPeople();\r\n    renderSlots();\r\n    renderCatalog();\r\n    renderCart();\r\n  <\/script>\r\n<\/body>\r\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>Boat Booking Nautical Bookings Choose your boat in Torrevieja (Alicante) and book in a few steps. Category-based catalogue, monthly schedules, and a simple booking flow for hours and number of guests. Location Catalogue Available boats Boats are separated by category. Each boat has its own schedule and availability changes depending on the month selected. Booking [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-5535","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/teetimespain.com\/es\/wp-json\/wp\/v2\/pages\/5535","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/teetimespain.com\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/teetimespain.com\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/teetimespain.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/teetimespain.com\/es\/wp-json\/wp\/v2\/comments?post=5535"}],"version-history":[{"count":211,"href":"https:\/\/teetimespain.com\/es\/wp-json\/wp\/v2\/pages\/5535\/revisions"}],"predecessor-version":[{"id":6054,"href":"https:\/\/teetimespain.com\/es\/wp-json\/wp\/v2\/pages\/5535\/revisions\/6054"}],"wp:attachment":[{"href":"https:\/\/teetimespain.com\/es\/wp-json\/wp\/v2\/media?parent=5535"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/teetimespain.com\/es\/wp-json\/wp\/v2\/categories?post=5535"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/teetimespain.com\/es\/wp-json\/wp\/v2\/tags?post=5535"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}