<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>road trip entertainment Archives - Tantrumming Trailblazers</title>
	<atom:link href="https://tantrummingtrailblazers.com/tag/road-trip-entertainment/feed/" rel="self" type="application/rss+xml" />
	<link>https://tantrummingtrailblazers.com/tag/road-trip-entertainment/</link>
	<description>Where Travel and Tantrums Collide in Epic Journeys!</description>
	<lastBuildDate>Fri, 12 Jun 2026 09:54:48 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://tantrummingtrailblazers.com/wp-content/uploads/2024/06/cropped-DALL·E-2024-06-22-12.00.14-A-minimalist-logo-featuring-three-lines-and-three-colors.-The-design-includes-one-diagonal-line-from-the-bottom-left-to-the-top-right-in-bright-orange-32x32.webp</url>
	<title>road trip entertainment Archives - Tantrumming Trailblazers</title>
	<link>https://tantrummingtrailblazers.com/tag/road-trip-entertainment/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">229502464</site>	<item>
		<title>🚗 Free Family Road Trip Planner &#124; Make My Drive Fun &#124; Share Routes &#124; Tantrumming Trailblazers</title>
		<link>https://tantrummingtrailblazers.com/tools/make-my-drive-fun/</link>
					<comments>https://tantrummingtrailblazers.com/tools/make-my-drive-fun/#respond</comments>
		
		<dc:creator><![CDATA[Dennis]]></dc:creator>
		<pubDate>Fri, 20 Sep 2024 15:09:48 +0000</pubDate>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[apps for long drives]]></category>
		<category><![CDATA[car karaoke app]]></category>
		<category><![CDATA[driving games for adults]]></category>
		<category><![CDATA[fun driving apps]]></category>
		<category><![CDATA[make driving fun]]></category>
		<category><![CDATA[road trip entertainment]]></category>
		<guid isPermaLink="false">https://tantrummingtrailblazers.com/?p=1968</guid>

					<description><![CDATA[<p>Make My Drive Fun Plan the drive. Not just the destination. Turn boring journeys into proper family adventures. Add food stops, toilets,&#8230;</p>
<p>The post <a href="https://tantrummingtrailblazers.com/tools/make-my-drive-fun/">🚗 Free Family Road Trip Planner | Make My Drive Fun | Share Routes | Tantrumming Trailblazers</a> appeared first on <a href="https://tantrummingtrailblazers.com">Tantrumming Trailblazers</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Ftantrummingtrailblazers.com%2Ftools%2Fmake-my-drive-fun%2F&amp;linkname=%F0%9F%9A%97%20Free%20Family%20Road%20Trip%20Planner%20%7C%20Make%20My%20Drive%20Fun%20%7C%20Share%20Routes%20%7C%20Tantrumming%20Trailblazers" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Ftantrummingtrailblazers.com%2Ftools%2Fmake-my-drive-fun%2F&amp;linkname=%F0%9F%9A%97%20Free%20Family%20Road%20Trip%20Planner%20%7C%20Make%20My%20Drive%20Fun%20%7C%20Share%20Routes%20%7C%20Tantrumming%20Trailblazers" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Ftantrummingtrailblazers.com%2Ftools%2Fmake-my-drive-fun%2F&amp;linkname=%F0%9F%9A%97%20Free%20Family%20Road%20Trip%20Planner%20%7C%20Make%20My%20Drive%20Fun%20%7C%20Share%20Routes%20%7C%20Tantrumming%20Trailblazers" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Ftantrummingtrailblazers.com%2Ftools%2Fmake-my-drive-fun%2F&#038;title=%F0%9F%9A%97%20Free%20Family%20Road%20Trip%20Planner%20%7C%20Make%20My%20Drive%20Fun%20%7C%20Share%20Routes%20%7C%20Tantrumming%20Trailblazers" data-a2a-url="https://tantrummingtrailblazers.com/tools/make-my-drive-fun/" data-a2a-title="&#x1f697; Free Family Road Trip Planner | Make My Drive Fun | Share Routes | Tantrumming Trailblazers"></a></p>
<section id="ttb-mmdf-page" class="ttb-mmdf-page" aria-labelledby="ttb-mmdf-title">
  <style>
    #ttb-mmdf-page {
      --ttb-ink: #1d1712;
      --ttb-soft-ink: #5f554d;
      --ttb-muted: #8d8176;
      --ttb-cream: #f8f3e8;
      --ttb-paper: #fffdf8;
      --ttb-blue: #e8f2f7;
      --ttb-rust: #c84f1a;
      --ttb-orange: #ff7a32;
      --ttb-green: #2f7d57;
      --ttb-border: rgba(29, 23, 18, 0.12);
      --ttb-shadow: 0 18px 45px rgba(29, 23, 18, 0.10);

      position: relative;
      background: var(--ttb-cream);
      color: var(--ttb-ink);
      font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
      line-height: 1.65;
      overflow: visible;
      -webkit-text-size-adjust: 100%;
    }

    #ttb-mmdf-page,
    #ttb-mmdf-page * {
      box-sizing: border-box;
    }

    #ttb-mmdf-page a,
    #ttb-mmdf-page button,
    #ttb-mmdf-page input,
    #ttb-mmdf-page select,
    #ttb-mmdf-page textarea,
    #ttb-mmdf-page label,
    #ttb-mmdf-page [role="button"] {
      -webkit-tap-highlight-color: rgba(255, 122, 50, 0.22);
    }

    #ttb-mmdf-page .ttb-wrap {
      max-width: 1180px;
      margin: 0 auto;
      padding: clamp(28px, 5vw, 76px) clamp(18px, 4vw, 38px);
      position: relative;
      z-index: 1;
    }

    #ttb-mmdf-page .ttb-hero {
      position: relative;
      display: grid;
      grid-template-columns: minmax(0, 1.18fr) minmax(320px, 0.82fr);
      gap: clamp(24px, 4vw, 46px);
      align-items: end;
      padding: clamp(30px, 5vw, 62px);
      border-radius: 34px;
      background:
        radial-gradient(circle at top right, rgba(255, 122, 50, 0.22), transparent 34%),
        radial-gradient(circle at bottom left, rgba(232, 242, 247, 0.12), transparent 38%),
        linear-gradient(135deg, #1d1712 0%, #33241d 58%, #6f321d 145%);
      box-shadow: var(--ttb-shadow);
      overflow: hidden;
      isolation: isolate;
    }

    #ttb-mmdf-page .ttb-hero::before {
      content: "";
      position: absolute;
      inset: 0;
      background-image:
        linear-gradient(rgba(255,255,255,0.04) 1px, transparent 1px),
        linear-gradient(90deg, rgba(255,255,255,0.04) 1px, transparent 1px);
      background-size: 34px 34px;
      opacity: 0.42;
      z-index: -1;
      pointer-events: none;
    }

    #ttb-mmdf-page .ttb-kicker,
    #ttb-mmdf-page .ttb-section-kicker {
      margin: 0 0 10px;
      color: var(--ttb-rust);
      font-size: 0.78rem;
      font-weight: 900;
      letter-spacing: 0.32em;
      text-transform: uppercase;
    }

    #ttb-mmdf-page .ttb-hero .ttb-kicker {
      color: rgba(255,255,255,0.78);
      margin-bottom: 14px;
    }

    #ttb-mmdf-page .ttb-title {
      margin: 0;
      max-width: 720px;
      color: #fff;
      font-size: clamp(3rem, 5.4vw, 5.1rem);
      line-height: 0.92;
      letter-spacing: -0.07em;
      font-weight: 950;
    }

    #ttb-mmdf-page .ttb-title-line {
      display: block;
      max-width: 100%;
    }

    #ttb-mmdf-page .ttb-title-line:last-child {
      font-size: 0.84em;
      letter-spacing: -0.062em;
    }

    #ttb-mmdf-page .ttb-intro {
      margin: clamp(18px, 3vw, 26px) 0 0;
      max-width: 760px;
      color: rgba(255,255,255,0.88);
      font-family: Georgia, "Times New Roman", serif;
      font-size: clamp(1.05rem, 1.8vw, 1.32rem);
      font-style: italic;
      line-height: 1.58;
    }

    #ttb-mmdf-page .ttb-hero-actions,
    #ttb-mmdf-page .ttb-share-row,
    #ttb-mmdf-page .ttb-filter-row,
    #ttb-mmdf-page .ttb-pill-row {
      display: flex;
      flex-wrap: wrap;
      gap: 12px;
      margin-top: 24px;
    }

    #ttb-mmdf-page .ttb-button {
      position: relative;
      display: inline-flex;
      align-items: center;
      justify-content: center;
      min-height: 48px;
      padding: 13px 20px;
      border-radius: 999px;
      font-weight: 900;
      text-decoration: none;
      letter-spacing: 0.03em;
      transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.2s ease;
      border: 0;
      cursor: pointer;
      font: inherit;
      line-height: 1.2;
    }

    @media (hover: hover) and (pointer: fine) {
      #ttb-mmdf-page .ttb-button:hover {
        transform: translateY(-2px);
      }
    }

    #ttb-mmdf-page .ttb-button-primary {
      background: var(--ttb-orange);
      color: #1d1712;
      box-shadow: 0 14px 28px rgba(255, 122, 50, 0.25);
    }

    #ttb-mmdf-page .ttb-button-secondary {
      background: rgba(255,255,255,0.12);
      border: 1px solid rgba(255,255,255,0.22);
      color: #fff;
    }

    #ttb-mmdf-page .ttb-share-panel .ttb-button-secondary {
      color: var(--ttb-ink);
      background: #fff;
      border: 1px solid var(--ttb-border);
    }

    #ttb-mmdf-page .ttb-button:focus-visible,
    #ttb-mmdf-page .ttb-search-toggle:focus-visible,
    #ttb-mmdf-page summary:focus-visible {
      outline: 3px solid rgba(255, 122, 50, 0.6);
      outline-offset: 3px;
    }

    #ttb-mmdf-page .ttb-hero-card {
      width: 100%;
      max-width: 420px;
      justify-self: end;
      align-self: end;
      padding: 24px;
      border-radius: 26px;
      background: rgba(255, 253, 248, 0.95);
      backdrop-filter: blur(10px);
      box-shadow: 0 12px 35px rgba(0,0,0,0.18);
    }

    #ttb-mmdf-page .ttb-hero-card h2,
    #ttb-mmdf-page .ttb-info-card h3 {
      margin: 0 0 10px;
      line-height: 1.2;
      letter-spacing: -0.02em;
    }

    #ttb-mmdf-page .ttb-hero-card h2 {
      font-size: 1.35rem;
    }

    #ttb-mmdf-page .ttb-hero-card p,
    #ttb-mmdf-page .ttb-info-card p,
    #ttb-mmdf-page .ttb-app-card p,
    #ttb-mmdf-page .ttb-route-card p,
    #ttb-mmdf-page .ttb-lede,
    #ttb-mmdf-page .ttb-faq p,
    #ttb-mmdf-page .ttb-share-panel p {
      color: var(--ttb-soft-ink);
    }

    #ttb-mmdf-page .ttb-pill {
      display: inline-flex;
      align-items: center;
      gap: 7px;
      padding: 8px 11px;
      border: 1px solid var(--ttb-border);
      border-radius: 999px;
      background: #fff;
      color: var(--ttb-ink);
      font-size: 0.82rem;
      font-weight: 850;
      letter-spacing: 0.02em;
    }

    #ttb-mmdf-page .ttb-pill.live::before {
      content: "";
      width: 8px;
      height: 8px;
      border-radius: 999px;
      background: var(--ttb-green);
      box-shadow: 0 0 0 5px rgba(47, 125, 87, 0.14);
    }

    #ttb-mmdf-page .ttb-preview {
      margin-top: clamp(26px, 5vw, 48px);
      display: grid;
      grid-template-columns: minmax(0, 1fr) minmax(280px, 0.9fr);
      gap: 18px;
      align-items: stretch;
    }

    #ttb-mmdf-page .ttb-app-card,
    #ttb-mmdf-page .ttb-route-card,
    #ttb-mmdf-page .ttb-info-card,
    #ttb-mmdf-page .ttb-search-box,
    #ttb-mmdf-page .ttb-share-panel,
    #ttb-mmdf-page .ttb-faq details {
      background: var(--ttb-paper);
      border: 1px solid var(--ttb-border);
      box-shadow: var(--ttb-shadow);
    }

    #ttb-mmdf-page .ttb-app-card,
    #ttb-mmdf-page .ttb-route-card {
      padding: 22px;
      border-radius: 28px;
    }

    #ttb-mmdf-page .ttb-app-card h2,
    #ttb-mmdf-page .ttb-route-card h2,
    #ttb-mmdf-page .ttb-section-head h2,
    #ttb-mmdf-page .ttb-tool-head h2,
    #ttb-mmdf-page .ttb-wide-panel h2,
    #ttb-mmdf-page .ttb-share-panel h2 {
      margin: 0;
      line-height: 0.92;
      letter-spacing: -0.06em;
      font-weight: 950;
    }

    #ttb-mmdf-page .ttb-app-card h2,
    #ttb-mmdf-page .ttb-route-card h2 {
      font-size: clamp(2rem, 5vw, 4rem);
      margin-bottom: 14px;
    }

    #ttb-mmdf-page .ttb-section-head h2 {
      font-size: clamp(2.3rem, 7vw, 5.4rem);
    }

    #ttb-mmdf-page .ttb-tool-head h2,
    #ttb-mmdf-page .ttb-wide-panel h2 {
      color: #fff;
      font-size: clamp(2.2rem, 6vw, 4.8rem);
    }

    #ttb-mmdf-page .ttb-share-panel h2 {
      font-size: clamp(2.4rem, 7vw, 5.6rem);
    }

    #ttb-mmdf-page .ttb-script-dark {
      display: block;
      color: var(--ttb-rust);
      font-family: Georgia, "Times New Roman", serif;
      font-size: clamp(1.55rem, 4vw, 3.1rem);
      font-style: italic;
      font-weight: 400;
      letter-spacing: 0;
      line-height: 1.05;
      margin-top: 8px;
    }

    #ttb-mmdf-page .ttb-route-lines {
      display: grid;
      gap: 14px;
      margin-top: 20px;
    }

    #ttb-mmdf-page .ttb-route-line {
      display: grid;
      grid-template-columns: 38px 1fr;
      gap: 12px;
      align-items: start;
      padding: 14px;
      border-radius: 18px;
      background: #f8f3e8;
      border: 1px solid var(--ttb-border);
    }

    #ttb-mmdf-page .ttb-dot {
      width: 18px;
      height: 18px;
      margin: 4px auto 0;
      border-radius: 999px;
      background: var(--ttb-rust);
      box-shadow: 0 0 0 6px rgba(200, 79, 26, 0.12);
    }

    #ttb-mmdf-page .ttb-dot.mid {
      background: var(--ttb-orange);
    }

    #ttb-mmdf-page .ttb-dot.end {
      background: var(--ttb-green);
    }

    #ttb-mmdf-page .ttb-label {
      margin-bottom: 3px;
      color: var(--ttb-muted);
      font-size: 0.75rem;
      font-weight: 900;
      letter-spacing: 0.1em;
      text-transform: uppercase;
    }

    #ttb-mmdf-page .ttb-value {
      color: var(--ttb-ink);
      font-weight: 900;
    }

    #ttb-mmdf-page .ttb-map-stats {
      display: grid;
      grid-template-columns: repeat(4, minmax(0, 1fr));
      gap: 10px;
      margin-top: 18px;
    }

    #ttb-mmdf-page .ttb-stat {
      min-height: 62px;
      padding: 12px;
      border-radius: 18px;
      background: #fff4ea;
      color: var(--ttb-ink);
      font-weight: 900;
      text-align: center;
      border: 1px solid rgba(200, 79, 26, 0.14);
    }

    #ttb-mmdf-page .ttb-filter {
      display: inline-flex;
      align-items: center;
      justify-content: center;
      min-height: 38px;
      padding: 9px 13px;
      border-radius: 999px;
      background: #fff;
      border: 1px solid var(--ttb-border);
      color: var(--ttb-ink);
      font-weight: 850;
      font-size: 0.9rem;
      line-height: 1.2;
    }

    #ttb-mmdf-page .ttb-filter.active {
      background: var(--ttb-rust);
      color: #fff;
      border-color: var(--ttb-rust);
    }

    #ttb-mmdf-page .ttb-section-head {
      margin: clamp(42px, 7vw, 72px) 0 clamp(22px, 4vw, 34px);
    }

    #ttb-mmdf-page .ttb-lede {
      max-width: 900px;
      margin: 18px 0 0;
      font-size: clamp(1rem, 2vw, 1.18rem);
    }

    #ttb-mmdf-page .ttb-card-grid {
      display: grid;
      grid-template-columns: repeat(3, minmax(0, 1fr));
      gap: 18px;
    }

    #ttb-mmdf-page .ttb-info-card {
      position: relative;
      min-height: 100%;
      padding: 24px;
      border-radius: 26px;
      box-shadow: 0 10px 26px rgba(29, 23, 18, 0.06);
      overflow: hidden;
    }

    #ttb-mmdf-page .ttb-info-card::before {
      content: "";
      position: absolute;
      inset: 0 auto 0 0;
      width: 5px;
      background: var(--ttb-rust);
      opacity: 0.88;
      pointer-events: none;
    }

    #ttb-mmdf-page .ttb-icon {
      width: 46px;
      height: 46px;
      display: grid;
      place-items: center;
      margin-bottom: 16px;
      border-radius: 16px;
      background: var(--ttb-blue);
      font-size: 1.45rem;
    }

    #ttb-mmdf-page .ttb-info-card h3 {
      font-size: 1.32rem;
    }

    #ttb-mmdf-page .ttb-tool-shell {
      position: relative;
      z-index: 20;
      margin-top: clamp(38px, 7vw, 70px);
      padding: clamp(20px, 4vw, 34px);
      border-radius: 34px;
      background: #1d1712;
      color: #fff;
      box-shadow: var(--ttb-shadow);
      scroll-margin-top: 90px;
      overflow: visible;
    }

    #ttb-mmdf-page .ttb-tool-head {
      display: grid;
      grid-template-columns: minmax(0, 1fr) auto;
      gap: 18px;
      align-items: end;
      margin-bottom: 20px;
    }

    #ttb-mmdf-page .ttb-tool-head p,
    #ttb-mmdf-page .ttb-wide-panel p {
      max-width: 780px;
      margin: 14px 0 0;
      color: rgba(255,255,255,0.78);
    }

    #ttb-mmdf-page .ttb-tool-side {
      display: flex;
      flex-direction: column;
      align-items: stretch;
      gap: 10px;
      min-width: 260px;
      max-width: 320px;
    }

    #ttb-mmdf-page .ttb-tool-badge {
      display: inline-flex;
      align-items: center;
      justify-content: center;
      min-height: 40px;
      padding: 10px 14px;
      border-radius: 999px;
      background: rgba(255,122,50,0.16);
      border: 1px solid rgba(255,122,50,0.25);
      color: #ffd8c3;
      font-weight: 900;
      white-space: nowrap;
    }

    #ttb-mmdf-page .ttb-update-box {
      border-radius: 20px;
      background: rgba(255,255,255,0.07);
      border: 1px solid rgba(255,255,255,0.13);
      overflow: hidden;
      box-shadow: 0 10px 28px rgba(0,0,0,0.16);
    }

    #ttb-mmdf-page .ttb-update-box-head {
      display: flex;
      align-items: center;
      justify-content: space-between;
      gap: 10px;
      padding: 12px 14px;
      background: rgba(255,122,50,0.16);
      border-bottom: 1px solid rgba(255,255,255,0.11);
    }

    #ttb-mmdf-page .ttb-update-box-title {
      margin: 0;
      color: #fff;
      font-size: 0.78rem;
      font-weight: 950;
      letter-spacing: 0.12em;
      text-transform: uppercase;
      line-height: 1.2;
    }

    #ttb-mmdf-page .ttb-update-box-count {
      flex-shrink: 0;
      padding: 4px 8px;
      border-radius: 999px;
      background: rgba(255,255,255,0.12);
      color: #ffd8c3;
      font-size: 0.68rem;
      font-weight: 900;
      line-height: 1;
    }

    #ttb-mmdf-page .ttb-update-list {
      max-height: 156px;
      overflow-y: auto;
      overscroll-behavior: contain;
      scrollbar-width: thin;
      padding: 8px;
    }

    #ttb-mmdf-page .ttb-update-item {
      display: grid;
      grid-template-columns: auto 1fr;
      gap: 9px;
      padding: 9px 8px;
      border-radius: 14px;
      color: rgba(255,255,255,0.82);
      font-size: 0.82rem;
      line-height: 1.35;
    }

    #ttb-mmdf-page .ttb-update-item + .ttb-update-item {
      border-top: 1px solid rgba(255,255,255,0.08);
    }

    #ttb-mmdf-page .ttb-update-dot {
      width: 9px;
      height: 9px;
      margin-top: 5px;
      border-radius: 999px;
      background: var(--ttb-orange);
      box-shadow: 0 0 0 4px rgba(255,122,50,0.14);
    }

    #ttb-mmdf-page .ttb-update-item strong {
      display: block;
      color: #fff;
      font-weight: 950;
      margin-bottom: 2px;
    }

    #ttb-mmdf-page .ttb-update-item span {
      color: rgba(255,255,255,0.68);
    }

    #ttb-mmdf-page .ttb-update-item.latest-fix .ttb-update-dot {
      background: var(--ttb-green);
      box-shadow: 0 0 0 4px rgba(47, 125, 87, 0.18), 0 0 16px rgba(47, 125, 87, 0.55);
    }

    #ttb-mmdf-page .ttb-update-item.latest-issue .ttb-update-dot {
      background: #f59e0b;
      box-shadow: 0 0 0 4px rgba(245, 158, 11, 0.18), 0 0 16px rgba(245, 158, 11, 0.55);
    }

    #ttb-mmdf-page .ttb-update-meta {
      display: inline-flex;
      align-items: center;
      gap: 6px;
      margin: 2px 0 4px;
      padding: 3px 8px;
      border-radius: 999px;
      background: rgba(47, 125, 87, 0.16);
      color: #bdf5d4 !important;
      font-size: 0.68rem;
      font-weight: 900;
      letter-spacing: 0.08em;
      text-transform: uppercase;
      line-height: 1.2;
    }

    #ttb-mmdf-page .ttb-update-meta.issue {
      background: rgba(245, 158, 11, 0.16);
      color: #ffe8b8 !important;
    }

    #ttb-mmdf-page .ttb-map-holder {
      position: relative;
      z-index: 30;
      border-radius: 28px;
      background: #fffdf8;
      border: 1px solid rgba(255,255,255,0.12);
      box-shadow: 0 16px 40px rgba(0,0,0,0.2);
      color: var(--ttb-ink);
      min-height: 420px;
      overflow: visible !important;
    }

    #ttb-mmdf-page .ttb-map-inner {
      position: relative;
      z-index: 31;
      border-radius: 28px;
      min-height: 420px;
      background: #fffdf8;
      overflow: visible !important;
    }

    #ttb-mmdf-page .ttb-wide-panel {
      display: grid;
      grid-template-columns: minmax(0, 0.78fr) minmax(0, 1.22fr);
      gap: clamp(18px, 3vw, 34px);
      align-items: start;
      margin-top: clamp(34px, 6vw, 58px);
      padding: clamp(24px, 4vw, 40px);
      border-radius: 34px;
      background: #1d1712;
      color: #fff;
      box-shadow: var(--ttb-shadow);
    }

    #ttb-mmdf-page .ttb-checklist {
      display: grid;
      gap: 12px;
      margin: 0;
      padding: 0;
      list-style: none;
    }

    #ttb-mmdf-page .ttb-checklist li {
      display: grid;
      grid-template-columns: auto 1fr;
      gap: 12px;
      align-items: start;
      padding: 15px 16px;
      border: 1px solid rgba(255,255,255,0.12);
      border-radius: 18px;
      background: rgba(255,255,255,0.07);
      color: rgba(255,255,255,0.9);
    }

    #ttb-mmdf-page .ttb-check {
      display: grid;
      place-items: center;
      width: 24px;
      height: 24px;
      border-radius: 999px;
      background: var(--ttb-orange);
      color: #1d1712;
      font-weight: 950;
      line-height: 1;
    }

    #ttb-mmdf-page .ttb-search-box {
      margin-top: clamp(34px, 6vw, 58px);
      border-radius: 26px;
      overflow: hidden;
    }

    #ttb-mmdf-page .ttb-search-toggle {
      width: 100%;
      display: flex;
      align-items: center;
      justify-content: space-between;
      gap: 14px;
      padding: 20px 24px;
      background: var(--ttb-paper);
      border: 0;
      color: var(--ttb-ink);
      font: inherit;
      cursor: pointer;
      font-weight: 950;
      font-size: 1.1rem;
      text-align: left;
    }

    #ttb-mmdf-page .ttb-search-toggle span {
      color: var(--ttb-rust);
      font-weight: 950;
    }

    #ttb-mmdf-page .ttb-search-content {
      display: none;
      padding: 0 24px 24px;
    }

    #ttb-mmdf-page .ttb-search-content.open {
      display: block;
    }

    #ttb-mmdf-page .ttb-search-table {
      width: 100%;
      border-collapse: collapse;
      overflow: hidden;
      border-radius: 18px;
    }

    #ttb-mmdf-page .ttb-search-table th {
      text-align: left;
      padding: 13px 14px;
      background: #1d1712;
      color: #fff;
      font-size: 0.82rem;
      letter-spacing: 0.08em;
      text-transform: uppercase;
    }

    #ttb-mmdf-page .ttb-search-table td {
      padding: 13px 14px;
      border-bottom: 1px solid var(--ttb-border);
      color: var(--ttb-soft-ink);
      background: #fffdf8;
    }

    #ttb-mmdf-page .ttb-search-table tr:nth-child(even) td {
      background: #f8f3e8;
    }

    #ttb-mmdf-page .ttb-term {
      display: inline-flex;
      padding: 5px 8px;
      border-radius: 9px;
      background: #fff4ea;
      color: var(--ttb-rust);
      font-weight: 900;
      font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
      font-size: 0.88rem;
    }

    #ttb-mmdf-page .ttb-faq {
      display: grid;
      gap: 12px;
    }

    #ttb-mmdf-page .ttb-faq details {
      padding: 18px 20px;
      border-radius: 20px;
      box-shadow: 0 8px 20px rgba(29, 23, 18, 0.05);
    }

    #ttb-mmdf-page .ttb-faq summary {
      cursor: pointer;
      font-weight: 950;
      color: var(--ttb-ink);
      list-style: none;
    }

    #ttb-mmdf-page .ttb-faq summary::-webkit-details-marker {
      display: none;
    }

    #ttb-mmdf-page .ttb-faq summary::after {
      content: "+";
      float: right;
      color: var(--ttb-rust);
      font-size: 1.2rem;
      line-height: 1;
    }

    #ttb-mmdf-page .ttb-faq details[open] summary::after {
      content: "−";
    }

    #ttb-mmdf-page .ttb-share-panel {
      margin-top: clamp(34px, 6vw, 58px);
      padding: clamp(24px, 4vw, 40px);
      border-radius: 34px;
      background:
        radial-gradient(circle at top left, rgba(255,122,50,0.22), transparent 34%),
        linear-gradient(135deg, #fffdf8, #eef6f9);
      text-align: center;
    }

    #ttb-mmdf-page .ttb-share-panel p {
      max-width: 760px;
      margin: 18px auto 0;
      font-size: 1.08rem;
    }

    #ttb-mmdf-page .ttb-small-print {
      font-size: 0.92rem;
    }

    #ttb-mmdf-page .ttb-toast {
      position: fixed;
      left: 50%;
      bottom: 24px;
      transform: translateX(-50%) translateY(18px);
      background: #1d1712;
      color: #fff;
      padding: 12px 16px;
      border-radius: 14px;
      font-weight: 900;
      opacity: 0;
      visibility: hidden;
      transition: opacity 0.22s ease, transform 0.22s ease, visibility 0.22s ease;
      z-index: 99999;
      box-shadow: 0 16px 34px rgba(29,23,18,0.25);
      pointer-events: none;
    }

    #ttb-mmdf-page .ttb-toast.show {
      opacity: 1;
      visibility: visible;
      transform: translateX(-50%) translateY(0);
    }

    /* Leaflet theme protection only. This should not control the app logic. */
    #ttb-mmdf-page .leaflet-container img,
    #ttb-mmdf-page .leaflet-tile,
    #ttb-mmdf-page .leaflet-marker-icon,
    #ttb-mmdf-page .leaflet-marker-shadow {
      max-width: none !important;
      max-height: none !important;
      box-shadow: none !important;
      border-radius: 0 !important;
    }

    #ttb-mmdf-page #map,
    #ttb-mmdf-page .leaflet-container {
      overflow: hidden !important;
    }

    /*
      Mobile fullscreen helper only.
      Desktop is deliberately left alone so the plugin controls fullscreen.
    */
    @media (max-width: 900px) {
      #ttb-mmdf-page .app-shell.is-full {
        position: fixed !important;
        inset: 0 !important;
        width: 100vw !important;
        height: 100dvh !important;
        max-width: none !important;
        max-height: none !important;
        margin: 0 !important;
        padding: 0 !important;
        border-radius: 0 !important;
        overflow: hidden !important;
        z-index: 999999 !important;
      }

      #ttb-mmdf-page #app-wrapper.ttb-app-is-full {
        position: fixed !important;
        inset: 0 !important;
        width: 100vw !important;
        height: 100dvh !important;
        overflow: hidden !important;
        z-index: 999999 !important;
      }

      #ttb-mmdf-page .app-shell.is-full #map,
      #ttb-mmdf-page .app-shell.is-full .leaflet-container {
        width: 100vw !important;
        height: 100dvh !important;
        min-height: 100dvh !important;
        border-radius: 0 !important;
      }

      body.ttb-mmdf-fullscreen {
        overflow: hidden !important;
      }

      body.ttb-mmdf-fullscreen .site-header,
      body.ttb-mmdf-fullscreen header.site-header,
      body.ttb-mmdf-fullscreen .main-header,
      body.ttb-mmdf-fullscreen #masthead,
      body.ttb-mmdf-fullscreen .wp-site-header {
        display: none !important;
      }
    }

    @media (max-width: 1020px) {
      #ttb-mmdf-page .ttb-preview,
      #ttb-mmdf-page .ttb-wide-panel {
        grid-template-columns: 1fr;
      }

      #ttb-mmdf-page .ttb-card-grid {
        grid-template-columns: repeat(2, minmax(0, 1fr));
      }
    }

    @media (max-width: 900px) {
      #ttb-mmdf-page .ttb-hero {
        grid-template-columns: 1fr;
      }

      #ttb-mmdf-page .ttb-title {
        max-width: 100%;
        font-size: clamp(3rem, 13vw, 4.8rem);
        line-height: 0.88;
      }

      #ttb-mmdf-page .ttb-title-line:last-child {
        font-size: 1em;
        letter-spacing: -0.065em;
      }

      #ttb-mmdf-page .ttb-hero-card {
        max-width: none;
        justify-self: stretch;
      }
    }

    @media (max-width: 700px) {
      #ttb-mmdf-page .ttb-card-grid,
      #ttb-mmdf-page .ttb-map-stats {
        grid-template-columns: 1fr;
      }

      #ttb-mmdf-page .ttb-tool-head {
        grid-template-columns: 1fr;
      }

      #ttb-mmdf-page .ttb-tool-side {
        max-width: none;
        min-width: 0;
      }

      #ttb-mmdf-page .ttb-map-holder,
      #ttb-mmdf-page .ttb-map-inner,
      #ttb-mmdf-page .leaflet-container {
        min-height: 520px;
      }

      #ttb-mmdf-page .ttb-search-table thead {
        display: none;
      }

      #ttb-mmdf-page .ttb-search-table,
      #ttb-mmdf-page .ttb-search-table tbody,
      #ttb-mmdf-page .ttb-search-table tr,
      #ttb-mmdf-page .ttb-search-table td {
        display: block;
        width: 100%;
      }

      #ttb-mmdf-page .ttb-search-table td {
        border-bottom: 0;
      }
    }

    @media (max-width: 560px) {
      #ttb-mmdf-page .ttb-wrap {
        padding-left: 16px;
        padding-right: 16px;
      }

      #ttb-mmdf-page .ttb-hero,
      #ttb-mmdf-page .ttb-app-card,
      #ttb-mmdf-page .ttb-route-card,
      #ttb-mmdf-page .ttb-info-card,
      #ttb-mmdf-page .ttb-tool-shell,
      #ttb-mmdf-page .ttb-wide-panel,
      #ttb-mmdf-page .ttb-search-box,
      #ttb-mmdf-page .ttb-share-panel {
        border-radius: 24px;
      }

      #ttb-mmdf-page .ttb-hero {
        padding: 26px 20px;
      }

      #ttb-mmdf-page .ttb-title {
        font-size: clamp(2.8rem, 15vw, 4.2rem);
        letter-spacing: -0.065em;
      }

      #ttb-mmdf-page .ttb-intro {
        font-size: 1rem;
        line-height: 1.65;
      }

      #ttb-mmdf-page .ttb-section-head h2,
      #ttb-mmdf-page .ttb-tool-head h2,
      #ttb-mmdf-page .ttb-wide-panel h2,
      #ttb-mmdf-page .ttb-share-panel h2 {
        font-size: clamp(2.5rem, 13vw, 4rem);
      }

      #ttb-mmdf-page .ttb-hero-actions .ttb-button,
      #ttb-mmdf-page .ttb-share-row .ttb-button {
        width: 100%;
      }

      #ttb-mmdf-page .ttb-tool-shell {
        padding: 16px;
      }

      #ttb-mmdf-page .ttb-map-holder,
      #ttb-mmdf-page .ttb-map-inner,
      #ttb-mmdf-page .leaflet-container {
        min-height: 560px;
      }
    }

/* ============================================================
   SAFE FINAL FIX - DO NOT FORCE APP GRID
   Fixes:
   - Desktop map width without killing Leaflet
   - Mobile GPS/control overflow
   - Mobile menu/dropdown clipping
   - Keeps existing fullscreen portal fix intact
   ============================================================ */

/* Basic page safety */
html,
body {
  max-width: 100%;
  overflow-x: hidden;
}

#ttb-mmdf-page {
  width: 100%;
  max-width: 100%;
  overflow-x: clip;
}

#ttb-mmdf-page,
#ttb-mmdf-page * {
  box-sizing: border-box;
}

/* ============================================================
   DESKTOP: FULL WIDTH LIVE TOOL, BUT DO NOT ALTER APP LOGIC
   ============================================================ */

@media (min-width: 901px) {
  #ttb-mmdf-page #mmdf-live-tool {
    width: calc(100vw - 32px) !important;
    max-width: calc(100vw - 32px) !important;
    margin-left: calc(50% - 50vw + 16px) !important;
    margin-right: calc(50% - 50vw + 16px) !important;
    padding-left: 24px !important;
    padding-right: 24px !important;
    overflow: visible !important;
  }

  #ttb-mmdf-page .ttb-map-holder,
  #ttb-mmdf-page .ttb-map-inner,
  #ttb-mmdf-page #app-wrapper {
    width: 100% !important;
    max-width: 100% !important;
    min-width: 0 !important;
  }

  /* Undo the bad forced grid from the previous patch */
  #ttb-mmdf-page #app-wrapper .app-shell {
    grid-template-columns: unset !important;
    max-width: 100% !important;
    min-width: 0 !important;
  }

  #ttb-mmdf-page #app-wrapper #map,
  #ttb-mmdf-page #app-wrapper .leaflet-container {
    display: block !important;
    width: 100% !important;
    max-width: 100% !important;
    min-width: 0 !important;
    min-height: 760px !important;
  }

  #ttb-mmdf-page .leaflet-right {
    right: 12px !important;
  }

  #ttb-mmdf-page .leaflet-right .leaflet-control {
    margin-right: 0 !important;
  }
}

/* ============================================================
   MOBILE: KEEP WIDTH INSIDE SCREEN
   ============================================================ */

@media (max-width: 900px) {
  #ttb-mmdf-page .ttb-wrap {
    width: 100% !important;
    max-width: 100% !important;
    padding-left: 10px !important;
    padding-right: 10px !important;
  }

  #ttb-mmdf-page .ttb-tool-shell {
    width: 100% !important;
    max-width: 100% !important;
    padding-left: 10px !important;
    padding-right: 10px !important;
    overflow: visible !important;
  }

  #ttb-mmdf-page .ttb-map-holder,
  #ttb-mmdf-page .ttb-map-inner,
  #ttb-mmdf-page #app-wrapper,
  #ttb-mmdf-page #app-wrapper .app-shell,
  #ttb-mmdf-page #app-wrapper .container,
  #ttb-mmdf-page #app-wrapper main,
  #ttb-mmdf-page #app-wrapper #map,
  #ttb-mmdf-page #app-wrapper .leaflet-container {
    width: 100% !important;
    max-width: 100% !important;
    min-width: 0 !important;
    box-sizing: border-box !important;
  }

  /* Stop GPS/control buttons escaping right */
  #ttb-mmdf-page #app-wrapper .top-menu-strip {
    width: 100% !important;
    max-width: 100% !important;
    min-width: 0 !important;
    box-sizing: border-box !important;
    overflow-x: auto !important;
    overflow-y: visible !important;
    -webkit-overflow-scrolling: touch;
    position: relative !important;
    z-index: 99999 !important;
  }

  #ttb-mmdf-page #app-wrapper .menu-icon-btn,
  #ttb-mmdf-page #app-wrapper .gps-btn,
  #ttb-mmdf-page #app-wrapper .locate-btn,
  #ttb-mmdf-page #app-wrapper .location-btn {
    flex: 0 0 auto !important;
    max-width: calc(100vw - 24px) !important;
    box-sizing: border-box !important;
  }

  /* Let dropdowns/bottom sheets appear above map */
  #ttb-mmdf-page #app-wrapper .left-menu,
  #ttb-mmdf-page #app-wrapper .bottom-sheet,
  #ttb-mmdf-page #app-wrapper .bottom-sheet-content,
  #ttb-mmdf-page #app-wrapper .dropdown,
  #ttb-mmdf-page #app-wrapper .dropdown-menu,
  #ttb-mmdf-page #app-wrapper .menu-dropdown,
  #ttb-mmdf-page #app-wrapper .mobile-menu,
  #ttb-mmdf-page #app-wrapper .menu-panel,
  #ttb-mmdf-page #app-wrapper .filter-menu,
  #ttb-mmdf-page #app-wrapper .filter-panel,
  #ttb-mmdf-page #app-wrapper .category-menu,
  #ttb-mmdf-page #app-wrapper .category-panel {
    max-width: 100% !important;
    min-width: 0 !important;
    box-sizing: border-box !important;
    z-index: 2147483647 !important;
    pointer-events: auto !important;
  }

  #ttb-mmdf-page #app-wrapper .bottom-sheet-content {
    overflow-y: auto !important;
    overflow-x: hidden !important;
    -webkit-overflow-scrolling: touch;
  }

  #ttb-mmdf-page .leaflet-right {
    right: 10px !important;
    max-width: calc(100% - 20px) !important;
  }

  #ttb-mmdf-page .leaflet-right .leaflet-control {
    margin-right: 0 !important;
  }

  #ttb-mmdf-page .leaflet-left {
    left: 10px !important;
  }
}

/* ============================================================
   MOBILE FULLSCREEN: PRESERVE EXISTING FIX, BUT LET MENU OPEN
   ============================================================ */

@media (max-width: 900px) {
  body.ttb-mmdf-fullscreen #app-wrapper.ttb-app-is-full .top-menu-strip {
    overflow-x: auto !important;
    overflow-y: visible !important;
    z-index: 2147483647 !important;
  }

  body.ttb-mmdf-fullscreen #app-wrapper.ttb-app-is-full .left-menu,
  body.ttb-mmdf-fullscreen #app-wrapper.ttb-app-is-full .bottom-sheet,
  body.ttb-mmdf-fullscreen #app-wrapper.ttb-app-is-full .bottom-sheet-content,
  body.ttb-mmdf-fullscreen #app-wrapper.ttb-app-is-full .dropdown,
  body.ttb-mmdf-fullscreen #app-wrapper.ttb-app-is-full .dropdown-menu,
  body.ttb-mmdf-fullscreen #app-wrapper.ttb-app-is-full .menu-dropdown,
  body.ttb-mmdf-fullscreen #app-wrapper.ttb-app-is-full .mobile-menu,
  body.ttb-mmdf-fullscreen #app-wrapper.ttb-app-is-full .menu-panel,
  body.ttb-mmdf-fullscreen #app-wrapper.ttb-app-is-full .filter-menu,
  body.ttb-mmdf-fullscreen #app-wrapper.ttb-app-is-full .filter-panel,
  body.ttb-mmdf-fullscreen #app-wrapper.ttb-app-is-full .category-menu,
  body.ttb-mmdf-fullscreen #app-wrapper.ttb-app-is-full .category-panel {
    z-index: 2147483647 !important;
    pointer-events: auto !important;
  }
}
  </style>

  <div class="ttb-wrap">
    <header class="ttb-hero">
      <div>
        <p class="ttb-kicker">Make My Drive Fun</p>

        <h1 id="ttb-mmdf-title" class="ttb-title">
          <span class="ttb-title-line">Plan the drive.</span>
          <span class="ttb-title-line">Not just the destination.</span>
        </h1>

        <p class="ttb-intro">
          Turn boring journeys into proper family adventures. Add food stops, toilets, parks, scenic breaks,
          EV chargers and hidden gems along your route, then hand the trip off to Google Maps, Apple Maps or
          Waze when you are ready to go.
        </p>

        <div class="ttb-hero-actions">
          <a class="ttb-button ttb-button-primary" href="#mmdf-live-tool" data-ttb-scroll="mmdf-live-tool">
            Jump to the tool
          </a>

          <a class="ttb-button ttb-button-secondary" href="#mmdf-whats-new" data-ttb-scroll="mmdf-whats-new">
            What’s new?
          </a>
        </div>
      </div>

      <aside class="ttb-hero-card" aria-label="Tool summary">
        <h2>Free route planner for families</h2>

        <p>
          Set your start and finish, choose the stop types you care about, and build a route that works for real
          people in real cars, especially people travelling with children who suddenly need a toilet exactly seven
          minutes after you passed one.
        </p>

        <div class="ttb-pill-row">
          <span class="ttb-pill live">Live tool</span>
          <span class="ttb-pill"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f5fa.png" alt="🗺" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Map-first</span>
          <span class="ttb-pill"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a1.png" alt="⚡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> EV ready</span>
          <span class="ttb-pill"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f6bb.png" alt="🚻" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Toilet stops</span>
          <span class="ttb-pill"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f468-200d-1f469-200d-1f467-200d-1f467.png" alt="👨‍👩‍👧‍👧" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Family friendly</span>
          <span class="ttb-pill"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f504.png" alt="🔄" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Loop drives</span>
          <span class="ttb-pill"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4f2.png" alt="📲" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Installable app</span>
        </div>
      </aside>
    </header>

    <section class="ttb-preview" aria-label="Make My Drive Fun preview">
      <article class="ttb-app-card">
        <p class="ttb-section-kicker">Why it feels different</p>

        <h2>
          Tap. Add. Route.
          <span class="ttb-script-dark">No spreadsheet energy required.</span>
        </h2>

        <p>
          This is not just a route search box wearing a hat. The tool is built around the journey. Tap useful
          places on or near your route, add them as stops, save favourites, check nearby options, then open the
          final plan in your navigation app.
        </p>

        <div class="ttb-filter-row" aria-label="Example filters">
          <span class="ttb-filter active">Food</span>
          <span class="ttb-filter">Toilets</span>
          <span class="ttb-filter">Parks</span>
          <span class="ttb-filter">EV</span>
          <span class="ttb-filter">Historic sites</span>
          <span class="ttb-filter">Beaches</span>
        </div>
      </article>

      <aside class="ttb-route-card">
        <p class="ttb-section-kicker">Planning preview</p>

        <h2>
          Always-on route context.
          <span class="ttb-script-dark">Because faff is the enemy.</span>
        </h2>

        <div class="ttb-route-lines">
          <div class="ttb-route-line">
            <span class="ttb-dot"></span>
            <div>
              <div class="ttb-label">Start</div>
              <div class="ttb-value">Current location</div>
            </div>
          </div>

          <div class="ttb-route-line">
            <span class="ttb-dot mid"></span>
            <div>
              <div class="ttb-label">Stop 3</div>
              <div class="ttb-value">Food + play stop</div>
            </div>
          </div>

          <div class="ttb-route-line">
            <span class="ttb-dot end"></span>
            <div>
              <div class="ttb-label">Finish</div>
              <div class="ttb-value">Final destination</div>
            </div>
          </div>
        </div>

        <div class="ttb-map-stats">
          <div class="ttb-stat"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cf.png" alt="📏" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 218 km</div>
          <div class="ttb-stat"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/23f1.png" alt="⏱" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 3h 14m</div>
          <div class="ttb-stat"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cd.png" alt="📍" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 26 places</div>
          <div class="ttb-stat"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a1.png" alt="⚡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> EV aware</div>
        </div>
      </aside>
    </section>

    <section id="mmdf-whats-new" class="ttb-section-head">
      <p class="ttb-section-kicker">Major update</p>

      <h2>
        Cleaner, smarter, faster.
        <span class="ttb-script-dark">Built around how families actually drive.</span>
      </h2>

      <p class="ttb-lede">
        The latest version is more map-first, more mobile-friendly and more useful when you are building a real
        journey with multiple stops. It is designed for people who do not just want to arrive, they want the drive
        itself to be less painful and more interesting.
      </p>
    </section>

    <div class="ttb-card-grid">
      <article class="ttb-info-card">
        <div class="ttb-icon"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f5fa.png" alt="🗺" class="wp-smiley" style="height: 1em; max-height: 1em;" /></div>
        <h3>Map-first route building</h3>
        <p>Add places directly from the map. Food, toilets, parks, EV chargers and hidden gems can become proper stops rather than random pins you forget about five minutes later.</p>
      </article>

      <article class="ttb-info-card">
        <div class="ttb-icon"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cd.png" alt="📍" class="wp-smiley" style="height: 1em; max-height: 1em;" /></div>
        <h3>Multi-stop journeys</h3>
        <p>Build a route with numbered stops, useful waypoints and clearer journey flow. Ideal for families, road trips, scenic drives and emergency toilet situations.</p>
      </article>

      <article class="ttb-info-card">
        <div class="ttb-icon"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a1.png" alt="⚡" class="wp-smiley" style="height: 1em; max-height: 1em;" /></div>
        <h3>EV-friendly planning</h3>
        <p>Search for chargers along your route, including useful EV filtering. Perfect for avoiding that low-battery feeling.</p>
      </article>

      <article class="ttb-info-card">
        <div class="ttb-icon"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f6bb.png" alt="🚻" class="wp-smiley" style="height: 1em; max-height: 1em;" /></div>
        <h3>Useful family stops</h3>
        <p>Find toilets, parks, food, shops, beaches, natural places, historic sites and other stops that make family driving feel less like punishment from the gods.</p>
      </article>

      <article class="ttb-info-card">
        <div class="ttb-icon"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4f2.png" alt="📲" class="wp-smiley" style="height: 1em; max-height: 1em;" /></div>
        <h3>Shareable plans</h3>
        <p>Save or share routes so other people can load the same journey. Great for family groups and road trip planning.</p>
      </article>

      <article class="ttb-info-card">
        <div class="ttb-icon"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9ed.png" alt="🧭" class="wp-smiley" style="height: 1em; max-height: 1em;" /></div>
        <h3>Navigation handoff</h3>
        <p>Open stops or final routes in Google Maps, Apple Maps or Waze — or export GPX/KML for sat-navs and Google Earth. Plan here, drive with whatever you like.</p>
      </article>

      <article class="ttb-info-card">
        <div class="ttb-icon"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f929.png" alt="🤩" class="wp-smiley" style="height: 1em; max-height: 1em;" /></div>
        <h3>Fun Score &amp; loop drives</h3>
        <p>Every route is scored out of 100 for twistiness and hills, with an elevation profile to match. No destination in mind? Generate a fun loop from home and just drive.</p>
      </article>

      <article class="ttb-info-card">
        <div class="ttb-icon"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f5d3.png" alt="🗓" class="wp-smiley" style="height: 1em; max-height: 1em;" /></div>
        <h3>Timed itinerary + weather</h3>
        <p>Turn your route into a day plan with arrival times at every stop, the weather forecast when you get there, and a printable version for the glovebox.</p>
      </article>

      <article class="ttb-info-card">
        <div class="ttb-icon"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4f2.png" alt="📲" class="wp-smiley" style="height: 1em; max-height: 1em;" /></div>
        <h3>Works like an app</h3>
        <p>Install it to your phone home screen and keep planning in patchy signal — recently viewed map areas and the app itself stay available offline.</p>
      </article>
    </div>

    <section id="mmdf-live-tool" class="ttb-tool-shell" aria-labelledby="ttb-live-tool-title">
      <div class="ttb-tool-head">
        <div>
          <p class="ttb-section-kicker">Live tool</p>
          <h2 id="ttb-live-tool-title">Build your route.</h2>
          <p>
            Add your start and destination, choose the stop types you care about, and let the map help you find useful
            places along the way.
          </p>
        </div>

        <div class="ttb-tool-side" aria-label="Make My Drive Fun status and latest updates">
          <span class="ttb-tool-badge">Free web app</span>

          <aside class="ttb-update-box" aria-labelledby="ttb-update-box-title">
            <div class="ttb-update-box-head">
              <h3 id="ttb-update-box-title" class="ttb-update-box-title">Latest tool updates</h3>
              <span class="ttb-update-box-count">19</span>
            </div>

            <div class="ttb-update-list" tabindex="0" aria-label="Scrollable list of recent Make My Drive Fun updates">
              <div class="ttb-update-item latest-fix">
                <span class="ttb-update-dot" aria-hidden="true"></span>
                <div>
                  <strong>Fun Score &amp; elevation profile</strong>
                  <span class="ttb-update-meta">Added 12 June 2026</span>
                  <span>Every route now gets a Fun Score out of 100 based on how twisty and hilly it is, plus an elevation chart showing the climbs and descents along the way.</span>
                </div>
              </div>

              <div class="ttb-update-item latest-fix">
                <span class="ttb-update-dot" aria-hidden="true"></span>
                <div>
                  <strong>Fun loop generator</strong>
                  <span class="ttb-update-meta">Added 12 June 2026</span>
                  <span>Pick a start point and a rough duration and the tool scouts several candidate loops, scores them for fun, and builds the best one for you automatically.</span>
                </div>
              </div>

              <div class="ttb-update-item latest-fix">
                <span class="ttb-update-dot" aria-hidden="true"></span>
                <div>
                  <strong>Drag the route to reroute</strong>
                  <span class="ttb-update-meta">Added 12 June 2026</span>
                  <span>Grab the route line with your mouse and drop it where you want to go, or long-press it on mobile to add a via point with a tap.</span>
                </div>
              </div>

              <div class="ttb-update-item latest-fix">
                <span class="ttb-update-dot" aria-hidden="true"></span>
                <div>
                  <strong>Trip itinerary with weather</strong>
                  <span class="ttb-update-meta">Added 12 June 2026</span>
                  <span>Turn any route into a timed day plan with arrival times, configurable stop breaks, the forecast at each stop, and a print-friendly version.</span>
                </div>
              </div>

              <div class="ttb-update-item latest-fix">
                <span class="ttb-update-dot" aria-hidden="true"></span>
                <div>
                  <strong>GPX &amp; KML export</strong>
                  <span class="ttb-update-meta">Added 12 June 2026</span>
                  <span>Download your route as a GPX file for sat-navs and Garmin devices, or KML for Google Earth, straight from the Share menu.</span>
                </div>
              </div>

              <div class="ttb-update-item latest-fix">
                <span class="ttb-update-dot" aria-hidden="true"></span>
                <div>
                  <strong>Four map styles</strong>
                  <span class="ttb-update-meta">Added 12 June 2026</span>
                  <span>Switch between Clean, Streets, Terrain and Satellite basemaps. Your choice is remembered for next time.</span>
                </div>
              </div>

              <div class="ttb-update-item latest-fix">
                <span class="ttb-update-dot" aria-hidden="true"></span>
                <div>
                  <strong>Install it like an app</strong>
                  <span class="ttb-update-meta">Added 12 June 2026</span>
                  <span>Add Make My Drive Fun to your phone home screen. The app shell and recently viewed map areas now work even in patchy signal.</span>
                </div>
              </div>

              <div class="ttb-update-item latest-fix">
                <span class="ttb-update-dot" aria-hidden="true"></span>
                <div>
                  <strong>Favourites synced to your account</strong>
                  <span class="ttb-update-meta">Added 12 June 2026</span>
                  <span>Logged-in users now keep their saved places across devices, and saved routes can be renamed and duplicated with little route previews on each card.</span>
                </div>
              </div>

              <div class="ttb-update-item latest-fix">
                <span class="ttb-update-dot" aria-hidden="true"></span>
                <div>
                  <strong>Faster, lighter, safer</strong>
                  <span class="ttb-update-meta">Added 12 June 2026</span>
                  <span>Full light-mode design, quicker loading, stronger security hardening, backup routing servers, and a friendly first-visit tour for new users.</span>
                </div>
              </div>

              <div class="ttb-update-item latest-fix">
                <span class="ttb-update-dot" aria-hidden="true"></span>
                <div>
                  <strong>Fullscreen bug fixed</strong>
                  <span class="ttb-update-meta">Fixed 8 May 2026</span>
                  <span>Fixed the mobile fullscreen/menu issue where the bottom sheet only appeared when the map was physically in view. The app now escapes the theme wrapper during mobile fullscreen.</span>
                </div>
              </div>

              <div class="ttb-update-item latest-fix">
                <span class="ttb-update-dot" aria-hidden="true"></span>
                <div>
                  <strong>Mobile keyboard flicker fixed</strong>
                  <span class="ttb-update-meta">Fixed 8 May 2026</span>
                  <span>Stopped the mobile route text boxes from blurring after tap, which was making the keyboard pop up and down.</span>
                </div>
              </div>

              <div class="ttb-update-item latest-fix">
                <span class="ttb-update-dot" aria-hidden="true"></span>
                <div>
                  <strong>Mobile fullscreen theme issue fixed</strong>
                  <span class="ttb-update-meta">Fixed 8 May 2026</span>
                  <span>Fixed the custom theme CSS conflict that stopped fullscreen mode from sitting above the WordPress header on mobile.</span>
                </div>
              </div>

              <div class="ttb-update-item latest-fix">
                <span class="ttb-update-dot" aria-hidden="true"></span>
                <div>
                  <strong>Leaflet map bug fixed</strong>
                  <span class="ttb-update-meta">Fixed 8 May 2026</span>
                  <span>Stopped theme/page CSS from pushing Leaflet controls, tiles and popups out of position.</span>
                </div>
              </div>

              <div class="ttb-update-item">
                <span class="ttb-update-dot" aria-hidden="true"></span>
                <div>
                  <strong>Map-first route building</strong>
                  <span>Improved the live map workflow so useful places can be added directly into the journey.</span>
                </div>
              </div>

              <div class="ttb-update-item">
                <span class="ttb-update-dot" aria-hidden="true"></span>
                <div>
                  <strong>Multi-stop journeys</strong>
                  <span>Added clearer support for numbered stops, waypoints and proper family road-trip planning.</span>
                </div>
              </div>

              <div class="ttb-update-item">
                <span class="ttb-update-dot" aria-hidden="true"></span>
                <div>
                  <strong>EV route support</strong>
                  <span>Added EV-aware planning with charger discovery and connector-focused filtering where data allows.</span>
                </div>
              </div>

              <div class="ttb-update-item">
                <span class="ttb-update-dot" aria-hidden="true"></span>
                <div>
                  <strong>Family stop filters</strong>
                  <span>Expanded practical filters for toilets, parks, food, cafes, beaches, shops and natural places.</span>
                </div>
              </div>

              <div class="ttb-update-item">
                <span class="ttb-update-dot" aria-hidden="true"></span>
                <div>
                  <strong>Navigation handoff</strong>
                  <span>Routes and stops can be opened in Google Maps, Apple Maps or Waze when it is time to drive.</span>
                </div>
              </div>

              <div class="ttb-update-item">
                <span class="ttb-update-dot" aria-hidden="true"></span>
                <div>
                  <strong>Shareable route plans</strong>
                  <span>Added route sharing and copy-link support so another traveller can load the same plan.</span>
                </div>
              </div>
            </div>
          </aside>
        </div>
      </div>

      <div class="ttb-map-holder">
        <div class="ttb-map-inner">
          <div class="ttb-map-inline" style="width:100%;"><!DOCTYPE html>
<html lang="en">
<head><base href="https://tantrummingtrailblazers.com/wp-content/plugins/make%20drive%20fun2//">
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width,initial-scale=1" />
  <title>Fun Route Planner – Tantrumming Trailblazers</title>

  <link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet" />
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/leaflet@1.9.4/dist/leaflet.css" />
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/leaflet.markercluster@1.5.3/dist/MarkerCluster.css" />
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/leaflet.markercluster@1.5.3/dist/MarkerCluster.Default.css" />
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet" />
  <link rel="stylesheet" href="https://tantrummingtrailblazers.com/wp-content/plugins/make%20drive%20fun2//styles.css?v=1781272871" />
</head>
<body><script>window.TTB_USER = {"loggedIn":false,"ajaxUrl":"https:\/\/tantrummingtrailblazers.com\/wp-admin\/admin-ajax.php","nonce":"d6235912bb"};</script>

<div id="app-wrapper">
<div id="app" v-cloak>

  <!-- Toast Notifications -->
  <div style="position:fixed;top:20px;right:20px;z-index:99999;display:flex;flex-direction:column;gap:10px;pointer-events:none;max-width:380px;">
    <transition-group name="list">
      <div v-for="t in toasts" :key="t.id"
        style="pointer-events:auto;padding:14px 20px;border-radius:14px;font-size:14px;font-weight:600;display:flex;align-items:center;gap:10px;box-shadow:0 8px 32px rgba(0,0,0,.1);backdrop-filter:blur(12px);cursor:pointer;animation:slideIn .3s ease;"
        :style="{
          background: t.type==='error' ? 'rgba(220,38,38,.92)' : t.type==='warning' ? 'rgba(217,119,6,.92)' : 'rgba(16,185,129,.92)',
          color: '#fff',
          border: '1px solid ' + (t.type==='error' ? 'rgba(248,113,113,.3)' : t.type==='warning' ? 'rgba(251,191,36,.3)' : 'rgba(52,211,153,.3)')
        }"
        @click="removeToast(t.id)">
        <span>{{ t.type==='error' ? '✗' : t.type==='warning' ? '<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" />' : '✓' }}</span>
        <span>{{ t.message }}</span>
      </div>
    </transition-group>
  </div>

  <div class="app-shell" :class="{'is-full': isAppFull}">
    <div class="container mx-auto max-w-7xl">

      <main class="flex gap-6 h-screen md:flex-row flex-col">

        <aside class="left-menu" :class="{'bottom-sheet-collapsed': isMobileSheetCollapsed}">
          <div class="bottom-sheet-handle" @click="toggleMobileSheet">
            <div class="bottom-sheet-handle-bar"></div>
            <div class="bottom-sheet-label">{{ isMobileSheetCollapsed ? '▲ Tap to plan your route' : '▼ Tap to minimise' }}</div>
          </div>

          <div class="bottom-sheet-content">
            <div class="top-menu-strip">
              <button
                class="menu-icon-btn"
                :class="{'menu-icon-btn-active': activeTab==='plan'}"
                @click="selectTab('plan')"
                title="Plan route"
                aria-label="Plan route">
                <span class="menu-emoji"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9ed.png" alt="🧭" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span>
                <span class="tab-label">Plan</span>
              </button>

              <button
                class="menu-icon-btn relative"
                :class="{'menu-icon-btn-active': activeTab==='stops'}"
                @click="selectTab('stops')"
                title="Results list"
                aria-label="Places found">
                <span class="menu-emoji"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cb.png" alt="📋" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span>
                <span class="tab-label">Places</span>
                <span v-if="stopsCount" class="menu-pill-badge">{{ stopsCount }}</span>
              </button>

              <button
                class="menu-icon-btn"
                :class="{'menu-icon-btn-active': activeTab==='saved'}"
                @click="selectTab('saved')"
                title="Your saved routes"
                aria-label="Saved routes">
                <span class="menu-emoji"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4c1.png" alt="📁" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span>
                <span class="tab-label">Saved</span>
                <span v-if="savedRoutesCount + favouritesList.length" class="menu-pill-badge">{{ savedRoutesCount + favouritesList.length }}</span>
              </button>

              <div class="relative menu-right-group" style="margin-left:auto; display:flex; gap:6px; align-items:center;">
                <a
                  href="https://buymeacoffee.com/makemydrivefun"
                  target="_blank"
                  rel="noopener noreferrer"
                  class="menu-icon-btn"
                  title="I built this on my own because I love making road trips better. If it helped you, a coffee keeps it free and improving!"
                  aria-label="Buy me a coffee"
                  style="text-decoration:none; color:inherit; background:linear-gradient(135deg,rgba(251,191,36,.15),rgba(245,158,11,.08)); border:1px solid rgba(245,158,11,.25);">
                  <span class="menu-emoji"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2615.png" alt="☕" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span>
                  <span class="tab-label" style="color:#92400e; display:flex; flex-direction:column; align-items:center; gap:0; line-height:1;">
                    Coffee
                    <span style="font-size:7px; color:#b45309; font-weight:400; white-space:nowrap;">Help keep it free</span>
                  </span>
                </a>
                <button
                  class="menu-icon-btn"
                  @click="showSaveDropdown = !showSaveDropdown"
                  :disabled="!TTB_USER || !TTB_USER.loggedIn"
                  title="Save this route"
                  aria-label="Save route">
                  <span class="menu-emoji"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4be.png" alt="💾" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span>
                  <span class="tab-label">Save</span>
                </button>
                <div v-if="showSaveDropdown" class="save-dropdown">
                  <div style="padding:12px 14px;display:flex;flex-direction:column;gap:8px;">
                    <input
                      type="text"
                      v-model="routeCustomName"
                      class="custom-input w-full border border-[#e2e8f0] rounded-lg px-3 py-2 text-sm bg-[#f1f5f9]"
                      placeholder="Route name (optional)"
                      @keydown.enter="saveRouteToWP(); showSaveDropdown = false">
                    <button
                      @click="saveRouteToWP(); showSaveDropdown = false"
                      style="width:100%;padding:8px 0;border-radius:10px;background:linear-gradient(135deg,#10b981,#059669);color:#fff;font-weight:700;font-size:13px;border:none;cursor:pointer;">
                      Save Route
                    </button>
                  </div>
                </div>

                <div class="relative">
                  <button
                    class="menu-icon-btn"
                    @click.stop="showShareMenu = !showShareMenu"
                    title="Share route"
                    aria-label="Share route">
                    <span class="menu-emoji"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4e4.png" alt="📤" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span>
                    <span class="tab-label">Share</span>
                  </button>
                  <div
                    v-if="showShareMenu"
                    class="save-dropdown" style="right:0; min-width:200px;">
                    <a @click.prevent="copyShareLink" style="display:block;padding:12px 16px;color:#1e293b;text-decoration:none;font-size:13px;font-weight:500;border-bottom:1px solid rgba(30,41,59,.3);cursor:pointer;" onmouseover="this.style.background='rgba(59,130,246,.12)'" onmouseout="this.style.background='transparent'"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cb.png" alt="📋" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Copy link</a>
                    <a @click.prevent="shareToWhatsApp" style="display:block;padding:12px 16px;color:#1e293b;text-decoration:none;font-size:13px;font-weight:500;border-bottom:1px solid rgba(30,41,59,.3);cursor:pointer;" onmouseover="this.style.background='rgba(34,197,94,.12)'" onmouseout="this.style.background='transparent'"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f7e2.png" alt="🟢" class="wp-smiley" style="height: 1em; max-height: 1em;" /> WhatsApp</a>
                    <a @click.prevent="shareToTwitter" style="display:block;padding:12px 16px;color:#1e293b;text-decoration:none;font-size:13px;font-weight:500;border-bottom:1px solid rgba(30,41,59,.3);cursor:pointer;" onmouseover="this.style.background='rgba(59,130,246,.12)'" onmouseout="this.style.background='transparent'"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f426.png" alt="🐦" class="wp-smiley" style="height: 1em; max-height: 1em;" /> X / Twitter</a>
                    <a @click.prevent="shareToFacebook" style="display:block;padding:12px 16px;color:#1e293b;text-decoration:none;font-size:13px;font-weight:500;border-bottom:1px solid rgba(30,41,59,.3);cursor:pointer;" onmouseover="this.style.background='rgba(59,130,246,.12)'" onmouseout="this.style.background='transparent'"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4d8.png" alt="📘" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Facebook</a>
                    <a @click.prevent="emailShareLink" style="display:block;padding:12px 16px;color:#1e293b;text-decoration:none;font-size:13px;font-weight:500;border-bottom:1px solid rgba(30,41,59,.3);cursor:pointer;" onmouseover="this.style.background='rgba(148,163,184,.12)'" onmouseout="this.style.background='transparent'"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2709.png" alt="✉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Email</a>
                    <a @click.prevent="downloadGPX" style="display:block;padding:12px 16px;color:#1e293b;text-decoration:none;font-size:13px;font-weight:500;border-bottom:1px solid rgba(30,41,59,.3);cursor:pointer;" onmouseover="this.style.background='rgba(16,185,129,.12)'" onmouseout="this.style.background='transparent'"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b07.png" alt="⬇" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Export GPX (sat-nav)</a>
                    <a @click.prevent="downloadKML" style="display:block;padding:12px 16px;color:#1e293b;text-decoration:none;font-size:13px;font-weight:500;border-bottom:1px solid rgba(30,41,59,.3);cursor:pointer;" onmouseover="this.style.background='rgba(16,185,129,.12)'" onmouseout="this.style.background='transparent'"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b07.png" alt="⬇" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Export KML (Google Earth)</a>
                    <a @click.prevent="shareNative" style="display:block;padding:12px 16px;color:#1e293b;text-decoration:none;font-size:13px;font-weight:500;cursor:pointer;" onmouseover="this.style.background='rgba(167,139,250,.12)'" onmouseout="this.style.background='transparent'"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4e4.png" alt="📤" class="wp-smiley" style="height: 1em; max-height: 1em;" /> More options</a>
                  </div>
                </div>
              </div>
            </div>

            <div v-if="!TTB_USER || !TTB_USER.loggedIn" class="login-hint" style="font-size:11px;color:#64748b;text-align:center;margin-top:-4px;">
              Log in to save routes.
            </div>

            <!-- EV filters (shown when EV toggled on via map chip) -->
            <div v-if="evMode" class="ev-inline-filters" style="display:flex; flex-wrap:wrap; gap:6px; margin-bottom:12px;">
              <button type="button" class="chip" :class="{'chip-active': evFilters.dcFastOnly}" @click="setEvFastOnly(!evFilters.dcFastOnly)" style="font-size:11px; padding:5px 10px; min-height:32px;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a1.png" alt="⚡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> DC Fast</button>
              <button type="button" class="chip" :class="{'chip-active': evFilters.acOnly}" @click="setEvAcOnly(!evFilters.acOnly)" style="font-size:11px; padding:5px 10px; min-height:32px;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f50c.png" alt="🔌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> AC Only</button>
              <button type="button" class="chip" :class="{'chip-active': evFilters.connectors.has('type2')}" @click="setEvConnectorFilter('type2', !evFilters.connectors.has('type2'))" style="font-size:11px; padding:5px 10px; min-height:32px;">Type 2</button>
              <button type="button" class="chip" :class="{'chip-active': evFilters.connectors.has('type2_combo')}" @click="setEvConnectorFilter('type2_combo', !evFilters.connectors.has('type2_combo'))" style="font-size:11px; padding:5px 10px; min-height:32px;">CCS2</button>
              <button type="button" class="chip" :class="{'chip-active': evFilters.connectors.has('chademo')}" @click="setEvConnectorFilter('chademo', !evFilters.connectors.has('chademo'))" style="font-size:11px; padding:5px 10px; min-height:32px;">CHAdeMO</button>
              <button type="button" class="chip" :class="{'chip-active': evFilters.connectors.has('tesla_supercharger')}" @click="setEvConnectorFilter('tesla_supercharger', !evFilters.connectors.has('tesla_supercharger'))" style="font-size:11px; padding:5px 10px; min-height:32px;">Tesla</button>
            </div>

            <!-- Route Summary — always visible when route exists -->
            <div v-if="hasRoute" class="route-summary-card" style="margin-bottom:12px;">
              <div class="route-summary-header">
                <h3 class="route-summary-title">Route Summary</h3>
                <div class="route-legs-toggle" :class="{'expanded': routeLegsExpanded}">
                  <button @click="routeLegsExpanded = !routeLegsExpanded">
                    {{ routeLegsExpanded ? 'Hide legs' : 'Show legs' }}
                    <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
                      <polyline points="6 9 12 15 18 9"></polyline>
                    </svg>
                  </button>
                </div>
              </div>
              <div class="route-summary-stats">
                <div class="route-stat-badge">
                  <span>Route</span>
                  <strong>{{ routeSummaryText }}</strong>
                </div>
                <div class="route-stat-badge">
                  <span>Legs</span>
                  <strong>{{ routeLegs.length }}</strong>
                </div>
                <div class="route-stat-badge">
                  <span>Places</span>
                  <strong>{{ stopsCount }}</strong>
                </div>
                <div v-if="funScore" class="route-stat-badge fun-score-badge" :title="funScore.detail + ' — ' + funScore.label">
                  <span>Fun score</span>
                  <strong>{{ funScore.emoji }} {{ funScore.score }}<small style="font-weight:600;opacity:.65;">/100</small></strong>
                </div>
              </div>

              <!-- Elevation (collapsed one-liner; tap to expand chart) -->
              <div v-if="elevLoading" class="text-xs text-gray-400" style="padding:4px 2px;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26f0.png" alt="⛰" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Checking elevation…</div>
              <div v-else-if="elevError" class="text-xs text-gray-400" style="padding:4px 2px;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26f0.png" alt="⛰" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Elevation unavailable right now — the route still works fine.</div>
              <div v-else-if="!elevProfile" class="text-xs text-gray-300" style="padding:4px 2px;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26f0.png" alt="⛰" class="wp-smiley" style="height: 1em; max-height: 1em;" /></div>
              <div v-else-if="elevProfile" style="margin-top:6px;">
                <button class="elev-toggle" @click="showElev = !showElev" :aria-expanded="showElev ? 'true' : 'false'" aria-label="Toggle elevation chart">
                  <span><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26f0.png" alt="⛰" class="wp-smiley" style="height: 1em; max-height: 1em;" /> ▲ {{ elevProfile.gainM }} m &nbsp;▼ {{ elevProfile.lossM }} m</span>
                  <span class="loop-caret">{{ showElev ? '▴' : '▾' }}</span>
                </button>
                <div v-if="showElev" style="margin-top:6px;">
                  <svg viewBox="0 0 320 84" preserveAspectRatio="none" role="img" aria-label="Route elevation profile" style="width:100%;height:84px;display:block;border-radius:8px;background:rgba(59,130,246,.05);">
                    <path :d="elevProfile.svgArea" fill="rgba(37,99,235,.16)"></path>
                    <path :d="elevProfile.svgPath" fill="none" stroke="#2563eb" stroke-width="1.5" vector-effect="non-scaling-stroke"></path>
                  </svg>
                  <div class="text-[11px] text-gray-500" style="display:flex;justify-content:space-between;margin-top:2px;">
                    <span>▲ {{ elevProfile.gainM }} m climb</span>
                    <span>{{ elevProfile.min }}–{{ elevProfile.max }} m range</span>
                    <span>▼ {{ elevProfile.lossM }} m descent</span>
                  </div>
                </div>
              </div>

              <!-- GO + Itinerary buttons -->
              <div style="display:flex; gap:8px; margin-top:10px;">
                <button @click="openRouteInGoogleMaps" class="go-btn" aria-label="Open full route in Google Maps" title="Open the whole route, with all stops, in Google Maps">
                  <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> GO
                </button>
                <button @click="openItinerary" class="itinerary-open-btn" style="margin-top:0;" aria-label="Open trip itinerary"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f5d3.png" alt="🗓" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Trip itinerary</button>
              </div>
              <div class="route-legs-list" :class="{'expanded': routeLegsExpanded}">
                <div v-for="(leg, idx) in routeLegs" :key="'leg-'+idx" class="route-leg-item">
                  <div class="route-leg-labels">
                    <div class="route-leg-label">
                      <strong>{{ leg.fromLabel }}</strong>
                      →
                      <strong>{{ leg.toLabel }}</strong>
                    </div>
                  </div>
                  <div class="route-leg-stats">
                    <div class="route-leg-stat">{{ leg.distanceKm.toFixed(1) }} km</div>
                    <div class="route-leg-stat">{{ Math.round(leg.durationMin) }} min</div>
                  </div>
                </div>
              </div>

            </div>


            <!-- Fun loop & explore (compact, collapsible) -->
            <div v-if="positionStartCoords.length === 2" class="loop-gen-card loop-gen-compact" style="margin-bottom:12px;">
              <button class="loop-toggle-row" @click="showLoopPanel = !showLoopPanel" :aria-expanded="showLoopPanel ? 'true' : 'false'" aria-label="Toggle fun loop and explore options">
                <span><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f504.png" alt="🔄" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Fun loop{{ positionEndCoords.length !== 2 ? ' &amp; explore' : '' }}</span>
                <span class="loop-caret">{{ showLoopPanel ? '▴' : '▾' }}</span>
              </button>
              <div v-if="showLoopPanel" class="loop-gen-body">
                <div class="loop-gen-row">
                  <select v-model.number="loopDurationMin" class="loop-gen-select" aria-label="Loop duration">
                    <option :value="30">~30 min</option>
                    <option :value="60">~1 hour</option>
                    <option :value="120">~2 hours</option>
                    <option :value="180">~3 hours</option>
                  </select>
                  <button class="loop-gen-btn" @click="generateFunLoop" :disabled="loopGenerating" aria-label="Generate fun loop">
                    {{ loopGenerating ? '<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f50d.png" alt="🔍" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Scouting…' : 'Generate loop' }}
                  </button>
                </div>
                <div v-if="positionEndCoords.length !== 2" class="loop-gen-row" style="margin-top:8px;">
                  <button class="explore-area-btn" style="margin-left:0; width:100%;" @click="exploreAroundStart" aria-label="Explore places around your start point">
                    <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f50d.png" alt="🔍" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Show places within {{ searchRadius }} mi of start (no route needed)
                  </button>
                </div>
              </div>
            </div>

            <!-- Quick Filters — always visible when POIs found -->
            <div v-if="showChips && availableSubtypes.length" class="quick-filter-strip" style="margin-bottom:10px;">
              <div style="display:flex; justify-content:space-between; align-items:center; margin-bottom:6px;">
                <span style="font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:1.2px; color:#34d399;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f50d.png" alt="🔍" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Filter places</span>
                <button v-if="activeSubtypes.length" style="font-size:10px; font-weight:700; color:#f87171; background:none; border:none; cursor:pointer;" @click="clearSubtypeFilters">Clear all</button>
              </div>
              <div style="display:flex; flex-wrap:wrap; gap:5px;">
                <button
                  v-for="sub in availableSubtypes"
                  :key="'chip-'+sub"
                  class="chip"
                  :class="{'chip-active': activeSubtypes.includes(sub)}"
                  @click="toggleSubtypeChip(sub)">
                  {{ sub }}
                </button>
              </div>
            </div>

            <div v-show="activeTab==='plan'" class="flex flex-col gap-5 overflow-y-auto pr-1" style="max-height: calc(100vh - 12rem);">

              <div class="section-card route-builder-card">
                <div class="section-heading">
                  <h3>Route builder</h3>
                  <span class="text-[11px] text-gray-500 font-semibold uppercase tracking-widest">Start to finish</span>
                </div>

                <div class="relative">
                  <div class="bg-[#f1f5f9]/40 p-4 rounded-2xl border border-[#e2e8f0] shadow-inner">
                    <div class="timeline-container space-y-4">
                      <div class="timeline-line"></div>

                      <div class="relative z-10">
                        <span class="input-icon text-emerald-500">⦿</span>
                        <div class="flex gap-2 items-center">
                          <input id="start"
                                 v-model="positionStart"
                                 @input="autocomplete('start')"
                                 @focus="showAutocompleteStart = true"
                                 @blur="hideAutocomplete('start')"
                                 placeholder="Where are you starting?"
                                 autocomplete="off"
                                 aria-label="Start location"
                                 class="custom-input flex-1 p-3 pl-12 rounded-xl text-sm" />
                          <div v-if="autocompleteLoadingStart" class="input-loading-spinner" style="right:80px;"></div>
                          <!-- Lock/unlock start -->
                          <button
                            @click="toggleStartLock"
                            class="p-1.5 rounded-lg transition flex-shrink-0"
                            :class="startLocked ? 'text-gray-400 hover:text-amber-500 hover:bg-amber-50' : 'text-amber-500 bg-amber-50 border border-amber-200'"
                            :title="startLocked ? 'Locked — click to unlock start' : 'Unlocked — click to lock start'"
                            style="min-height:32px;min-width:32px;">
                            <svg v-if="startLocked" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect><path d="M7 11V7a5 5 0 0 1 10 0v4"></path></svg>
                            <svg v-else width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect><path d="M7 11V7a5 5 0 0 1 9.9-1"></path></svg>
                          </button>
                          <!-- Move start down (when unlocked and stops exist) -->
                          <button
                            v-if="!startLocked && stops.length > 0"
                            @click="demoteStart"
                            class="p-0.5 rounded hover:bg-blue-50 text-amber-500 hover:text-blue-500 transition"
                            title="Move start later"
                            style="min-height:24px;min-width:24px;">
                            <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><polyline points="6 9 12 15 18 9"></polyline></svg>
                          </button>
                          <button
                            @click="useMyLocation"
                            class="text-gray-500 hover:text-blue-400 transition p-1.5 flex-shrink-0"
                            title="Use GPS"
                            aria-label="Use my GPS location"
                            style="min-height:32px;min-width:32px;">
                            <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
                              <polygon points="3 11 22 2 13 21 11 13 3 11"></polygon>
                            </svg>
                          </button>
                        </div>
                        <ul v-if="showAutocompleteStart && autocompleteResultsStart?.length" class="autocomplete-dropdown">
                          <li
                            v-for="(result, index) in autocompleteResultsStart"
                            :key="'s'+index"
                            class="autocomplete-item"
                            @mousedown.prevent="selectAutocomplete('start', result)">
                            {{ result.display_name }}
                          </li>
                        </ul>
                      </div>

                      <transition-group name="list" tag="div" class="space-y-3">
                        <div v-for="(s,i) in stops" :key="'stop-'+i" class="relative z-10">
                          <span class="input-icon text-gray-400 text-xs font-bold border-gray-700">{{ i + 1 }}</span>
                          <div class="flex gap-2">
                            <div
                              class="flex items-center text-gray-400 hover:text-gray-700 cursor-grab px-1"
                              title="Drag to reorder"
                              draggable="true"
                              @dragstart="dragStartStop(i)"
                              @dragover.prevent="dragOverStop(i)"
                              @drop.prevent="dropStop(i)">
                              <svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor">
                                <circle cx="9" cy="12" r="1"/>
                                <circle cx="9" cy="5" r="1"/>
                                <circle cx="9" cy="19" r="1"/>
                                <circle cx="15" cy="12" r="1"/>
                                <circle cx="15" cy="5" r="1"/>
                                <circle cx="15" cy="19" r="1"/>
                              </svg>
                            </div>
                            <input
                              :id="'stop-'+i"
                              v-model="s.text"
                              @input="autocompleteStop(i)"
                              @focus="$set(showAutocompleteStops, i, true)"
                              @blur="hideAutocompleteStop(i)"
                              placeholder="Add a stop..."
                              autocomplete="off"
                              class="custom-input flex-1 p-2.5 pl-3 rounded-xl text-sm" />
                            <!-- Reorder buttons -->
                            <div class="flex flex-col gap-0.5" v-if="stops.length > 1">
                              <button
                                @click.stop="moveStopUp(i)"
                                :disabled="i === 0"
                                class="p-0.5 rounded hover:bg-blue-50 transition"
                                :class="i === 0 ? 'text-gray-300 cursor-not-allowed' : 'text-gray-400 hover:text-blue-500'"
                                title="Move earlier"
                                style="min-height:20px;min-width:20px;">
                                <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><polyline points="18 15 12 9 6 15"></polyline></svg>
                              </button>
                              <button
                                @click.stop="moveStopDown(i)"
                                :disabled="i >= stops.length - 1"
                                class="p-0.5 rounded hover:bg-blue-50 transition"
                                :class="i >= stops.length - 1 ? 'text-gray-300 cursor-not-allowed' : 'text-gray-400 hover:text-blue-500'"
                                title="Move later"
                                style="min-height:20px;min-width:20px;">
                                <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><polyline points="6 9 12 15 18 9"></polyline></svg>
                              </button>
                            </div>
                            <button
                              @click.stop="removeStop(i)"
                              class="text-gray-500 hover:text-red-400 p-2 rounded-lg hover:bg-gray-100 transition"
                              title="Remove stop">
                              <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
                                <line x1="18" y1="6" x2="6" y2="18"></line>
                                <line x1="6" y1="6" x2="18" y2="18"></line>
                              </svg>
                            </button>
                          </div>
                          <ul v-if="showAutocompleteStops[i] && autocompleteResultsStops[i]?.length" class="autocomplete-dropdown">
                            <li
                              v-for="(result, idx) in autocompleteResultsStops[i]"
                              :key="'rs-'+i+'-'+idx"
                              class="autocomplete-item"
                              @mousedown.prevent="selectAutocompleteStop(i, result)">
                              {{ result.display_name }}
                            </li>
                          </ul>
                        </div>
                      </transition-group>

                      <div class="relative z-10">
                        <span class="input-icon text-rose-500"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cd.png" alt="📍" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span>
                        <div class="flex gap-2 items-center">
                          <!-- Move end up (when unlocked and stops exist) -->
                          <button
                            v-if="!endLocked && stops.length > 0"
                            @click="promoteEnd"
                            class="p-0.5 rounded hover:bg-blue-50 text-amber-500 hover:text-blue-500 transition flex-shrink-0"
                            title="Move end earlier"
                            style="min-height:24px;min-width:24px;">
                            <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><polyline points="18 15 12 9 6 15"></polyline></svg>
                          </button>
                          <!-- Lock/unlock end -->
                          <button
                            @click="toggleEndLock"
                            class="p-1.5 rounded-lg transition flex-shrink-0"
                            :class="endLocked ? 'text-gray-400 hover:text-amber-500 hover:bg-amber-50' : 'text-amber-500 bg-amber-50 border border-amber-200'"
                            :title="endLocked ? 'Locked — click to unlock end' : 'Unlocked — click to lock end'"
                            style="min-height:32px;min-width:32px;">
                            <svg v-if="endLocked" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect><path d="M7 11V7a5 5 0 0 1 10 0v4"></path></svg>
                            <svg v-else width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect><path d="M7 11V7a5 5 0 0 1 9.9-1"></path></svg>
                          </button>
                          <input id="end"
                                 v-model="positionEnd"
                                 @input="autocomplete('end')"
                                 @focus="showAutocompleteEnd = true"
                                 @blur="hideAutocomplete('end')"
                                 placeholder="Final destination"
                                 autocomplete="off"
                                 aria-label="End location"
                                 class="custom-input flex-1 p-3 pl-3 rounded-xl text-sm" />
                          <div v-if="autocompleteLoadingEnd" class="input-loading-spinner"></div>
                        </div>
                        <ul v-if="showAutocompleteEnd && autocompleteResultsEnd?.length" class="autocomplete-dropdown">
                          <li
                            v-for="(result, index) in autocompleteResultsEnd"
                            :key="'e'+index"
                            class="autocomplete-item"
                            @mousedown.prevent="selectAutocomplete('end', result)">
                            {{ result.display_name }}
                          </li>
                        </ul>
                      </div>
                    </div>

                    <div class="flex justify-between items-center mt-4 pt-3 border-t border-[#e2e8f0]">
                      <div class="flex items-center gap-2">
                        <button
                          @click="addStop"
                          class="text-xs font-semibold text-blue-400 hover:text-blue-300 flex items-center gap-1 py-1 px-2 rounded hover:bg-blue-900/20 transition">
                          <span class="text-lg leading-none">+</span> Add stop
                        </button>
                        <button
                          v-if="stops.length >= 2"
                          @click="smartOrderStops"
                          :disabled="smartOrdering"
                          class="text-xs font-semibold flex items-center gap-1 py-1.5 px-3 rounded-lg transition border"
                          :class="smartOrdering ? 'text-gray-400 bg-gray-50 border-gray-200 cursor-wait' : 'text-emerald-600 bg-emerald-50 border-emerald-200 hover:bg-emerald-100 hover:border-emerald-300'"
                          title="Rearrange stops into a better route">
                          <span v-if="smartOrdering" style="animation:spin .6s linear infinite;display:inline-block;">&#8635;</span>
                          <span v-else>&#10024;</span>
                          Smart Order
                        </button>
                      </div>

                      <div class="flex gap-1 bg-[#f8fafc] p-1 rounded-lg border border-[#e2e8f0]">
                        <button
                          @click="swapStartEnd"
                          class="text-gray-400 hover:text-blue-600 p-1.5 rounded hover:bg-blue-50"
                          title="Swap start and end">
                          <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
                            <line x1="12" y1="5" x2="12" y2="19"></line>
                            <polyline points="19 12 12 19 5 12"></polyline>
                          </svg>
                        </button>
                        <div class="w-px bg-gray-200"></div>
                        <button
                          @click="reverseRoute"
                          class="text-gray-400 hover:text-blue-600 p-1.5 rounded hover:bg-blue-50"
                          title="Reverse entire route">
                          <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
                            <polyline points="23 4 23 10 17 10"></polyline>
                            <polyline points="1 20 1 14 7 14"></polyline>
                            <path d="M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15"></path>
                          </svg>
                        </button>
                        <div class="w-px bg-gray-200"></div>
                        <button
                          @click="useMyLocation"
                          class="text-gray-400 hover:text-blue-600 p-1.5 rounded hover:bg-blue-50"
                          title="Use GPS">
                          <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
                            <polygon points="3 11 22 2 13 21 11 13 3 11"></polygon>
                          </svg>
                        </button>
                      </div>
                    </div>
                  </div>
                </div>
              </div>

              <!-- Navigate route in external apps -->
              <div v-if="hasRoute" style="display:flex; gap:6px; flex-wrap:wrap; align-items:center; margin-bottom:4px;">
                <span style="font-size:9px; font-weight:700; text-transform:uppercase; letter-spacing:1.2px; color:rgba(71,85,105,.6);"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f5fa.png" alt="🗺" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Open in</span>
                <button
                  @click="openRouteInGoogle"
                  style="display:inline-flex;align-items:center;gap:5px;padding:7px 12px;border-radius:10px;font-size:11px;font-weight:700;border:1px solid rgba(66,133,244,.25);background:rgba(66,133,244,.1);color:#2563eb;cursor:pointer;white-space:nowrap;transition:all .15s;"
                  onmouseover="this.style.background='rgba(66,133,244,.2)'"
                  onmouseout="this.style.background='rgba(66,133,244,.1)'"
                  title="Open full route with all stops in Google Maps">
                  <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cd.png" alt="📍" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Google Maps
                </button>
                <button
                  v-if="canUseWaze()"
                  @click="openRouteInWaze"
                  style="display:inline-flex;align-items:center;gap:5px;padding:7px 12px;border-radius:10px;font-size:11px;font-weight:700;border:1px solid rgba(51,208,255,.25);background:rgba(51,208,255,.08);color:#0891b2;cursor:pointer;white-space:nowrap;transition:all .15s;"
                  onmouseover="this.style.background='rgba(51,208,255,.18)'"
                  onmouseout="this.style.background='rgba(51,208,255,.08)'"
                  title="Open in Waze (single stop only)">
                  <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f5fa.png" alt="🗺" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Waze
                </button>
                <a
                  :href="'http://maps.apple.com/?saddr=' + (positionStartCoords.length===2 ? positionStartCoords[1]+','+positionStartCoords[0] : '') + '&daddr=' + (positionEndCoords.length===2 ? positionEndCoords[1]+','+positionEndCoords[0] : '')"
                  target="_blank"
                  rel="noopener noreferrer"
                  style="display:inline-flex;align-items:center;gap:5px;padding:7px 12px;border-radius:10px;font-size:11px;font-weight:700;border:1px solid rgba(52,199,89,.25);background:rgba(52,199,89,.08);color:#059669;cursor:pointer;white-space:nowrap;text-decoration:none;transition:all .15s;"
                  onmouseover="this.style.background='rgba(52,199,89,.18)'"
                  onmouseout="this.style.background='rgba(52,199,89,.08)'"
                  title="Open in Apple Maps">
                  <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f34f.png" alt="🍏" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Apple Maps
                </a>
              </div>

              <!-- Corridor width + Find Stops -->
              <div class="flex items-center gap-3">
                <div class="flex-1 flex flex-col items-center bg-[#f8fafc] rounded-2xl border border-[#e2e8f0] p-2 shadow-sm h-full justify-center">
                  <span class="text-[10px] text-gray-500 uppercase tracking-widest font-bold mb-1">Corridor width</span>
                  <div class="flex items-center w-full">
                    <button
                      class="w-9 h-8 flex items-center justify-center text-gray-400 hover:bg-blue-50 hover:text-blue-600 rounded-lg transition"
                      @click="bumpRadius(-0.1)"
                      :disabled="searchRadius<=0.1"
                      title="Reduce corridor">
                      <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
                        <line x1="5" y1="12" x2="19" y2="12"></line>
                      </svg>
                    </button>
                    <div class="flex-1 text-center">
                      <div class="text-sm font-bold text-blue-400">{{ searchRadius.toFixed(1) }}</div>
                      <div class="text-[10px] font-medium text-gray-500">Miles</div>
                    </div>
                    <button
                      class="w-9 h-8 flex items-center justify-center text-gray-400 hover:bg-blue-50 hover:text-blue-600 rounded-lg transition"
                      @click="bumpRadius(0.1)"
                      :disabled="searchRadius>=5.0"
                      title="Increase corridor">
                      <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
                        <line x1="12" y1="5" x2="12" y2="19"></line>
                        <line x1="5" y1="12" x2="19" y2="12"></line>
                      </svg>
                    </button>
                  </div>
                </div>

                <button
                  @click="findStopsFromGo"
                  class="btn-glow-intense text-white px-7 py-3 rounded-xl font-extrabold shadow-lg flex items-center justify-center gap-2 transition-transform active:scale-95 z-20"
                  title="Build route and find places">
                  <div v-if="loading" class="spinner"></div>
                  <span v-else class="tracking-wide text-sm uppercase">Find Stops</span>
                </button>

              </div>

              <div v-if="loading" class="text-center text-xs text-gray-500 py-1" style="animation:pulse 1.5s infinite;">
                Searching for places along your route...
              </div>

              <div v-if="errorMessage" class="p-3 bg-red-900/20 border border-red-800/50 rounded-2xl text-red-200 text-xs flex items-center gap-2">
                <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> {{ errorMessage }}
                <button @click="errorMessage=''" class="ml-auto text-red-400 hover:text-red-200 text-[11px]">✕</button>
              </div>

              <div v-if="hasRoute || positionStart || positionEnd || stops.length" class="flex justify-end items-center gap-2">
                <div v-if="showClearConfirm" class="flex items-center gap-2 bg-red-50 border border-red-200 rounded-xl px-3 py-1.5" style="animation:fadeInUp .2s ease;">
                  <span class="text-[11px] text-red-500 font-semibold">Clear this route?</span>
                  <button @click="clearRoute" class="text-[11px] font-bold text-white bg-red-500 hover:bg-red-600 px-3 py-1 rounded-lg transition" style="min-height:28px;">Clear</button>
                  <button @click="cancelClearRoute" class="text-[11px] font-bold text-gray-500 bg-white border border-gray-200 hover:bg-gray-50 px-3 py-1 rounded-lg transition" style="min-height:28px;">Cancel</button>
                </div>
                <button v-else @click="confirmClearRoute" class="text-[11px] text-gray-500 hover:text-red-400 transition flex items-center gap-1">
                  <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg>
                  Clear route
                </button>
              </div>

              <div class="section-card">
                <div class="section-heading">
                  <h3>Categories</h3>
                  <div class="flex gap-2">
                    <button @click="selectAllCategories" class="text-[10px] text-blue-400 hover:text-blue-300 font-bold uppercase tracking-wider transition">All</button>
                    <span class="text-gray-400">|</span>
                    <button @click="deselectAllCategories" class="text-[10px] text-gray-500 hover:text-gray-700 font-bold uppercase tracking-wider transition">None</button>
                  </div>
                </div>

                <div class="bundle-grid">
                  <label class="bundle-card group">
                    <input type="checkbox" v-model="categories.foodDrink" class="absolute opacity-0 w-0 h-0">
                    <svg class="check-mark w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path></svg>
                    <div class="bundle-card-content">
                      <div class="bundle-emoji"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f37d.png" alt="🍽" class="wp-smiley" style="height: 1em; max-height: 1em;" /></div>
                      <div class="bundle-title">Food & Drink</div>
                      <div class="bundle-description">Restaurants, cafes, pubs, ice cream, wine bars</div>
                    </div>
                  </label>

                  <label class="bundle-card group">
                    <input type="checkbox" v-model="categories.essentials" class="absolute opacity-0 w-0 h-0">
                    <svg class="check-mark w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path></svg>
                    <div class="bundle-card-content">
                      <div class="bundle-emoji"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26fd.png" alt="⛽" class="wp-smiley" style="height: 1em; max-height: 1em;" /></div>
                      <div class="bundle-title">Essentials</div>
                      <div class="bundle-description">Fuel, toilets, motorway services, baby change, chemists</div>
                    </div>
                  </label>

                  <label class="bundle-card group">
                    <input type="checkbox" v-model="categories.exploreNature" class="absolute opacity-0 w-0 h-0">
                    <svg class="check-mark w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path></svg>
                    <div class="bundle-card-content">
                      <div class="bundle-emoji"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3de.png" alt="🏞" class="wp-smiley" style="height: 1em; max-height: 1em;" /></div>
                      <div class="bundle-title">Nature & Views</div>
                      <div class="bundle-description">Parks, lakes, rivers, beaches, viewpoints, picnic areas</div>
                    </div>
                  </label>

                  <label class="bundle-card group">
                    <input type="checkbox" v-model="categories.cultureFun" class="absolute opacity-0 w-0 h-0">
                    <svg class="check-mark w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path></svg>
                    <div class="bundle-card-content">
                      <div class="bundle-emoji"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3f0.png" alt="🏰" class="wp-smiley" style="height: 1em; max-height: 1em;" /></div>
                      <div class="bundle-title">Fun & Culture</div>
                      <div class="bundle-description">Zoos, theme parks, soft play, aquariums, arcades, museums</div>
                    </div>
                  </label>

                  <label class="bundle-card group">
                    <input type="checkbox" v-model="categories.oddities" class="absolute opacity-0 w-0 h-0">
                    <svg class="check-mark w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path></svg>
                    <div class="bundle-card-content">
                      <div class="bundle-emoji"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f5ff.png" alt="🗿" class="wp-smiley" style="height: 1em; max-height: 1em;" /></div>
                      <div class="bundle-title">Oddities</div>
                      <div class="bundle-description">Weird statues, roadside art, big things, quirky discoveries</div>
                    </div>
                  </label>

                  <label class="bundle-card group">
                    <input type="checkbox" v-model="categories.stay" class="absolute opacity-0 w-0 h-0">
                    <svg class="check-mark w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path></svg>
                    <div class="bundle-card-content">
                      <div class="bundle-emoji"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f6cc.png" alt="🛌" class="wp-smiley" style="height: 1em; max-height: 1em;" /></div>
                      <div class="bundle-title">Stay Overnight</div>
                      <div class="bundle-description">Hotels, motels, B&amp;Bs, holiday parks, campsites</div>
                    </div>
                  </label>

                  <label class="bundle-card group">
                    <input type="checkbox" v-model="categories.transport" class="absolute opacity-0 w-0 h-0">
                    <svg class="check-mark w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path></svg>
                    <div class="bundle-card-content">
                      <div class="bundle-emoji"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f689.png" alt="🚉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></div>
                      <div class="bundle-title">Transport</div>
                      <div class="bundle-description">Park and ride, car parks, train stations, tram stops</div>
                    </div>
                  </label>

                  <label class="bundle-card group">
                    <input type="checkbox" v-model="categories.services" class="absolute opacity-0 w-0 h-0">
                    <svg class="check-mark w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path></svg>
                    <div class="bundle-card-content">
                      <div class="bundle-emoji"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f6cd.png" alt="🛍" class="wp-smiley" style="height: 1em; max-height: 1em;" /></div>
                      <div class="bundle-title">Shops & Services</div>
                      <div class="bundle-description">Supermarkets, shops, hospitals, pharmacies, churches</div>
                    </div>
                  </label>
                </div>
              </div>

              <!-- Route Mode / Trip Style -->
              <div class="section-card" style="background:linear-gradient(135deg,rgba(241,245,249,.94),rgba(248,250,252,.9));">
                <div class="section-heading">
                  <h3>Trip Style</h3>
                  <span class="text-[11px] text-gray-500 font-semibold uppercase tracking-widest">What kind of drive?</span>
                </div>
                <div style="display:grid; grid-template-columns:repeat(3,1fr); gap:8px;">
                  <button
                    v-for="mode in ['family','scenic','practical','ev','quickbreak','fun']"
                    :key="'mode-'+mode"
                    @click="applyRouteMode(mode)"
                    class="flex flex-col items-center gap-1 p-3 rounded-xl border transition-all text-center"
                    :class="routeMode === mode
                      ? 'bg-blue-50 border-blue-300 shadow-md text-blue-700'
                      : 'bg-white border-gray-200 hover:border-blue-200 hover:bg-blue-50/50 text-gray-600'"
                    style="min-height:64px;">
                    <span style="font-size:22px;">{{ routeModeIcon(mode) }}</span>
                    <span class="text-[11px] font-bold uppercase tracking-wide">{{ routeModeLabel(mode) }}</span>
                  </button>
                </div>
              </div>

              <!-- Smart Suggestions -->
              <div v-if="smartSuggestions.length && showSmartSuggestions && hasRoute" class="section-card" style="background:linear-gradient(135deg,rgba(52,211,153,.06),rgba(16,185,129,.04));border-color:rgba(52,211,153,.25);">
                <div class="section-heading">
                  <h3 style="font-size:14px;">Suggestions for this drive</h3>
                  <button @click="showSmartSuggestions = false" class="text-[10px] text-gray-400 hover:text-gray-600" style="min-height:24px;">Dismiss</button>
                </div>
                <div class="space-y-2">
                  <div
                    v-for="(sg, si) in smartSuggestions"
                    :key="'sg-'+si"
                    class="flex items-center gap-3 p-3 rounded-xl bg-white border border-gray-100 hover:border-emerald-200 hover:shadow-sm cursor-pointer transition-all"
                    @click="applySuggestion(sg)">
                    <span style="font-size:20px;">{{ sg.icon }}</span>
                    <span class="flex-1 text-sm text-gray-700">{{ sg.text }}</span>
                    <span class="text-[10px] font-bold text-emerald-600 bg-emerald-50 border border-emerald-200 px-2.5 py-1 rounded-lg whitespace-nowrap" style="min-height:auto;">{{ sg.label }}</span>
                  </div>
                </div>
              </div>

              <!-- Save Route Prompt -->
              <div v-if="showSavePrompt && hasRoute && !savePromptDismissed" class="section-card" style="background:linear-gradient(135deg,rgba(59,130,246,.06),rgba(167,139,250,.04));border-color:rgba(96,165,250,.25);">
                <div class="flex items-start gap-3">
                  <span style="font-size:24px;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4be.png" alt="💾" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span>
                  <div class="flex-1">
                    <div class="font-bold text-sm text-gray-800 mb-1">Save this trip for later?</div>
                    <div class="text-xs text-gray-500 mb-3">Keep this journey to come back to whenever you want.</div>
                    <div class="flex gap-2 flex-wrap">
                      <input
                        type="text"
                        v-model="routeCustomName"
                        class="custom-input text-sm rounded-lg px-3 py-1.5 flex-1 border border-gray-200"
                        placeholder="Trip name (optional)"
                        style="min-height:36px; min-width:120px;"
                        @keydown.enter="saveRouteToWP(); showSavePrompt = false;">
                      <button
                        @click="saveRouteToWP(); showSavePrompt = false"
                        class="text-xs font-bold text-white px-4 py-1.5 rounded-lg transition"
                        style="background:linear-gradient(135deg,#10b981,#059669); min-height:36px;">
                        Save Route
                      </button>
                      <button
                        @click="showSavePrompt = false; savePromptDismissed = true"
                        class="text-xs text-gray-400 hover:text-gray-600 px-2 transition"
                        style="min-height:36px;">
                        Not now
                      </button>
                    </div>
                  </div>
                </div>
              </div>


            </div>

            <div v-show="activeTab==='stops'" class="flex flex-col gap-3 h-full overflow-hidden">
              <div class="section-heading shrink-0">
                <h3>Places Along Your Route</h3>
                <div class="flex items-center gap-2">
                  <button v-if="sortedPois.length" @click="copyPoiList" class="text-[10px] text-gray-500 hover:text-blue-400 font-bold uppercase tracking-wider transition" title="Copy list to clipboard"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cb.png" alt="📋" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Copy</button>
                  <select v-model="poiSort" class="text-xs bg-[#f8fafc] border border-[#e2e8f0] rounded-xl p-2 text-gray-700 outline-none focus:border-blue-500">
                    <option value="distance">Sort by distance</option>
                    <option value="name">Sort by name</option>
                    <option value="category">Sort by category</option>
                  </select>
                </div>
              </div>

              <div v-if="poiSearching" class="poi-searching-bar" style="overflow:hidden;"></div>
              <div class="text-xs text-gray-500 -mt-2 mb-1">
                <span v-if="poiSearching" style="color:#60a5fa;">Searching for places...</span>
                <span v-else>Found {{ stopsCount }} place<span v-if="stopsCount !== 1">s</span>.</span>
              </div>

              <div class="flex-1 overflow-y-auto space-y-2 pr-1">
                <div v-if="sortedPois.length === 0" class="empty-state">
                  <svg class="empty-state-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1">
                    <circle cx="12" cy="12" r="10"></circle>
                    <path d="M16 16s-1.5-2-4-2-4 2-4 2"></path>
                    <line x1="9" y1="9" x2="9.01" y2="9"></line>
                    <line x1="15" y1="9" x2="15.01" y2="9"></line>
                  </svg>
                  <div class="empty-state-title">No places yet</div>
                  <div class="empty-state-message">Build a route to see interesting stops along the way.</div>
                </div>

                <div
                  v-for="(p,i) in sortedPois"
                  :key="i"
                  class="result-card poi-card-pad hover:border-blue-500 cursor-pointer group"
                  @click="panToPoi(p); centerCard($event)">
                  <div style="display:flex; gap:10px; align-items:flex-start;">
                    <div class="poi-icon-wrap">
                      {{ p.icon || '<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cd.png" alt="📍" class="wp-smiley" style="height: 1em; max-height: 1em;" />' }}
                    </div>
                    <div style="flex:1; min-width:0;">
                      <div class="poi-name truncate group-hover:text-blue-400 transition">{{ p.name }}</div>
                      <div style="display:flex; gap:8px; flex-wrap:wrap; align-items:center; margin-bottom:4px;">
                        <span class="poi-cat-badge">{{ p.category }}</span>
                        <span v-if="p.distance != null" style="font-size:11px; font-weight:700; color:#34d399;">{{ p.distance.toFixed(1) }} km from route</span>
                      </div>
                      <div v-if="p.addr" style="font-size:12px; color:#64748b; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; margin-bottom:6px;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cd.png" alt="📍" class="wp-smiley" style="height: 1em; max-height: 1em;" /> {{ p.addr }}</div>
                      <div style="display:flex; gap:6px; flex-wrap:wrap;" @click.stop>
                        <button @click="addPoiAsStop(p)" class="poi-action-btn poi-action-route" title="Add as stop on route" aria-label="Add as stop on route">
                          <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg>
                          Route
                        </button>
                        <button @click="toggleFavourite(p)" class="poi-action-btn" :class="{'poi-action-fav-active': isFavourited(p)}" :title="isFavourited(p) ? 'Remove favourite' : 'Save favourite'" :aria-label="isFavourited(p) ? 'Remove favourite' : 'Save favourite'" :aria-pressed="isFavourited(p) ? 'true' : 'false'">
                          {{ isFavourited(p) ? '<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" />' : '☆' }} Fav
                        </button>
                        <button @click="loadNearbyForCard(p, i)" class="poi-action-btn" :disabled="p._nearbyLoading" title="Show nearby places" aria-label="Show nearby places">
                          {{ p._nearbyLoading ? '<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/23f3.png" alt="⏳" class="wp-smiley" style="height: 1em; max-height: 1em;" />' : '<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cd.png" alt="📍" class="wp-smiley" style="height: 1em; max-height: 1em;" />' }} Nearby
                        </button>
                      </div>
                      <!-- Nearby places inline -->
                      <div v-if="p._nearby && p._nearby.length" style="margin-top:8px; padding:8px; border-radius:10px; border:1px solid rgba(148,163,184,.1); background:rgba(255,255,255,.5);">
                        <div style="font-size:9px; font-weight:700; text-transform:uppercase; letter-spacing:1px; color:rgba(148,163,184,.5); margin-bottom:4px;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cd.png" alt="📍" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Nearby</div>
                        <div v-for="nb in p._nearby" :key="nb.name" style="display:flex; align-items:center; gap:6px; padding:4px 2px; font-size:12px; cursor:pointer; border-radius:6px;" class="hover:bg-blue-50" @click.stop="panToNearby(nb)">
                          <span>{{ nb.icon }}</span>
                          <span style="flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;">{{ nb.name }}<span v-if="nb.type" style="color:#64748b; font-size:10px; font-weight:500;"> · {{ nb.type }}</span></span>
                          <span v-if="nb.dist" style="color:#059669; font-weight:600; font-size:11px;">{{ nb.dist }}m</span>
                        </div>
                      </div>
                    </div>
                  </div>
                </div>
              </div>
            </div>

            <div v-show="activeTab==='saved'" class="flex flex-col gap-4 h-full overflow-hidden">
              <div class="section-heading">
                <h3>Saved Routes</h3>
                <span class="text-[11px] text-gray-500 font-semibold uppercase tracking-widest">{{ savedRoutesCount }} total</span>
              </div>

              <div class="flex-1 overflow-y-auto space-y-3 pr-1">
                <div v-if="savedRoutesCount === 0" class="empty-state">
                  <div style="font-size: 48px; opacity: 0.6;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /></div>
                  <div class="empty-state-title">No saved routes</div>
                  <div class="empty-state-message">Create and save your routes to access them later.</div>
                </div>

                <div
                  v-for="(r,i) in savedRoutes"
                  :key="'route'+i"
                  class="saved-card p-3 flex justify-between items-start cursor-pointer group"
                  @click="loadSavedRoute(i)">
                  <div class="flex items-start gap-3 overflow-hidden flex-1">
                    <svg v-if="routePreviewPath(r)" viewBox="0 0 56 36" class="route-preview-svg" aria-hidden="true">
                      <path :d="routePreviewPath(r)" fill="none" stroke="#2563eb" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
                    </svg>
                    <span v-else class="text-lg pt-0.5"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f6e3.png" alt="🛣" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span>
                    <div class="overflow-hidden flex-1">
                      <input v-if="renameIndex === i" v-model="renameText" class="rename-input" @click.stop
                        @keyup.enter="commitRename(i)" @keyup.esc="renameIndex = -1" @blur="commitRename(i)" aria-label="Route name" />
                      <div v-else class="font-medium text-sm truncate text-gray-800">{{ r.name || 'Untitled Route' }}</div>
                      <div class="text-xs text-gray-500 truncate">{{ r.start && r.start.label ? r.start.label.split(',')[0] : '' }} <span class="text-gray-400" v-if="r.end && r.end.label">→</span> {{ r.end && r.end.label ? r.end.label.split(',')[0] : '' }}</div>
                      <div v-if="r.summary && r.summary.distance_km" class="text-[11px] text-gray-400 mt-0.5 truncate"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cf.png" alt="📏" class="wp-smiley" style="height: 1em; max-height: 1em;" /> {{ Number(r.summary.distance_km).toFixed(1) }} km<span v-if="r.summary.duration_min"> · <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/23f1.png" alt="⏱" class="wp-smiley" style="height: 1em; max-height: 1em;" /> {{ Math.round(r.summary.duration_min) }} min</span><span v-if="r.stops && r.stops.length"> · {{ r.stops.length }} stop{{ r.stops.length > 1 ? 's' : '' }}</span></div>
                    </div>
                  </div>
                  <div class="flex items-center flex-shrink-0">
                    <button @click.stop="startRename(i)" class="text-gray-400 hover:text-blue-500 p-1 transition" title="Rename route" aria-label="Rename route"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/270f.png" alt="✏" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
                    <button @click.stop="duplicateSavedRoute(i)" class="text-gray-400 hover:text-blue-500 p-1 transition" title="Duplicate route" aria-label="Duplicate route"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cb.png" alt="📋" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
                    <button @click.stop="confirmDeleteIndex = (confirmDeleteIndex === i ? -1 : i)" class="text-gray-500 hover:text-red-400 p-1 transition" title="Delete route" aria-label="Delete route"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f5d1.png" alt="🗑" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
                  </div>
                  <div v-if="confirmDeleteIndex === i" class="delete-confirm-wrap">
                    <span>Delete?</span>
                    <button @click.stop="deleteSavedRoute(i); confirmDeleteIndex = -1" style="background:#dc2626;color:#fff;">Yes</button>
                    <button @click.stop="confirmDeleteIndex = -1" style="background:rgba(241,245,249,.9);color:#475569;border:1px solid rgba(30,41,59,.15);">No</button>
                  </div>
                </div>
              </div>

              <div class="section-card">
                <div class="section-heading">
                  <h4>Saved places</h4>
                  <span class="text-[11px] text-gray-500 font-semibold uppercase tracking-widest">{{ favouritesList.length }} total</span>
                </div>

                <div v-if="favouritesList.length === 0" class="text-sm text-gray-500 italic p-2">No saved places yet.</div>

                <div class="space-y-2">
                  <div
                    v-for="(p,i) in favouritesList"
                    :key="'fav'+i"
                    class="saved-card p-3 flex justify-between items-center cursor-pointer"
                    @click="panToPoi(p)">
                    <div class="flex items-center gap-2 overflow-hidden">
                      <span class="text-lg">{{ p.icon || '<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cd.png" alt="📍" class="wp-smiley" style="height: 1em; max-height: 1em;" />' }}</span>
                      <div class="font-medium text-sm truncate text-gray-800">{{ p.name }}</div>
                    </div>
                    <button @click.stop="toggleFavourite(p)" class="text-gray-500 hover:text-red-400 p-1 transition" title="Remove saved place" aria-label="Remove saved place"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f5d1.png" alt="🗑" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
                  </div>
                </div>
              </div>

            </div>

          </div>
        </aside>

        <section class="flex-1 relative z-0">
          <div id="map" style="position:relative;">
            <div class="map-overlay-instruction" :class="{'hidden': hasRoute}">
              <div class="map-overlay-text">Enter a start and end point to begin</div>
            </div>
            <!-- Map overlay buttons -->
            <div class="map-toolbar-row">
              <button
                class="map-tool-btn"
                :class="{'map-tool-btn-active': addByClickEnabled}"
                @click="toggleAddByClick"
                :title="addByClickEnabled ? 'Click mode ON — tap map to add stop' : 'Tap to add stops by clicking map'"
                :aria-label="addByClickEnabled ? 'Disable click to add' : 'Enable click to add'">
                <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">
                  <path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"></path>
                  <circle cx="12" cy="10" r="3"></circle>
                </svg>
                <span class="map-tool-label">{{ addByClickEnabled ? 'Adding...' : 'Add stop' }}</span>
              </button>
              <button
                class="map-tool-btn"
                @click="toggleAppFull"
                :title="isAppFull ? 'Exit fullscreen' : 'Fullscreen'"
                :aria-label="isAppFull ? 'Exit fullscreen' : 'Enter fullscreen'">
                <svg v-if="!isAppFull" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">
                  <polyline points="15 3 21 3 21 9"></polyline>
                  <polyline points="9 21 3 21 3 15"></polyline>
                  <line x1="21" y1="3" x2="14" y2="10"></line>
                  <line x1="3" y1="21" x2="10" y2="14"></line>
                </svg>
                <svg v-else width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">
                  <polyline points="4 14 10 14 10 20"></polyline>
                  <polyline points="20 10 14 10 14 4"></polyline>
                  <line x1="14" y1="10" x2="21" y2="3"></line>
                  <line x1="3" y1="21" x2="10" y2="14"></line>
                </svg>
                <span class="map-tool-label">{{ isAppFull ? 'Minimise' : 'Fullscreen' }}</span>
              </button>
              <div class="basemap-menu-wrap" style="position:relative;">
                <button
                  class="map-tool-btn"
                  @click.stop="showBasemapMenu = !showBasemapMenu"
                  title="Change map style"
                  aria-label="Change map style"
                  :aria-expanded="showBasemapMenu ? 'true' : 'false'">
                  <span style="font-size:14px;line-height:1;">{{ basemapDefs()[mapStyle].emoji }}</span>
                  <span class="map-tool-label">{{ basemapDefs()[mapStyle].label }}</span>
                </button>
                <div v-if="showBasemapMenu" class="basemap-menu">
                  <button v-for="(def, key) in basemapDefs()" :key="'bm'+key"
                    class="basemap-option" :class="{'basemap-option-active': mapStyle === key}"
                    @click="setMapStyle(key)">
                    <span style="font-size:15px;">{{ def.emoji }}</span> {{ def.label }}
                    <span v-if="mapStyle === key" style="margin-left:auto;color:#2563eb;">✓</span>
                  </button>
                </div>
              </div>
            </div>

            <!-- Map hint banner -->
            <transition name="hint-fade">
              <div v-if="mapHint" class="map-hint-banner" @click="dismissMapHint">
                {{ mapHint }}
                <span style="margin-left:8px; opacity:.6; font-size:11px;">✕</span>
              </div>
            </transition>

            <!-- Map overlay stats strip — pinned to bottom of map -->
            <div class="map-stats-strip" v-if="hasRoute">
              <div class="map-stat-chip">
                <span><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f6e3.png" alt="🛣" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span>
                <strong>{{ routeDistanceKm ? routeDistanceKm.toFixed(0) + ' km' : '—' }}</strong>
              </div>
              <div class="map-stat-chip">
                <span><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/23f1.png" alt="⏱" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span>
                <strong>{{ routeDurationMin ? Math.round(routeDurationMin) + ' min' : '—' }}</strong>
              </div>
              <div class="map-stat-chip">
                <span><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f50d.png" alt="🔍" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span>
                <strong>{{ searchRadius.toFixed(1) }} mi corridor</strong>
              </div>
              <div class="map-stat-chip">
                <span><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cd.png" alt="📍" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span>
                <strong>{{ pois.length }} places</strong>
              </div>
              <div class="map-stat-chip" style="cursor:pointer;" @click.stop="evMode = !evMode; getRoute()" :style="evMode ? 'background:rgba(250,204,21,.15);border-color:rgba(250,204,21,.4);color:#fbbf24;' : ''">
                <span><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a1.png" alt="⚡" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span>
                <strong>{{ evMode ? 'EV On' : 'EV Off' }}</strong>
              </div>
            </div>
          </div>
        </section>

      </main>
    </div>
  
<!-- Trip Itinerary Modal -->
<div v-if="showItinerary" class="itinerary-backdrop" @click.self="showItinerary = false">
  <div class="itinerary-modal" role="dialog" aria-label="Trip itinerary">
    <div class="itinerary-head">
      <h3><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f5d3.png" alt="🗓" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Trip Itinerary</h3>
      <button class="itinerary-close" @click="showItinerary = false" aria-label="Close itinerary">✕</button>
    </div>
    <div class="itinerary-controls no-print">
      <label>Depart <input type="time" v-model="itineraryDepart"></label>
      <label>Stop time <select v-model.number="itineraryDwellMin">
        <option :value="0">none</option><option :value="10">10 min</option><option :value="20">20 min</option>
        <option :value="30">30 min</option><option :value="45">45 min</option><option :value="60">1 hour</option>
      </select></label>
      <button class="itinerary-print-btn" @click="printItinerary"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f5a8.png" alt="🖨" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Print / PDF</button>
    </div>
    <div class="itinerary-summary" v-if="routeDistanceKm">
      {{ routeDistanceKm.toFixed(0) }} km · {{ Math.floor((routeDurationMin||0)/60) }}h {{ Math.round((routeDurationMin||0)%60) }}m driving<span v-if="funScore"> · {{ funScore.emoji }} {{ funScore.label }}</span>
    </div>
    <div v-if="weatherLoading" class="itinerary-summary no-print" style="opacity:.7;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f326.png" alt="🌦" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Fetching weather for your stops…</div>
    <div class="itinerary-rows">
      <div v-for="(row, ri) in itineraryRowsWithWeather" :key="'itin'+ri" class="itinerary-row" :class="{'itinerary-row-pause': !row.label}">
        <div class="itinerary-time">{{ row.time }}</div>
        <div class="itinerary-icon">{{ row.icon }}</div>
        <div class="itinerary-detail">
          <div class="itinerary-label" v-if="row.label">{{ row.label }}</div>
          <div class="itinerary-note">{{ row.note }}</div>
        </div>
        <div v-if="row.weather" class="itinerary-weather" :title="'Forecast at arrival'">
          {{ row.weather.icon }} {{ row.weather.temp }}°<span v-if="row.weather.rain != null && row.weather.rain >= 20" class="itinerary-rain"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a7.png" alt="💧" class="wp-smiley" style="height: 1em; max-height: 1em;" />{{ row.weather.rain }}%</span>
        </div>
      </div>
    </div>
  </div>
</div>

<!-- Onboarding tour -->
<div v-if="tourStep >= 0" class="tour-backdrop" @click="tourEnd"></div>
<div v-if="tourStep >= 0" class="tour-tooltip" :style="{ top: tourPos.top + 'px', left: tourPos.left + 'px' }" role="dialog" aria-label="Welcome tour">
  <div class="tour-title">{{ tourSteps()[tourStep].title }}</div>
  <div class="tour-text">{{ tourSteps()[tourStep].text }}</div>
  <div class="tour-actions">
    <span class="tour-dots"><span v-for="(st, si) in tourSteps()" :key="'dot'+si" :class="{'tour-dot-active': si === tourStep}" class="tour-dot"></span></span>
    <button class="tour-skip" @click="tourEnd">Skip</button>
    <button class="tour-next" @click="tourNext">{{ tourStep >= tourSteps().length - 1 ? 'Done' : 'Next' }}</button>
  </div>
</div>
</div>

</div>
</div>

<!-- Toast Container -->
<div id="toast-container"></div>

<script defer src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.min.js"></script>
<script defer src="https://cdn.jsdelivr.net/npm/@turf/turf@6.5.0/turf.min.js"></script>
<script defer src="https://cdn.jsdelivr.net/npm/leaflet@1.9.4/dist/leaflet.js"></script>
<script defer src="https://cdn.jsdelivr.net/npm/leaflet.markercluster@1.5.3/dist/leaflet.markercluster.js"></script>
<script defer src="https://unpkg.com/opening_hours@3.6.0/opening_hours.js"></script>

<script defer src="https://tantrummingtrailblazers.com/wp-content/plugins/make%20drive%20fun2//app1_with_share1w33222aaa.js?v=1781272871"></script>
</body>
</html></div>
        </div>
      </div>
    </section>

    <section class="ttb-wide-panel">
      <div>
        <h2>Why use it?</h2>
        <p>
          Because most route planners are obsessed with speed. Families are obsessed with survival, snacks, toilets,
          places to stretch legs, and not missing the interesting stuff.
        </p>
      </div>

      <ul class="ttb-checklist">
        <li><span class="ttb-check">✓</span><span>Find stops along your actual route, not random places miles away from where you are driving.</span></li>
        <li><span class="ttb-check">✓</span><span>Search for food, toilets, parks, beaches, historic sites, EV chargers and practical stops.</span></li>
        <li><span class="ttb-check">✓</span><span>Add places as proper route stops, save favourites, check nearby options and share your plan.</span></li>
        <li><span class="ttb-check">✓</span><span>Use it worldwide wherever OpenStreetMap has useful coverage.</span></li>
        <li><span class="ttb-check">✓</span><span>Turn long drives into something closer to an adventure and less like a rolling snack tribunal.</span></li>
      </ul>
    </section>

    <section class="ttb-section-head">
      <p class="ttb-section-kicker">Features at a glance</p>

      <h2>
        Built for real drives.
        <span class="ttb-script-dark">Not imaginary perfect ones.</span>
      </h2>

      <p class="ttb-lede">
        Whether you are planning a holiday route, weekend drive, EV road trip, scenic detour or emergency toilet-stop
        hunt, the tool gives you practical options without making you dig through six different apps.
      </p>
    </section>

    <div class="ttb-card-grid">
      <article class="ttb-info-card">
        <div class="ttb-icon"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3f0.png" alt="🏰" class="wp-smiley" style="height: 1em; max-height: 1em;" /></div>
        <h3>Historic sites</h3>
        <p>Find castles, ruins, landmarks, memorials and places with real story value along your journey.</p>
      </article>

      <article class="ttb-info-card">
        <div class="ttb-icon"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f37d.png" alt="🍽" class="wp-smiley" style="height: 1em; max-height: 1em;" /></div>
        <h3>Food and drink</h3>
        <p>Discover cafes, restaurants, pubs, bakeries and food stops when everyone suddenly becomes starving.</p>
      </article>

      <article class="ttb-info-card">
        <div class="ttb-icon"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f332.png" alt="🌲" class="wp-smiley" style="height: 1em; max-height: 1em;" /></div>
        <h3>Nature breaks</h3>
        <p>Find parks, lakes, beaches, campsites and outdoor places for leg-stretching and sanity recovery.</p>
      </article>

      <article class="ttb-info-card">
        <div class="ttb-icon"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26fd.png" alt="⛽" class="wp-smiley" style="height: 1em; max-height: 1em;" /></div>
        <h3>Convenience stops</h3>
        <p>Locate useful things like petrol stations, shops, toilets and practical places to stop en route.</p>
      </article>

      <article class="ttb-info-card">
        <div class="ttb-icon"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a1.png" alt="⚡" class="wp-smiley" style="height: 1em; max-height: 1em;" /></div>
        <h3>EV chargers</h3>
        <p>Search for EV charging along the route, with support for common connector and charger types.</p>
      </article>

      <article class="ttb-info-card">
        <div class="ttb-icon"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f30d.png" alt="🌍" class="wp-smiley" style="height: 1em; max-height: 1em;" /></div>
        <h3>Global coverage</h3>
        <p>Powered by open mapping data, so it works across many countries. Coverage varies by area, but popular routes and cities are usually richer.</p>
      </article>
    </div>

    <section class="ttb-search-box" aria-labelledby="ttb-search-title">
      <button class="ttb-search-toggle" type="button" aria-expanded="false" aria-controls="ttb-search-content">
        <span id="ttb-search-title">What are people searching for?</span>
        <strong aria-hidden="true">▼</strong>
      </button>

      <div id="ttb-search-content" class="ttb-search-content">
        <table class="ttb-search-table">
          <thead>
            <tr>
              <th>Search variant</th>
              <th>Quick answer</th>
            </tr>
          </thead>

          <tbody>
            <tr>
              <td><span class="ttb-term">make my drive easy tool</span></td>
              <td>Our free route planner for finding stops, toilets and fun along your journey.</td>
            </tr>

            <tr>
              <td><span class="ttb-term">makemydrivefun</span></td>
              <td>Same tool, all one word. You found the right place.</td>
            </tr>

            <tr>
              <td><span class="ttb-term">make my drive fun australia</span></td>
              <td>Yes, it can work in Australia where mapping data is available.</td>
            </tr>

            <tr>
              <td><span class="ttb-term">make my drive fun europe</span></td>
              <td>Yes, it supports European route planning and useful stop discovery.</td>
            </tr>

            <tr>
              <td><span class="ttb-term">make my drive fun alternative</span></td>
              <td>A route planner focused on useful stops, family travel and map-first planning.</td>
            </tr>

            <tr>
              <td><span class="ttb-term">make me drive fun</span></td>
              <td>A common typo, but yes, this is the fun drive planner you are probably after.</td>
            </tr>
          </tbody>
        </table>
      </div>
    </section>

    <section class="ttb-section-head">
      <p class="ttb-section-kicker">Quick questions</p>

      <h2>
        Make My Drive Fun FAQ.
        <span class="ttb-script-dark">The no-faff version.</span>
      </h2>
    </section>

    <div class="ttb-faq">
      <details>
        <summary>Does it find toilets and EV chargers along my route?</summary>
        <p>Yes. The tool is designed to show useful stops along or near your route, including toilets, EV chargers, food, parks and other practical places. Results depend on available map data.</p>
      </details>

      <details>
        <summary>Can I add stops by clicking?</summary>
        <p>Yes. You can add places from the map and build a multi-stop route rather than just viewing random pins.</p>
      </details>

      <details>
        <summary>Which EV connectors are supported?</summary>
        <p>The tool supports common EV connector filtering, including Type 2, CCS, CHAdeMO and Tesla-style options where the underlying data is available.</p>
      </details>

      <details>
        <summary>How does “along route” work?</summary>
        <p>The tool follows the route corridor rather than just searching around a single town. That means results are more useful for the journey you are actually driving.</p>
      </details>

      <details>
        <summary>Does it open in Google Maps, Apple Maps or Waze?</summary>
        <p>Yes. The idea is to plan in Make My Drive Fun, then hand off to your preferred navigation app when you are ready to drive.</p>
      </details>

      <details>
        <summary>Do I need an account?</summary>
        <p>You can use and share routes without needing an account. Some save features may use your WordPress login so saved routes can stay private to you.</p>
      </details>

      <details>
        <summary>Where does the data come from?</summary>
        <p>The tool uses open mapping and place data, including OpenStreetMap-based sources, plus routing and place information where available. If something is missing locally, the map data may need improving.</p>
      </details>

      <details>
        <summary>Which countries are supported?</summary>
        <p>It can work globally where open map data is available. Coverage varies by country and area, with cities and popular routes usually having richer data than very remote places.</p>
      </details>

      <details>
        <summary>What is the Fun Score?</summary>
        <p>Every route gets a score out of 100 based on how twisty and hilly it is — curves and climbs score higher than long motorway slogs. You will also see an elevation chart of the climbs and descents along the way.</p>
      </details>

      <details>
        <summary>Can it plan a loop drive with no destination?</summary>
        <p>Yes. Set a start point, pick roughly how long you want to drive (30 minutes to 3 hours), and the loop generator will scout several circular routes, score them for fun, and build the best one automatically.</p>
      </details>

      <details>
        <summary>Can I export my route to a sat-nav?</summary>
        <p>Yes. The Share menu includes GPX export (works with Garmin and most sat-nav and ride apps) and KML export (opens in Google Earth).</p>
      </details>

      <details>
        <summary>Does it work offline?</summary>
        <p>Partly. You can install it to your phone home screen like an app, and the tool plus recently viewed map areas stay available in patchy signal. Searching for new places and calculating new routes still needs a connection.</p>
      </details>
    </div>

    <section class="ttb-share-panel" aria-labelledby="ttb-share-title">
      <h2 id="ttb-share-title">Family. Chaos. Better drives.</h2>

      <p>
        If Make My Drive Fun helped you find a better stop, avoid a travel-day meltdown, or turn a boring road into a
        proper mini adventure, share it with another family who needs it.
      </p>

      <div class="ttb-share-row">
        <button class="ttb-button ttb-button-primary" type="button" data-share="native">Share</button>

        <a class="ttb-button ttb-button-secondary" href="https://wa.me/?text=https%3A%2F%2Ftantrummingtrailblazers.com%2Ftools%2Fmake-my-drive-fun%2F" target="_blank" rel="noopener">
          WhatsApp
        </a>

        <a class="ttb-button ttb-button-secondary" href="https://twitter.com/intent/tweet?url=https%3A%2F%2Ftantrummingtrailblazers.com%2Ftools%2Fmake-my-drive-fun%2F&amp;text=Make%20My%20Drive%20Fun%20-%20a%20free%20family%20road%20trip%20planner" target="_blank" rel="noopener">
          X
        </a>

        <button class="ttb-button ttb-button-secondary" type="button" data-copy-link="">Copy link</button>
      </div>

      <p class="ttb-small-print">
        Built for real drives, real families, snack diplomacy and the eternal hunt for a clean toilet before it is too late.
      </p>
    </section>

    <div class="ttb-toast" role="status" aria-live="polite">Link copied</div>
  </div>

  <script>
    (function () {
      const root = document.getElementById("ttb-mmdf-page");
      if (!root) return;

      let lastPortalState = null;
      let originalParent = null;
      let originalNextSibling = null;
      let portalPlaceholder = null;

      function isMobilePatchWidth() {
        return window.matchMedia("(max-width: 900px)").matches;
      }

      function getWrapper() {
        return (
          document.querySelector("body > #app-wrapper.ttb-app-is-full") ||
          root.querySelector("#app-wrapper") ||
          document.getElementById("app-wrapper")
        );
      }

      function getShell() {
        const wrapper = getWrapper();
        return wrapper ? wrapper.querySelector(".app-shell") : null;
      }

      function isFull() {
        const shell = getShell();
        return !!(shell && shell.classList.contains("is-full"));
      }

      function nudgeMap() {
        window.dispatchEvent(new Event("resize"));

        setTimeout(function () {
          window.dispatchEvent(new Event("resize"));
        }, 120);
      }

      function moveAppToBody(wrapper) {
        if (!wrapper || wrapper.classList.contains("ttb-portaled-to-body")) return;

        originalParent = wrapper.parentNode;
        originalNextSibling = wrapper.nextSibling;

        portalPlaceholder = document.createElement("div");
        portalPlaceholder.id = "ttb-mmdf-portal-placeholder";
        portalPlaceholder.style.display = "none";

        if (originalParent) {
          originalParent.insertBefore(portalPlaceholder, wrapper);
        }

        wrapper.classList.add("ttb-portaled-to-body");
        document.body.appendChild(wrapper);
      }

      function moveAppBack(wrapper) {
        if (!wrapper || !wrapper.classList.contains("ttb-portaled-to-body")) return;

        wrapper.classList.remove("ttb-portaled-to-body");

        if (originalParent && originalParent.isConnected) {
          if (originalNextSibling && originalNextSibling.parentNode === originalParent) {
            originalParent.insertBefore(wrapper, originalNextSibling);
          } else {
            originalParent.appendChild(wrapper);
          }
        } else if (portalPlaceholder && portalPlaceholder.parentNode) {
          portalPlaceholder.parentNode.insertBefore(wrapper, portalPlaceholder);
        }

        if (portalPlaceholder && portalPlaceholder.parentNode) {
          portalPlaceholder.parentNode.removeChild(portalPlaceholder);
        }

        originalParent = null;
        originalNextSibling = null;
        portalPlaceholder = null;
      }

      function syncFullState() {
        const wrapper = getWrapper();
        if (!wrapper) return;

        const shouldPortal = isFull() && isMobilePatchWidth();

        if (shouldPortal === lastPortalState) return;
        lastPortalState = shouldPortal;

        document.body.classList.toggle("ttb-mmdf-fullscreen", shouldPortal);
        wrapper.classList.toggle("ttb-app-is-full", shouldPortal);

        if (shouldPortal) {
          moveAppToBody(wrapper);
        } else {
          moveAppBack(wrapper);
          wrapper.classList.remove("ttb-app-is-full");
          document.body.classList.remove("ttb-mmdf-fullscreen");
        }

        nudgeMap();
      }

      const toggle = root.querySelector(".ttb-search-toggle");
      const content = root.querySelector("#ttb-search-content");

      if (toggle && content) {
        toggle.addEventListener("click", function () {
          const open = content.classList.toggle("open");
          toggle.setAttribute("aria-expanded", String(open));
          setTimeout(nudgeMap, 100);
        });
      }

      root.querySelectorAll("[data-ttb-scroll]").forEach(function (link) {
        link.addEventListener("click", function (event) {
          const targetId = link.getAttribute("data-ttb-scroll");
          const target = document.getElementById(targetId);
          if (!target) return;

          event.preventDefault();

          const adminBar = document.getElementById("wpadminbar");
          const adminOffset = adminBar ? adminBar.offsetHeight : 0;
          const top = target.getBoundingClientRect().top + window.pageYOffset - adminOffset - 18;

          window.scrollTo({
            top: Math.max(top, 0),
            behavior: "smooth"
          });

          history.replaceState(null, "", "#" + targetId);
          setTimeout(nudgeMap, 250);
        });
      });

      const toast = root.querySelector(".ttb-toast");
      const pageUrl = "https://tantrummingtrailblazers.com/tools/make-my-drive-fun/";

      function showToast(message) {
        if (!toast) return;

        toast.textContent = message || "Link copied";
        toast.classList.add("show");

        setTimeout(function () {
          toast.classList.remove("show");
        }, 1800);
      }

      async function copyLink() {
        try {
          if (navigator.clipboard && window.isSecureContext) {
            await navigator.clipboard.writeText(pageUrl);
          } else {
            const input = document.createElement("input");
            input.value = pageUrl;
            input.style.position = "fixed";
            input.style.left = "-9999px";
            input.setAttribute("readonly", "readonly");

            document.body.appendChild(input);
            input.select();
            document.execCommand("copy");
            input.remove();
          }

          showToast("Link copied");
        } catch (error) {
          showToast("Could not copy link");
        }
      }

      root.querySelectorAll("[data-copy-link]").forEach(function (button) {
        button.addEventListener("click", copyLink);
      });

      root.querySelectorAll("[data-share='native']").forEach(function (button) {
        button.addEventListener("click", async function () {
          if (navigator.share) {
            try {
              await navigator.share({
                title: "Make My Drive Fun",
                text: "A free family road trip planner for finding toilets, food, parks, EV chargers and fun stops along your route.",
                url: pageUrl
              });
            } catch (error) {}
          } else {
            copyLink();
          }
        });
      });

      window.addEventListener("load", function () {
        syncFullState();
        setTimeout(nudgeMap, 250);
      });

      window.addEventListener("resize", function () {
        clearTimeout(window.__ttbMmdfResize);
        window.__ttbMmdfResize = setTimeout(function () {
          syncFullState();
          nudgeMap();
        }, 150);
      });

      window.addEventListener("orientationchange", function () {
        setTimeout(function () {
          syncFullState();
          nudgeMap();
        }, 250);
      });

      document.addEventListener("fullscreenchange", function () {
        setTimeout(function () {
          syncFullState();
          nudgeMap();
        }, 80);
      });

      if ("MutationObserver" in window) {
        const observer = new MutationObserver(function () {
          clearTimeout(window.__ttbMmdfMutation);
          window.__ttbMmdfMutation = setTimeout(syncFullState, 60);
        });

        observer.observe(document.body, {
          attributes: true,
          subtree: true,
          attributeFilter: ["class"]
        });
      }

      syncFullState();
    }());
  </script>

  <script type="application/ld+json">
    {
      "@context": "https://schema.org",
      "@type": "WebApplication",
      "name": "Make My Drive Fun",
      "url": "https://tantrummingtrailblazers.com/tools/make-my-drive-fun/",
      "applicationCategory": "TravelApplication",
      "operatingSystem": "Web",
      "description": "A free family road trip planner that helps users find toilets, food, parks, EV chargers, scenic stops and useful places along a driving route.",
      "offers": {
        "@type": "Offer",
        "price": "0",
        "priceCurrency": "GBP"
      },
      "creator": {
        "@type": "Organization",
        "name": "Tantrumming Trailblazers",
        "url": "https://tantrummingtrailblazers.com/"
      }
    }
  </script>

  <script type="application/ld+json">
    {
      "@context": "https://schema.org",
      "@type": "FAQPage",
      "mainEntity": [
        {
          "@type": "Question",
          "name": "Does Make My Drive Fun find toilets and EV chargers along my route?",
          "acceptedAnswer": {
            "@type": "Answer",
            "text": "Yes. Make My Drive Fun is designed to show useful stops along or near a driving route, including toilets, EV chargers, food, parks and practical places. Results depend on available map data."
          }
        },
        {
          "@type": "Question",
          "name": "Can I add stops by clicking?",
          "acceptedAnswer": {
            "@type": "Answer",
            "text": "Yes. Users can add places from the map and build a multi-stop route rather than only viewing pins."
          }
        },
        {
          "@type": "Question",
          "name": "Does Make My Drive Fun open in Google Maps, Apple Maps or Waze?",
          "acceptedAnswer": {
            "@type": "Answer",
            "text": "Yes. The tool is intended for planning a journey and then handing off stops or routes to a preferred navigation app such as Google Maps, Apple Maps or Waze."
          }
        },
        {
          "@type": "Question",
          "name": "Which countries are supported?",
          "acceptedAnswer": {
            "@type": "Answer",
            "text": "Make My Drive Fun can work globally where open map data is available. Coverage varies by country and area."
          }
        }
      ]
    }
<script>
(function () {
  function kickMap() {
    window.dispatchEvent(new Event("resize"));

    setTimeout(function () {
      window.dispatchEvent(new Event("resize"));
    }, 120);

    setTimeout(function () {
      window.dispatchEvent(new Event("resize"));
    }, 350);
  }

  window.addEventListener("load", kickMap);
  window.addEventListener("resize", kickMap);
  window.addEventListener("orientationchange", function () {
    setTimeout(kickMap, 250);
  });

  document.addEventListener("click", function (event) {
    if (
      event.target.closest("#app-wrapper .menu-icon-btn") ||
      event.target.closest("#app-wrapper .top-menu-strip button") ||
      event.target.closest("#app-wrapper .top-menu-strip a") ||
      event.target.closest("#app-wrapper [role='button']")
    ) {
      setTimeout(kickMap, 80);
      setTimeout(kickMap, 300);
    }
  }, true);

  if ("MutationObserver" in window) {
    var wrapper = document.getElementById("app-wrapper");

    if (wrapper) {
      var observer = new MutationObserver(function () {
        clearTimeout(window.__ttbSafeMapKick);
        window.__ttbSafeMapKick = setTimeout(kickMap, 80);
      });

      observer.observe(wrapper, {
        attributes: true,
        childList: true,
        subtree: true,
        attributeFilter: ["class", "style", "aria-expanded"]
      });
    }
  }
})();
</script>
  
</section>
<p>The post <a href="https://tantrummingtrailblazers.com/tools/make-my-drive-fun/">🚗 Free Family Road Trip Planner | Make My Drive Fun | Share Routes | Tantrumming Trailblazers</a> appeared first on <a href="https://tantrummingtrailblazers.com">Tantrumming Trailblazers</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://tantrummingtrailblazers.com/tools/make-my-drive-fun/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1968</post-id>	</item>
	</channel>
</rss>
