<?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>Tools Archives - Tantrumming Trailblazers</title>
	<atom:link href="https://tantrummingtrailblazers.com/category/tools/feed/" rel="self" type="application/rss+xml" />
	<link>https://tantrummingtrailblazers.com/category/tools/</link>
	<description>Where Travel and Tantrums Collide in Epic Journeys!</description>
	<lastBuildDate>Fri, 08 May 2026 14:21:00 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</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>Tools Archives - Tantrumming Trailblazers</title>
	<link>https://tantrummingtrailblazers.com/category/tools/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">229502464</site>	<item>
		<title>Plan Smarter, Not Harder with Our “Make My Drive Fun” Route Planner</title>
		<link>https://tantrummingtrailblazers.com/tools/plan-smarter-not-harder-with-our-make-my-drive-fun-route-planner/</link>
					<comments>https://tantrummingtrailblazers.com/tools/plan-smarter-not-harder-with-our-make-my-drive-fun-route-planner/#respond</comments>
		
		<dc:creator><![CDATA[Dennis]]></dc:creator>
		<pubDate>Sat, 24 May 2025 10:16:03 +0000</pubDate>
				<category><![CDATA[Tools]]></category>
		<guid isPermaLink="false">https://tantrummingtrailblazers.com/tools/plan-smarter-not-harder-with-our-make-my-drive-fun-route-planner/</guid>

					<description><![CDATA[<p>We’ve built something we’re really proud of and it’s already helping families, digital nomads, and road trippers find the best stuff on&#8230;</p>
<p>The post <a href="https://tantrummingtrailblazers.com/tools/plan-smarter-not-harder-with-our-make-my-drive-fun-route-planner/">Plan Smarter, Not Harder with Our “Make My Drive Fun” Route Planner</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%2Fplan-smarter-not-harder-with-our-make-my-drive-fun-route-planner%2F&amp;linkname=Plan%20Smarter%2C%20Not%20Harder%20with%20Our%20%E2%80%9CMake%20My%20Drive%20Fun%E2%80%9D%20Route%20Planner" 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%2Fplan-smarter-not-harder-with-our-make-my-drive-fun-route-planner%2F&amp;linkname=Plan%20Smarter%2C%20Not%20Harder%20with%20Our%20%E2%80%9CMake%20My%20Drive%20Fun%E2%80%9D%20Route%20Planner" 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%2Fplan-smarter-not-harder-with-our-make-my-drive-fun-route-planner%2F&amp;linkname=Plan%20Smarter%2C%20Not%20Harder%20with%20Our%20%E2%80%9CMake%20My%20Drive%20Fun%E2%80%9D%20Route%20Planner" 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%2Fplan-smarter-not-harder-with-our-make-my-drive-fun-route-planner%2F&#038;title=Plan%20Smarter%2C%20Not%20Harder%20with%20Our%20%E2%80%9CMake%20My%20Drive%20Fun%E2%80%9D%20Route%20Planner" data-a2a-url="https://tantrummingtrailblazers.com/tools/plan-smarter-not-harder-with-our-make-my-drive-fun-route-planner/" data-a2a-title="Plan Smarter, Not Harder with Our “Make My Drive Fun” Route Planner"></a></p>
<p class="p2">We’ve built something we’re really proud of and it’s already helping families, digital nomads, and road trippers find the best stuff on the way, not just at the destination. </p>



<p class="p2">It’s our custom version we made to <a href="https://tantrummingtrailblazers.com/tools/make-my-drive-fun/">Make My Drive Fun</a>, and if you’ve ever typed “things to do on a road trip” or “find stops between two places” into Google this is for you.</p>



<p class="p1">Whether you’re cruising through France, navigating the coastlines of Vietnam, or bouncing around Southeast Asia, this tool will change how you plan. You pop in your start and end point, and we show you what’s nearby. Not just landmarks, but hidden gems, accessible parks, quirky cafés, beaches, historic sites, toilets and more.</p>



<p class="p2"><strong>Why We Built It</strong></p>



<p class="p1">We got sick of travel tools that only showed the big stuff or made it hard to find detours that were actually interesting. So we said nah, and built our own.</p>



<p class="p1">Now, with <a href="https://tantrummingtrailblazers.com/tools/make-my-drive-fun/">Make My Drive Fun</a>, you can:</p>



<p class="p2">Quickly plan stops without bouncing between apps Filter by family friendly spots or “must see” detours Explore the route as you go, not just before you leave</p>



<p class="p2"><strong>How to Use It</strong></p>



<p class="p1">Just head over to the <a href="https://tantrummingtrailblazers.com/tools/make-my-drive-fun/">tool page</a>, punch in your departure and destination, and it’ll sort stops along the way based on what’s nearby. We’re still adding more filters and secret features, so keep checking back.</p>



<p class="p2"><strong>Where It Works Best</strong></p>



<p class="p1">So far, it’s been tested on:</p>



<p class="p2">UK and Europe routes (yep, it handles France beautifully) Vietnam coastal drives like Phu Quoc to An Thoi, South America basically anywhere with Google Maps coverage so pretty much global &#8211; we even used it in china!</p>



<p class="p2"><strong>What’s Next?</strong></p>



<p class="p1">We’re working on an update that’ll let you:</p>



<p class="p2">Share your route with friends and family Bookmark favourite stops and we recently added toilet availability (don’t laugh crucial with kids)</p>



<p class="p1">If you love what we’re doing or have ideas, check out the <a href="https://tantrummingtrailblazers.com/tools/make-my-drive-fun/">Make My Drive Fun tool</a> and let us know what you think.</p>



<p class="p2"><strong>Start Exploring Now</strong></p>



<p class="p1">Ready to see what’s between A and B that’s worth stopping for?</p>



<p class="p1">Click here to launch the tool: <a href="https://tantrummingtrailblazers.com/tools/make-my-drive-fun/">Make My Drive Fun</a></p>



<p class="p1">Or visit our dedicated <a href="https://tantrummingtrailblazers.com/tools/make-my-drive-fun/">road trip tools hub</a> — yep, another link, because this thing deserves to be found.</p>



<p class="p1">Found us on Ecosia? You’ve got great taste. And you just helped plant a tree!</p>



<p class="p1">Frequently Asked Questions</p>



<p class="p3">Q: What is “Make My Drive Fun”?</p>



<p class="p3">A: It’s a free online road trip tool that helps families and travellers find fun, family friendly, or hidden gem stops between two locations. Just enter your start and end point and let the tool suggest what’s worth seeing on the way or search locally using gps!</p>



<p class="p3">Q: Does this tool work worldwide?</p>



<p class="p3">A: Yes! As long as the area has Google Maps coverage, the tool will work. It’s been tested across Europe, Asia, and more. Try it next time you’re planning a drive in Vietnam, France, or even back home in the UK.</p>



<p class="p3">Q: Is it really free to use?</p>



<p class="p3">A: 100% — no sign-ups, no nonsense. It’s hosted right here on Tantrumming Trailblazers to help make family travel easier and more fun.</p>
<p>The post <a href="https://tantrummingtrailblazers.com/tools/plan-smarter-not-harder-with-our-make-my-drive-fun-route-planner/">Plan Smarter, Not Harder with Our “Make My Drive Fun” Route Planner</a> appeared first on <a href="https://tantrummingtrailblazers.com">Tantrumming Trailblazers</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://tantrummingtrailblazers.com/tools/plan-smarter-not-harder-with-our-make-my-drive-fun-route-planner/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4769</post-id>	</item>
		<item>
		<title>Search Amazon and Support Our Adventures!</title>
		<link>https://tantrummingtrailblazers.com/tools/search-amazon-and-support-our-adventures/</link>
					<comments>https://tantrummingtrailblazers.com/tools/search-amazon-and-support-our-adventures/#respond</comments>
		
		<dc:creator><![CDATA[Dennis]]></dc:creator>
		<pubDate>Sun, 20 Oct 2024 19:56:41 +0000</pubDate>
				<category><![CDATA[Tools]]></category>
		<guid isPermaLink="false">https://tantrummingtrailblazers.com/?p=2658</guid>

					<description><![CDATA[<p>Looking for family travel gear, kids&#8217; toys, or everyday essentials? Use the search box below to explore Amazon and find what you&#8230;</p>
<p>The post <a href="https://tantrummingtrailblazers.com/tools/search-amazon-and-support-our-adventures/">Search Amazon and Support Our Adventures!</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%2Fsearch-amazon-and-support-our-adventures%2F&amp;linkname=Search%20Amazon%20and%20Support%20Our%20Adventures%21" 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%2Fsearch-amazon-and-support-our-adventures%2F&amp;linkname=Search%20Amazon%20and%20Support%20Our%20Adventures%21" 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%2Fsearch-amazon-and-support-our-adventures%2F&amp;linkname=Search%20Amazon%20and%20Support%20Our%20Adventures%21" 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%2Fsearch-amazon-and-support-our-adventures%2F&#038;title=Search%20Amazon%20and%20Support%20Our%20Adventures%21" data-a2a-url="https://tantrummingtrailblazers.com/tools/search-amazon-and-support-our-adventures/" data-a2a-title="Search Amazon and Support Our Adventures!"></a></p>
<p>Looking for family travel gear, kids&#8217; toys, or everyday essentials? Use the search box below to explore Amazon and find what you need! By using our affiliate link, you help support our family’s journey at no extra cost to you. Every little bit helps us continue sharing tips and stories from our world travels. Thank you for being a part of our adventure!</p>



<!-- Amazon Affiliate Search Widget -->
<div class="ttb-amazon-affiliate-widget">
    <style>
        /* Scoped Styles for Amazon Affiliate Widget */
        .ttb-amazon-affiliate-widget {
            font-family: 'Roboto', sans-serif;
            background-color: #f5f5f5;
            padding: 20px;
            max-width: 100%;
            box-sizing: border-box;
            display: flex;
            justify-content: center;
            align-items: center;
        }

        .ttb-amazon-affiliate-widget .ttb-search-container {
            text-align: center;
            background-color: #fff;
            padding: 40px 30px;
            border-radius: 20px;
            box-shadow: 0 12px 24px rgba(0,0,0,0.2);
            max-width: 100%;
            width: 100%;
            transition: transform 0.3s, box-shadow 0.3s;
        }

        .ttb-amazon-affiliate-widget .ttb-search-container:hover {
            transform: scale(1.02);
            box-shadow: 0 16px 32px rgba(0,0,0,0.3);
        }

        /* Search Box Styling */
        .ttb-amazon-affiliate-widget .ttb-search-box {
            position: relative;
            margin-bottom: 20px;
        }

        .ttb-amazon-affiliate-widget .ttb-search-box input[type="text"] {
            width: 100%;
            padding: 12px 40px 12px 15px;
            font-size: 16px;
            border: 2px solid #ddd;
            border-radius: 50px;
            outline: none;
            transition: border-color 0.3s, box-shadow 0.3s;
        }

        .ttb-amazon-affiliate-widget .ttb-search-box input[type="text"]:focus {
            border-color: #FFA41C;
            box-shadow: 0 0 10px rgba(255, 164, 28, 0.5);
        }

        .ttb-amazon-affiliate-widget .ttb-search-box .fa-search {
            position: absolute;
            right: 20px;
            top: 50%;
            transform: translateY(-50%);
            color: #888;
            pointer-events: none;
            font-size: 18px;
        }

        /* Submit Button Styling */
        .ttb-amazon-affiliate-widget .ttb-search-box input[type="submit"] {
            display: block;
            width: 100%;
            margin-top: 10px;
            padding: 12px;
            font-size: 16px;
            background-color: #FFA41C;
            border: none;
            color: #fff;
            font-weight: bold;
            border-radius: 50px;
            cursor: pointer;
            transition: background-color 0.3s, transform 0.2s;
        }

        .ttb-amazon-affiliate-widget .ttb-search-box input[type="submit"]:hover {
            background-color: #e08e00;
            transform: translateY(-2px);
        }

        /* Affiliate Disclosure */
        .ttb-amazon-affiliate-widget .ttb-disclosure {
            font-size: 12px;
            color: #555;
            margin-top: 15px;
        }

        /* Responsive Design */
        @media (max-width: 600px) {
            .ttb-amazon-affiliate-widget .ttb-search-container {
                padding: 30px 20px;
            }

            .ttb-amazon-affiliate-widget .ttb-search-box input[type="text"] {
                font-size: 14px;
                padding: 10px 35px 10px 12px;
            }

            .ttb-amazon-affiliate-widget .ttb-search-box .fa-search {
                right: 15px;
                font-size: 16px;
            }

            .ttb-amazon-affiliate-widget .ttb-search-box input[type="submit"] {
                font-size: 14px;
                padding: 10px;
            }
        }
    </style>

    <div class="ttb-search-container">
        <!-- Search Box with Font Awesome Icon -->
        <div class="ttb-search-box">
            <i class="fas fa-search"></i>
            <form id="ttb-searchForm" class="ttb-search-form">
                <input type="text" id="ttb-searchInput" placeholder="Search Amazon..." aria-label="Search Amazon">
                <input type="submit" value="Search Amazon" aria-label="Search">
            </form>
        </div>
        <!-- Affiliate Disclosure -->
        <div class="ttb-disclosure">
            <p>As an Amazon Associate, I earn from qualifying purchases.</p>
        </div>
    </div>
</div>

<script>
    (function() {
        // Ensure the script runs after the DOM is fully loaded
        document.addEventListener('DOMContentLoaded', function() {
            const sampleSearchTerms = [
                "family travel gear",
                "kids' educational toys",
                "baby travel accessories",
                "outdoor family activities",
                "children's books",
                "tavel-friendly strollers",
                "interactive kids' games",
                "family camping equipment",
                "toddler toys",
                "travel safety products"
            ];

            let currentTermIndex = 0;
            const searchInput = document.getElementById('ttb-searchInput');

            // Function to rotate placeholder text
            function rotatePlaceholder() {
                if (searchInput) {
                    searchInput.placeholder = sampleSearchTerms[currentTermIndex];
                    currentTermIndex = (currentTermIndex + 1) % sampleSearchTerms.length;
                }
            }

            // Initialize placeholder rotation
            rotatePlaceholder();
            setInterval(rotatePlaceholder, 5000); // Change placeholder every 5 seconds

            // Function to handle search form submission
            function submitSearch(event) {
                event.preventDefault(); // Prevent the default form submission

                let query = searchInput.value.trim();

                if (!query) {
                    // If no input, select a random search term
                    const randomIndex = Math.floor(Math.random() * sampleSearchTerms.length);
                    query = sampleSearchTerms[randomIndex];
                }

                if (query) {
                    const affiliateTag = 'referralcre09-21'; // Your Amazon Associates tracking ID
                    const encodedQuery = encodeURIComponent(query);
                    const amazonSearchUrl = `https://www.amazon.co.uk/s?k=${encodedQuery}&tag=${affiliateTag}`;

                    // Open the Amazon search in a new tab
                    window.open(amazonSearchUrl, '_blank');
                } else {
                    console.error('No search term available.');
                }
            }

            // Attach the submit event listener to the form
            const searchForm = document.getElementById('ttb-searchForm');
            if (searchForm) {
                searchForm.addEventListener('submit', submitSearch);
            } else {
                console.error('Search form not found!');
            }
        });
    })();
</script>



<p></p>
<p>The post <a href="https://tantrummingtrailblazers.com/tools/search-amazon-and-support-our-adventures/">Search Amazon and Support Our Adventures!</a> appeared first on <a href="https://tantrummingtrailblazers.com">Tantrumming Trailblazers</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://tantrummingtrailblazers.com/tools/search-amazon-and-support-our-adventures/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2658</post-id>	</item>
		<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>
        </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. Plan in Make My Drive Fun, then drive with the app you already use.</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">10</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>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,maximum-scale=1,user-scalable=no" />
  <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" />

  <style>
    :root {
      color-scheme: light;
      --color-primary: #2563eb;
      --color-primary-dark: #1d4ed8;
      --color-accent-emerald: #059669;
      --color-accent-violet: #7c3aed;
      --color-bg-dark: #f1f5f9;
      --color-bg-darker: #e8edf3;
      --color-bg-card: #ffffff;
      --color-bg-card-hover: #f8fafc;
      --color-text-primary: #1e293b;
      --color-text-secondary: #475569;
      --color-text-muted: #94a3b8;
      --color-border: rgba(30,41,59,.12);
      --color-border-light: rgba(30,41,59,.06);
      --shadow-sm: 0 1px 3px rgba(0,0,0,.06), 0 1px 2px rgba(0,0,0,.04);
      --shadow-md: 0 4px 12px rgba(0,0,0,.07);
      --shadow-lg: 0 12px 40px rgba(0,0,0,.08);
      --shadow-xl: 0 20px 60px rgba(0,0,0,.1);
      --blur-sm: 12px;
      --blur-md: 24px;
    }

    [v-cloak] { display: none; }

    html, body {
      min-height: 100%;
      margin: 0;
      padding: 0;
      background:
        radial-gradient(circle at 10% 0%, rgba(37,99,235,.04), transparent 35%),
        radial-gradient(circle at 90% 100%, rgba(124,58,237,.03), transparent 35%),
        linear-gradient(180deg, #f1f5f9 0%, #e8edf3 50%, #e2e8f0 100%);
      background-attachment: fixed;
    }

    body {
      color: var(--color-text-primary);
      overflow-x: hidden;
    }

    #app-wrapper {
      font-family: 'Inter', sans-serif;
      background: transparent;
      color: var(--color-text-primary);
      /* Reset body text colour for dark panels */
      min-height: 100vh;
      width: 100%;
      position: relative;
      touch-action: manipulation;
      padding: 18px 0 24px;
    }

    .app-shell {
      position: relative;
      border: 1px solid rgba(30,41,59,.08);
      border-radius: 32px;
      padding: 16px;
      box-shadow:
        0 4px 24px rgba(0,0,0,.06),
        0 12px 48px rgba(0,0,0,.04);
      background: rgba(255,255,255,.5);
      backdrop-filter: blur(8px);
      -webkit-backdrop-filter: blur(8px);
      overflow: hidden;
    }

    @media (max-width: 1024px) {
      .app-shell {
        position: relative;
        z-index: 50;
        border-radius: 0;
        padding: 0;
        border: none;
        box-shadow: none;
        background: transparent;
        backdrop-filter: none;
      }
    }

    .app-shell.is-full {
      position: fixed;
      inset: 0;
      z-index: 9999;
      background: #f1f5f9;
      padding: 1rem;
      overflow: auto;
      border: none;
      border-radius: 0;
      box-shadow: none;
    }

    .app-shell.is-full .container {
      max-width: none !important;
      width: 100% !important;
      margin: 0 !important;
    }

    .app-shell.is-full #map {
      height: calc(100vh - 3rem);
    }

    /* Bottom Sheet Pattern for Mobile */
    .left-menu {
      max-width: 560px;
      background: linear-gradient(180deg, rgba(255,255,255,.96) 0%, rgba(241,245,249,.92) 100%);
      border: 1px solid var(--color-border);
      border-top: 1px solid rgba(30,41,59,.06);
      border-radius: 28px;
      box-shadow:
        0 30px 80px rgba(0,0,0,.08),
        inset 0 1px 0 rgba(255,255,255,.6);
      padding: 26px;
      backdrop-filter: blur(var(--blur-md));
      -webkit-backdrop-filter: blur(var(--blur-md));
      transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
      max-height: calc(100vh - 4rem);
      overflow-y: auto;
      scrollbar-width: thin;
      scrollbar-color: rgba(59,130,246,.2) transparent;
    }
    .left-menu::-webkit-scrollbar { width: 5px; }
    .left-menu::-webkit-scrollbar-thumb { background: rgba(59,130,246,.2); border-radius: 4px; }
    .left-menu::-webkit-scrollbar-track { background: transparent; }

    /* Hide bottom sheet handle on desktop */
    .bottom-sheet-handle {
      display: none;
    }

    @media (max-width: 1024px) {
      .left-menu {
        position: fixed;
        bottom: 0;
        left: 0;
        right: 0;
        max-width: none;
        max-height: 70vh;
        border-radius: 32px 32px 0 0;
        padding: 0;
        z-index: 1000;
        transform: translateY(0);
        overflow: hidden;
        transition: max-height 0.35s cubic-bezier(0.4, 0, 0.2, 1);
      }

      .left-menu.bottom-sheet-collapsed {
        max-height: 72px;
        box-shadow: 0 -4px 24px rgba(0,0,0,.18);
        overflow: visible;
        pointer-events: auto;
        border-radius: 20px 20px 0 0;
        padding-bottom: env(safe-area-inset-bottom, 0px);
      }
      .left-menu.bottom-sheet-collapsed .bottom-sheet-handle {
        background: linear-gradient(135deg, #3b82f6, #2563eb);
        height: 64px;
        border-radius: 20px 20px 0 0;
        padding-bottom: env(safe-area-inset-bottom, 8px);
      }
      .left-menu.bottom-sheet-collapsed .bottom-sheet-handle-bar {
        background: rgba(255,255,255,.5);
        width: 40px;
      }
      .left-menu.bottom-sheet-collapsed .bottom-sheet-label {
        color: #fff;
        font-size: 14px;
        letter-spacing: 0.5px;
        font-weight: 700;
      }

      .bottom-sheet-handle {
        height: 48px;
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        gap: 4px;
        cursor: pointer;
        padding: 0 16px;
        border-bottom: 1px solid var(--color-border);
        background: linear-gradient(180deg, rgba(248,250,252,.98) 0%, rgba(255,255,255,.95) 100%);
        border-radius: 32px 32px 0 0;
        position: relative;
        z-index: 10;
        -webkit-tap-highlight-color: rgba(59,130,246,.15);
        touch-action: manipulation;
        user-select: none;
        -webkit-user-select: none;
      }

      .bottom-sheet-handle:active {
        cursor: grabbing;
      }

      .bottom-sheet-handle-bar {
        width: 36px;
        height: 4px;
        background: rgba(96,165,250,.45);
        border-radius: 999px;
      }

      .bottom-sheet-label {
        font-size: 11px;
        font-weight: 700;
        color: rgba(96,165,250,.7);
        text-transform: uppercase;
        letter-spacing: 1.5px;
      }

      .bottom-sheet-content {
        overflow-y: auto;
        max-height: calc(70vh - 88px);
        padding: 26px;
      }
    }


    #map {
      height: calc(100vh - 4rem);
      min-height: 560px;
      background: var(--color-bg-darker);
      border-radius: 28px;
      border: 1px solid var(--color-border);
      box-shadow: var(--shadow-lg);
      touch-action: none;
      overflow: hidden;
      position: relative;
    }

    @media (max-width: 1024px) {
      #map {
        height: calc(100vh - 88px);
        min-height: auto;
        border-radius: 0;
      }
    }

    @media (max-width: 640px) {
      #map {
        height: calc(100vh - 88px);
        min-height: auto;
      }
    }

    /* Map Empty State Overlay */
    .map-overlay-instruction {
      position: absolute;
      inset: 0;
      display: flex;
      align-items: center;
      justify-content: center;
      background: rgba(0,0,0,.25);
      backdrop-filter: blur(4px);
      z-index: 10;
      border-radius: 28px;
      pointer-events: none;
    }

    .map-overlay-instruction.hidden {
      display: none;
    }

    .map-overlay-text {
      text-align: center;
      color: rgba(255,255,255,.85);
      font-size: 16px;
      text-shadow: 0 1px 4px rgba(0,0,0,.3);
      letter-spacing: 0.5px;
    }

    /* Map tool button (top-right overlay) */
    /* Map toolbar row — top-right overlay */
    .map-toolbar-row {
      position: absolute;
      top: 12px;
      right: 12px;
      z-index: 999;
      display: flex;
      gap: 6px;
    }
    .map-tool-btn {
      display: flex;
      align-items: center;
      gap: 5px;
      padding: 8px 12px;
      background: rgba(241,245,249,.92);
      backdrop-filter: blur(12px);
      -webkit-backdrop-filter: blur(12px);
      border: 1px solid rgba(148,163,184,.18);
      border-radius: 10px;
      color: var(--color-text-secondary);
      font-size: 12px;
      font-weight: 600;
      cursor: pointer;
      transition: all .2s;
      box-shadow: 0 4px 16px rgba(0,0,0,.08);
      white-space: nowrap;
    }
    .map-tool-btn:hover {
      border-color: rgba(96,165,250,.4);
      background: rgba(241,245,249,.95);
      color: #2563eb;
    }
    .map-tool-btn-active {
      background: rgba(59,130,246,.2);
      border-color: rgba(96,165,250,.5);
      color: #2563eb;
      box-shadow: 0 0 20px rgba(59,130,246,.12), 0 4px 16px rgba(0,0,0,.06);
    }
    .map-tool-label {
      font-size: 11px;
      letter-spacing: 0.3px;
    }
    @media (max-width: 640px) {
      .map-toolbar-row {
        top: 8px;
        right: 8px;
        gap: 4px;
      }
      .map-tool-btn {
        padding: 7px 10px;
        font-size: 11px;
        border-radius: 8px;
      }
      .map-tool-label {
        font-size: 10px;
      }
    }

    /* Map hint banner */
    .map-hint-banner {
      position: absolute;
      top: 60px;
      left: 50%;
      transform: translateX(-50%);
      z-index: 999;
      padding: 10px 20px;
      background: linear-gradient(135deg, rgba(16,185,129,.92) 0%, rgba(52,211,153,.88) 100%);
      color: #022c22;
      font-size: 13px;
      font-weight: 700;
      border-radius: 12px;
      box-shadow: 0 8px 32px rgba(16,185,129,.35), 0 2px 8px rgba(0,0,0,.2);
      cursor: pointer;
      white-space: nowrap;
      max-width: 90%;
      text-align: center;
      animation: hintBounce .5s ease;
    }
    @keyframes hintBounce {
      0% { opacity: 0; transform: translateX(-50%) translateY(-12px); }
      60% { transform: translateX(-50%) translateY(3px); }
      100% { opacity: 1; transform: translateX(-50%) translateY(0); }
    }
    .hint-fade-enter-active { animation: hintBounce .5s ease; }
    .hint-fade-leave-active { transition: opacity .3s ease, transform .3s ease; }
    .hint-fade-leave-to { opacity: 0; transform: translateX(-50%) translateY(-10px); }
    @media (max-width: 640px) {
      .map-hint-banner {
        font-size: 12px;
        padding: 8px 14px;
        top: 52px;
      }
    }

    /* Map overlay stats strip — pinned to bottom of map */
    .map-stats-strip {
      position: absolute;
      bottom: 12px;
      left: 12px;
      right: 12px;
      z-index: 999;
      display: flex;
      gap: 6px;
      flex-wrap: wrap;
      padding: 0;
    }
    .map-stat-chip {
      display: inline-flex;
      align-items: center;
      gap: 5px;
      padding: 7px 14px;
      background: rgba(241,245,249,.92);
      backdrop-filter: blur(12px);
      -webkit-backdrop-filter: blur(12px);
      border: 1px solid rgba(148,163,184,.15);
      border-radius: 999px;
      font-size: 12px;
      font-weight: 600;
      color: var(--color-text-secondary);
      box-shadow: 0 4px 16px rgba(0,0,0,.08);
    }
    .map-stat-chip strong {
      color: var(--color-text-primary);
      font-weight: 700;
    }

    /* POI searching indicator */
    .poi-searching-bar {
      height: 3px;
      border-radius: 3px;
      background: linear-gradient(90deg, transparent, var(--color-primary), transparent);
      animation: shimmerSlide 1.2s infinite;
      margin-bottom: 8px;
    }
    /* Quick filter strip */
    .quick-filter-strip {
      padding: 12px 14px;
      background: linear-gradient(135deg, rgba(52,211,153,.12) 0%, rgba(16,185,129,.08) 100%);
      border: 1px solid rgba(52,211,153,.35);
      border-radius: 14px;
      box-shadow:
        0 0 20px rgba(52,211,153,.1),
        inset 0 1px 0 rgba(255,255,255,.05);
      animation: filterStripPulse 3s ease-in-out infinite;
    }
    @keyframes filterStripPulse {
      0%, 100% { border-color: rgba(52,211,153,.35); box-shadow: 0 0 20px rgba(52,211,153,.1), inset 0 1px 0 rgba(255,255,255,.05); }
      50% { border-color: rgba(52,211,153,.55); box-shadow: 0 0 30px rgba(52,211,153,.18), inset 0 1px 0 rgba(255,255,255,.07); }
    }

    @keyframes shimmerSlide {
      0% { transform: translateX(-100%); }
      100% { transform: translateX(100%); }
    }

    /* POI card action buttons */
    .poi-action-btn {
      display: inline-flex;
      align-items: center;
      gap: 4px;
      padding: 5px 10px;
      border: 1px solid rgba(148,163,184,.18);
      border-radius: 8px;
      background: rgba(241,245,249,.7);
      color: var(--color-text-secondary);
      font-size: 11px;
      font-weight: 600;
      cursor: pointer;
      transition: all .2s;
      line-height: 1;
    }
    .poi-action-btn:hover {
      border-color: rgba(96,165,250,.35);
      color: #93c5fd;
      background: rgba(241,245,249,.95);
    }
    .poi-action-route {
      border-color: rgba(52,211,153,.25);
      color: #34d399;
    }
    .poi-action-route:hover {
      border-color: rgba(52,211,153,.5);
      background: rgba(16,185,129,.12);
      color: #6ee7b7;
    }
    .poi-action-fav-active {
      border-color: rgba(250,204,21,.35);
      color: #fbbf24;
      background: rgba(250,204,21,.08);
    }

    /* Map cluster icon */
    .cluster-icon {
      width: 44px; height: 44px;
      border-radius: 50%;
      background: linear-gradient(135deg, #2563eb 0%, #1e40af 100%);
      color: #fff;
      display: flex; align-items: center; justify-content: center;
      font-weight: 800; font-size: 14px;
      border: 3px solid rgba(255,255,255,0.3);
      box-shadow: 0 4px 12px rgba(37,99,235,.4);
    }

    /* Find Stops glow button */
    @keyframes neon-pulse {
      0% { box-shadow: 0 0 0 0 rgba(16, 185, 129, 0.7), 0 0 20px rgba(16, 185, 129, 0.4); transform: scale(1); }
      50% { box-shadow: 0 0 0 12px rgba(16, 185, 129, 0), 0 0 40px rgba(16, 185, 129, 0.6); transform: scale(1.02); }
      100% { box-shadow: 0 0 0 0 rgba(16, 185, 129, 0), 0 0 20px rgba(16, 185, 129, 0.4); transform: scale(1); }
    }
    .btn-glow-intense {
      animation: neon-pulse 2s infinite;
      background: linear-gradient(135deg, #10b981 0%, #059669 100%);
      border: 1px solid #34d399;
      min-width: 148px;
      min-height: 52px;
      border-radius: 16px;
      font-size: 15px;
      letter-spacing: .08em;
      box-shadow: 0 18px 38px rgba(16,185,129,.28);
      cursor: pointer;
    }
    .btn-glow-intense:hover {
      background: linear-gradient(135deg, #34d399 0%, #10b981 100%);
    }

    .spinner {
      border: 3px solid rgba(255,255,255,0.1);
      width: 20px; height: 20px;
      border-radius: 50%;
      border-left-color: #fff;
      animation: spin 1s linear infinite;
    }
    @keyframes spin { to { transform: rotate(360deg); } }

    /* Floating Action Button */
    .fab {
      position: absolute;
      bottom: 24px;
      right: 24px;
      width: 56px;
      height: 56px;
      border-radius: 16px;
      background: linear-gradient(135deg, var(--color-primary) 0%, var(--color-accent-violet) 100%);
      border: 1px solid rgba(255,255,255,.2);
      color: white;
      font-size: 24px;
      cursor: pointer;
      display: flex;
      align-items: center;
      justify-content: center;
      box-shadow: 0 12px 24px rgba(59,130,246,.3);
      transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
      z-index: 15;
    }

    .fab:hover {
      transform: scale(1.1);
      box-shadow: 0 16px 32px rgba(59,130,246,.4);
    }

    .fab:active {
      transform: scale(0.95);
    }

    .fab.active {
      background: linear-gradient(135deg, var(--color-accent-emerald) 0%, var(--color-primary) 100%);
    }

    @media (max-width: 1024px) {
      .fab {
        bottom: auto;
        top: 16px;
        right: 16px;
        width: 48px;
        height: 48px;
        font-size: 20px;
      }
    }

    /* Route Summary Card */
    .route-summary-card {
      background: linear-gradient(135deg, rgba(255,255,255,.98) 0%, rgba(248,250,252,.95) 100%);
      border: 1px solid rgba(96,165,250,.2);
      border-radius: 20px;
      padding: 20px;
      box-shadow: 0 0 24px rgba(59,130,246,.1);
      position: relative;
      overflow: hidden;
    }

    .route-summary-card::before {
      content: '';
      position: absolute;
      inset: 0;
      background: linear-gradient(135deg, rgba(59,130,246,.05) 0%, transparent 100%);
      pointer-events: none;
    }

    .route-summary-header {
      display: flex;
      justify-content: space-between;
      align-items: center;
      gap: 16px;
      margin-bottom: 16px;
      position: relative;
      z-index: 1;
    }

    .route-summary-title {
      font-size: 18px;
      font-weight: 700;
      color: var(--color-text-primary);
      letter-spacing: -0.3px;
    }

    .route-summary-stats {
      display: flex;
      gap: 12px;
      flex-wrap: wrap;
      position: relative;
      z-index: 1;
    }

    .route-stat-badge {
      display: flex;
      flex-direction: column;
      align-items: center;
      gap: 4px;
      padding: 10px 16px;
      background: rgba(59,130,246,.04);
      border: 1px solid rgba(96,165,250,.15);
      border-radius: 12px;
      font-size: 12px;
      color: var(--color-text-muted);
    }

    .route-stat-badge strong {
      font-size: 16px;
      color: var(--color-text-primary);
      font-weight: 700;
    }

    .route-legs-toggle {
      position: relative;
      z-index: 1;
    }

    .route-legs-toggle button {
      display: flex;
      align-items: center;
      gap: 8px;
      font-size: 13px;
      font-weight: 600;
      color: var(--color-primary);
      background: transparent;
      border: none;
      cursor: pointer;
      padding: 6px 0;
      transition: all 0.2s;
    }

    .route-legs-toggle button:hover {
      color: #2563eb;
    }

    .route-legs-toggle svg {
      transition: transform 0.3s;
    }

    .route-legs-toggle.expanded svg {
      transform: rotate(180deg);
    }

    .route-legs-list {
      max-height: 0;
      overflow: hidden;
      transition: max-height 0.3s ease-out;
      position: relative;
      z-index: 1;
    }

    .route-legs-list.expanded {
      max-height: 500px;
    }

    .route-leg-item {
      display: flex;
      align-items: center;
      gap: 12px;
      padding: 12px;
      background: rgba(59,130,246,.02);
      border-radius: 10px;
      border-left: 3px solid var(--color-primary);
      margin-top: 8px;
      animation: slideIn 0.3s ease-out;
    }

    @keyframes slideIn {
      from {
        opacity: 0;
        transform: translateY(-8px);
      }
      to {
        opacity: 1;
        transform: translateY(0);
      }
    }

    .route-leg-labels {
      flex: 1;
      min-width: 0;
    }

    .route-leg-label {
      font-size: 12px;
      color: var(--color-text-muted);
      line-height: 1.4;
    }

    .route-leg-label strong {
      display: block;
      color: var(--color-text-secondary);
      font-weight: 600;
      white-space: nowrap;
      overflow: hidden;
      text-overflow: ellipsis;
    }

    .route-leg-stats {
      display: flex;
      gap: 8px;
      white-space: nowrap;
      font-size: 12px;
      font-weight: 600;
    }

    .route-leg-stat {
      background: rgba(59,130,246,.15);
      color: var(--color-primary);
      padding: 4px 10px;
      border-radius: 6px;
    }

    /* Top Menu and Stats */
    .top-menu-strip {
      display: flex;
      gap: 12px;
      margin-bottom: 20px;
      padding-bottom: 16px;
      border-bottom: 1px solid var(--color-border);
      flex-wrap: wrap;
      align-items: center;
    }

    .menu-icon-btn {
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
      gap: 4px;
      padding: 8px 16px;
      background: rgba(241,245,249,.8);
      border: 1px solid var(--color-border);
      border-radius: 12px;
      color: var(--color-text-secondary);
      cursor: pointer;
      font-size: 12px;
      font-weight: 600;
      transition: all 0.2s;
      position: relative;
      min-height: 44px;
      min-width: 56px;
    }

    .menu-icon-btn:hover {
      border-color: rgba(96,165,250,.4);
      background: rgba(59,130,246,.1);
      color: var(--color-text-primary);
    }

    .menu-icon-btn-active {
      background: linear-gradient(135deg, rgba(59,130,246,.25) 0%, rgba(167,139,250,.15) 100%);
      border-color: rgba(96,165,250,.5);
      color: var(--color-primary);
      box-shadow: 0 0 12px rgba(59,130,246,.1);
    }

    .menu-emoji {
      font-size: 18px;
      line-height: 1;
    }

    .tab-label {
      font-size: 11px;
      letter-spacing: 0.3px;
    }

    .menu-pill-badge {
      position: absolute;
      top: -6px;
      right: -6px;
      background: linear-gradient(135deg, var(--color-accent-emerald), var(--color-primary));
      color: white;
      font-size: 10px;
      font-weight: 700;
      padding: 3px 6px;
      border-radius: 8px;
      min-width: 20px;
      text-align: center;
    }

    .stats-row {
      display: flex;
      gap: 12px;
      margin-bottom: 20px;
      flex-wrap: wrap;
    }

    .stat-pill {
      display: flex;
      flex-direction: column;
      gap: 2px;
      padding: 10px 14px;
      background: linear-gradient(135deg, rgba(241,245,249,.9) 0%, rgba(241,245,249,.85) 100%);
      border: 1px solid var(--color-border);
      border-radius: 12px;
      font-size: 11px;
      color: var(--color-text-muted);
      font-weight: 500;
      letter-spacing: 0.3px;
    }

    .stat-pill strong {
      font-size: 14px;
      color: var(--color-primary);
      font-weight: 700;
    }

    .ev-toggle {
      transition: all .25s;
      border: 1px solid var(--color-border);
    }
    .ev-toggle:hover {
      border-color: rgba(250,204,21,.3);
    }
    .ev-toggle-active {
      background: linear-gradient(135deg, rgba(250,204,21,.15) 0%, rgba(234,179,8,.1) 100%);
      border-color: rgba(250,204,21,.4);
      box-shadow: 0 0 16px rgba(250,204,21,.12);
    }
    .ev-toggle-active strong {
      color: #facc15;
    }

    /* Section Cards */
    .section-card {
      background: linear-gradient(180deg, rgba(241,245,249,.92), rgba(241,245,249,.90));
      border: 1px solid var(--color-border);
      border-radius: 18px;
      padding: 18px;
      transition: all 0.2s;
      animation: fadeInUp 0.4s ease-out;
    }

    @keyframes fadeInUp {
      from {
        opacity: 0;
        transform: translateY(12px);
      }
      to {
        opacity: 1;
        transform: translateY(0);
      }
    }

    .section-card:hover {
      border-color: rgba(96,165,250,.24);
      box-shadow: 0 12px 32px rgba(59,130,246,.08);
    }

    .section-heading {
      display: flex;
      justify-content: space-between;
      align-items: center;
      gap: 12px;
      margin-bottom: 16px;
    }

    .section-heading h3,
    .section-heading h4 {
      font-size: 16px;
      font-weight: 700;
      color: var(--color-text-primary);
      letter-spacing: -0.3px;
      margin: 0;
    }

    .section-heading h4 {
      font-size: 14px;
    }

    .subtle-label {
      display: block;
      font-size: 11px;
      color: var(--color-text-muted);
      font-weight: 600;
      letter-spacing: 0.4px;
      margin-bottom: 8px;
      text-transform: uppercase;
    }

    /* Input Fields */
    .custom-input {
      background: var(--color-bg-card);
      border: 1px solid rgba(30,41,59,.15);
      color: var(--color-text-primary);
      transition: all 0.2s;
      font-size: 14px;
      font-family: 'Inter', sans-serif;
    }

    .custom-input:hover {
      border-color: rgba(96,165,250,.32);
    }

    .custom-input:focus {
      outline: none;
      border-color: var(--color-primary);
      box-shadow: 0 0 0 3px rgba(59,130,250,.12);
      background: var(--color-bg-darker);
    }

    .custom-input::placeholder {
      color: var(--color-text-muted);
    }

    /* Override browser autofill styling */
    .custom-input:-webkit-autofill,
    .custom-input:-webkit-autofill:hover,
    .custom-input:-webkit-autofill:focus {
      -webkit-text-fill-color: var(--color-text-primary) !important;
      -webkit-box-shadow: 0 0 0 1000px var(--color-bg-card) inset !important;
      box-shadow: 0 0 0 1000px var(--color-bg-card) inset !important;
      background-color: var(--color-bg-card) !important;
      color: var(--color-text-primary) !important;
      caret-color: var(--color-text-primary) !important;
    }
    input, select, textarea {
      color: var(--color-text-primary);
      background-color: var(--color-bg-card);
      color-scheme: light;
    }

    /* Bundle Cards with Enhanced Styling */
    .bundle-grid {
      display: grid;
      grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
      gap: 12px;
    }

    @media (max-width: 640px) {
      .bundle-grid {
        grid-template-columns: repeat(3, 1fr);
      }
    }

    .bundle-card {
      position: relative;
      padding: 16px;
      background: linear-gradient(135deg, rgba(241,245,249,.94) 0%, rgba(241,245,249,.88) 100%);
      border: 1px solid rgba(96,165,250,.16);
      border-radius: 16px;
      cursor: pointer;
      transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
      overflow: hidden;
    }

    .bundle-card::before {
      content: '';
      position: absolute;
      inset: 0;
      background: linear-gradient(135deg, rgba(59,130,246,.1) 0%, transparent 100%);
      opacity: 0;
      transition: opacity 0.3s;
      pointer-events: none;
    }

    .bundle-card:hover {
      border-color: rgba(96,165,250,.32);
      box-shadow: 0 12px 32px rgba(59,130,246,.12);
      transform: translateY(-4px);
    }

    .bundle-card:hover::before {
      opacity: 1;
    }

    .bundle-card input:checked + .check-mark,
    .bundle-card input:checked ~ .check-mark {
      opacity: 1;
      transform: scale(1);
    }

    .bundle-card input:checked {
      border-color: var(--color-primary);
      box-shadow: 0 0 12px rgba(59,130,246,.3);
    }

    .bundle-card-content {
      display: flex;
      flex-direction: column;
      align-items: center;
      text-align: center;
      gap: 6px;
      position: relative;
      z-index: 1;
    }

    .bundle-emoji {
      font-size: 32px;
      line-height: 1;
      margin-bottom: 4px;
    }

    .bundle-title {
      font-weight: 700;
      font-size: 13px;
      color: var(--color-text-primary);
      letter-spacing: -0.2px;
    }

    .bundle-description {
      font-size: 11px;
      color: var(--color-text-muted);
      line-height: 1.4;
      margin-top: 4px;
    }

    .check-mark {
      position: absolute;
      top: 8px;
      right: 8px;
      opacity: 0;
      transform: scale(0.5);
      transition: all 0.2s;
      color: var(--color-primary);
      width: 20px;
      height: 20px;
    }

    /* POI Cards with Enhanced Styling */
    .result-card,
    .saved-card {
      background: linear-gradient(135deg, rgba(241,245,249,.94) 0%, rgba(241,245,249,.90) 100%);
      border: 1px solid rgba(30,41,59,.76);
      border-radius: 16px;
      transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
      position: relative;
      overflow: hidden;
    }

    .result-card::before,
    .saved-card::before {
      content: '';
      position: absolute;
      left: 0;
      top: 0;
      bottom: 0;
      width: 3px;
      background: linear-gradient(180deg, var(--color-accent-emerald), var(--color-primary));
      opacity: 0;
      transition: opacity 0.2s;
    }

    .result-card:hover,
    .saved-card:hover {
      transform: translateY(-2px);
      border-color: rgba(96,165,250,.38);
      box-shadow: 0 16px 32px rgba(59,130,246,.15);
      background: linear-gradient(135deg, rgba(241,245,249,.98) 0%, rgba(241,245,249,.95) 100%);
    }

    .result-card:hover::before,
    .saved-card:hover::before {
      opacity: 1;
    }

    .poi-icon {
      font-size: 20px;
      line-height: 1;
    }

    .poi-content {
      flex: 1;
      min-width: 0;
    }

    .poi-name {
      font-weight: 600;
      font-size: 13px;
      color: var(--color-text-primary);
      white-space: nowrap;
      overflow: hidden;
      text-overflow: ellipsis;
      margin-bottom: 2px;
    }

    .poi-category {
      font-size: 11px;
      color: var(--color-text-muted);
    }

    .poi-distance {
      display: inline-flex;
      align-items: center;
      gap: 4px;
      padding: 4px 10px;
      background: rgba(96,165,250,.15);
      color: var(--color-primary);
      border-radius: 6px;
      font-size: 12px;
      font-weight: 600;
      white-space: nowrap;
    }

    /* Chip Styling */
    .chip {
      font-size: 0.75rem;
      padding: 0.5rem 1rem;
      border-radius: 999px;
      background: rgba(241,245,249,.9);
      border: 1px solid rgba(96,165,250,.2);
      cursor: pointer;
      color: var(--color-text-secondary);
      transition: all 0.25s;
      font-weight: 600;
      min-height: 40px;
      display: inline-flex;
      align-items: center;
      box-shadow: 0 2px 8px rgba(0,0,0,.06);
    }

    .chip:hover {
      border-color: rgba(96,165,250,.5);
      color: var(--color-text-primary);
      background: rgba(59,130,246,.12);
      box-shadow: 0 0 12px rgba(96,165,250,.12);
      transform: translateY(-1px);
    }

    .chip-active {
      background: linear-gradient(135deg, #2563eb 0%, #7c3aed 100%);
      border-color: #2563eb;
      color: white;
      box-shadow: 0 0 24px rgba(37,99,235,.4), 0 8px 20px rgba(37,99,235,.25);
      text-shadow: 0 1px 2px rgba(0,0,0,.15);
      transform: translateY(-1px) scale(1.04);
      font-weight: 700;
    }

    .chip-toggle {
      display: inline-flex;
      align-items: center;
      gap: 0.45rem;
      background: rgba(241,245,249,.9);
      border: 1px solid rgba(30,41,59,.15);
      padding: 0.5rem 0.9rem;
      border-radius: 999px;
      cursor: pointer;
      font-size: 0.8rem;
      min-height: 40px;
      font-weight: 600;
      transition: all 0.2s;
    }

    .chip-toggle:hover {
      border-color: rgba(96,165,250,.4);
      color: var(--color-text-primary);
      background: rgba(59,130,246,.08);
    }

    .chip-toggle-active {
      background: linear-gradient(135deg, #2563eb 0%, #7c3aed 100%);
      border-color: #2563eb;
      color: white;
      box-shadow: 0 0 24px rgba(37,99,235,.4), 0 8px 20px rgba(37,99,235,.25);
      transform: translateY(-1px) scale(1.04);
      font-weight: 700;
    }

    /* Autocomplete Dropdown */
    .poi-icon-wrap {
      width: 48px; height: 48px;
      display: flex; align-items: center; justify-content: center;
      background: linear-gradient(135deg, rgba(241,245,249,.9) 0%, rgba(241,245,249,.95) 100%);
      border-radius: 14px;
      border: 1px solid rgba(96,165,250,.2);
      font-size: 24px;
      flex-shrink: 0;
      box-shadow: 0 4px 12px rgba(0,0,0,.06);
    }
    .poi-cat-badge {
      font-size: 10px;
      padding: 3px 10px;
      border-radius: 999px;
      background: rgba(59,130,246,.12);
      border: 1px solid rgba(96,165,250,.2);
      color: #2563eb;
      font-weight: 600;
      letter-spacing: 0.2px;
    }

    .save-dropdown {
      position: absolute;
      top: 100%;
      right: 0;
      margin-top: 6px;
      width: 260px;
      background: rgba(241,245,249,.98);
      backdrop-filter: blur(16px);
      border: 1px solid rgba(96,165,250,.18);
      border-radius: 16px;
      box-shadow: 0 20px 50px rgba(0,0,0,.1);
      z-index: 60;
      animation: slideIn .2s ease;
    }

    .autocomplete-dropdown {
      position: relative;
      margin-top: 8px;
      background: rgba(241,245,249,.98);
      border: 1px solid rgba(96,165,250,.2);
      max-height: 220px;
      overflow-y: auto;
      border-radius: 14px;
      color: var(--color-text-primary);
      box-shadow: 0 24px 50px rgba(0,0,0,.1);
      z-index: 30;
      backdrop-filter: blur(var(--blur-sm));
      -webkit-backdrop-filter: blur(var(--blur-sm));
    }

    .autocomplete-item {
      padding: 12px 14px;
      cursor: pointer;
      font-size: 0.92rem;
      border-bottom: 1px solid rgba(0,0,0,.06);
      color: var(--color-text-secondary);
      transition: all 0.15s;
    }

    .autocomplete-item:hover {
      background: rgba(59,130,246,.2);
      color: var(--color-primary);
      padding-left: 18px;
    }

    /* Loading Animation - Enhanced Route Spinner */
    .spinner {
      width: 32px;
      height: 32px;
      position: relative;
      display: inline-block;
    }

    .spinner::before,
    .spinner::after {
      content: '';
      position: absolute;
      width: 8px;
      height: 8px;
      background: var(--color-primary);
      border-radius: 50%;
      animation: routeDot 2s infinite;
    }

    .spinner::before {
      left: 2px;
      animation-delay: -0.67s;
    }

    .spinner::after {
      left: 50%;
      transform: translateX(-50%);
      animation-delay: -0.33s;
    }

    .spinner-center {
      position: absolute;
      left: 50%;
      top: 50%;
      transform: translate(-50%, -50%);
      width: 8px;
      height: 8px;
      background: var(--color-accent-violet);
      border-radius: 50%;
      animation: routeDot 2s infinite;
    }

    @keyframes routeDot {
      0%, 100% {
        box-shadow: 0 0 0 rgba(59,130,246,.5);
      }
      50% {
        box-shadow: 0 12px 20px rgba(59,130,246,.3);
      }
    }

    /* Toast Notification System */
    #toast-container {
      position: fixed;
      top: 24px;
      right: 24px;
      z-index: 9999;
      display: flex;
      flex-direction: column;
      gap: 12px;
      pointer-events: none;
    }

    .toast {
      display: flex;
      align-items: center;
      gap: 12px;
      padding: 14px 18px;
      background: linear-gradient(135deg, rgba(241,245,249,.98) 0%, rgba(241,245,249,.96) 100%);
      border: 1px solid var(--color-border);
      border-radius: 12px;
      color: var(--color-text-primary);
      font-size: 14px;
      font-weight: 500;
      box-shadow: 0 12px 32px rgba(0,0,0,.08);
      backdrop-filter: blur(var(--blur-sm));
      -webkit-backdrop-filter: blur(var(--blur-sm));
      animation: toastSlideIn 0.3s ease-out;
      pointer-events: all;
    }

    .toast.success {
      border-left: 3px solid var(--color-accent-emerald);
    }

    .toast.error {
      border-left: 3px solid #ef4444;
    }

    .toast.info {
      border-left: 3px solid var(--color-primary);
    }

    @keyframes toastSlideIn {
      from {
        transform: translateX(400px);
        opacity: 0;
      }
      to {
        transform: translateX(0);
        opacity: 1;
      }
    }

    @keyframes toastSlideOut {
      to {
        transform: translateX(400px);
        opacity: 0;
      }
    }

    .toast.removing {
      animation: toastSlideOut 0.3s ease-in forwards;
    }

    /* Custom Scrollbar */
    ::-webkit-scrollbar {
      width: 6px;
      height: 6px;
    }

    ::-webkit-scrollbar-track {
      background: transparent;
    }

    ::-webkit-scrollbar-thumb {
      background: rgba(96,165,250,.3);
      border-radius: 999px;
      transition: background 0.2s;
    }

    ::-webkit-scrollbar-thumb:hover {
      background: rgba(96,165,250,.5);
    }

    /* Leaflet Popup Override */
    .leaflet-popup-content-wrapper {
      background: linear-gradient(135deg, rgba(241,245,249,.98) 0%, rgba(241,245,249,.96) 100%);
      border: 1px solid var(--color-border);
      border-radius: 12px;
      box-shadow: 0 12px 32px rgba(0,0,0,.1);
      backdrop-filter: blur(var(--blur-sm));
      -webkit-backdrop-filter: blur(var(--blur-sm));
    }

    .leaflet-popup-tip {
      background: rgba(241,245,249,.96);
      border: 1px solid var(--color-border);
    }

    .leaflet-popup-content {
      margin: 0;
      padding: 14px 16px;
      color: var(--color-text-primary);
      font-size: 13px;
      line-height: 1.45;
      min-width: 260px;
      max-width: 340px;
      max-height: 55vh;
      overflow-y: auto;
      scrollbar-width: thin;
      scrollbar-color: rgba(96,165,250,.3) transparent;
    }
    .leaflet-popup-content::-webkit-scrollbar { width: 4px; }
    .leaflet-popup-content::-webkit-scrollbar-thumb { background: rgba(96,165,250,.3); border-radius: 4px; }
    .leaflet-popup-content::-webkit-scrollbar-track { background: transparent; }
    .leaflet-popup-content strong {
      font-size: 15px;
      font-weight: 700;
      display: block;
      margin-bottom: 4px;
      color: #1e293b;
    }
    .leaflet-popup-content em {
      color: #64748b;
      font-style: normal;
      font-weight: 600;
      font-size: 11px;
      text-transform: uppercase;
      letter-spacing: 0.3px;
    }
    .leaflet-popup-content a {
      color: #2563eb;
    }
    .leaflet-popup-content a:hover {
      color: #1d4ed8;
    }

    .leaflet-control-zoom a,
    .leaflet-bar a {
      background: rgba(241,245,249,.96) !important;
      color: var(--color-text-primary) !important;
      border-bottom: 1px solid var(--color-border) !important;
      transition: all 0.2s !important;
    }

    .leaflet-control-zoom a:hover,
    .leaflet-bar a:hover {
      background: var(--color-bg-card-hover) !important;
      color: var(--color-primary) !important;
    }

    /* Glassmorphism v2 - Better depth and effects */
    .glass-card {
      background: linear-gradient(135deg, rgba(241,245,249,.98) 0%, rgba(241,245,249,.94) 100%);
      border: 1px solid rgba(96,165,250,.2);
      border-radius: 16px;
      backdrop-filter: blur(var(--blur-md));
      -webkit-backdrop-filter: blur(var(--blur-md));
      box-shadow:
        0 8px 32px rgba(0,0,0,.06),
        inset 0 1px 0 rgba(255,255,255,.5);
      transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
    }

    .glass-card:hover {
      border-color: rgba(96,165,250,.35);
      box-shadow:
        0 16px 48px rgba(59,130,246,.2),
        inset 0 1px 0 rgba(255,255,255,.15);
    }

    /* Empty State */
    .empty-state {
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
      gap: 12px;
      padding: 40px 20px;
      text-align: center;
      color: var(--color-text-muted);
    }

    .empty-state-icon {
      width: 64px;
      height: 64px;
      margin-bottom: 8px;
      opacity: 0.5;
    }

    .empty-state-title {
      font-size: 16px;
      font-weight: 600;
      color: var(--color-text-secondary);
      margin-bottom: 4px;
    }

    .empty-state-message {
      font-size: 13px;
      line-height: 1.5;
      max-width: 280px;
    }

    /* Share Menu Slide-in */
    .share-menu-backdrop {
      position: fixed;
      inset: 0;
      background: rgba(0,0,0,.2);
      backdrop-filter: blur(4px);
      z-index: 100;
      animation: fadeIn 0.2s ease-out;
    }

    @keyframes fadeIn {
      from { opacity: 0; }
      to { opacity: 1; }
    }

    .share-menu-panel {
      position: fixed;
      right: 0;
      top: 0;
      bottom: 0;
      width: 360px;
      background: linear-gradient(180deg, rgba(241,245,249,.98) 0%, rgba(241,245,249,.96) 100%);
      border-left: 1px solid var(--color-border);
      z-index: 101;
      padding: 24px;
      overflow-y: auto;
      animation: slideInRight 0.3s cubic-bezier(0.4, 0, 0.2, 1);
    }

    @keyframes slideInRight {
      from {
        transform: translateX(100%);
        opacity: 0;
      }
      to {
        transform: translateX(0);
        opacity: 1;
      }
    }

    @media (max-width: 640px) {
      .share-menu-panel {
        width: 100%;
      }
    }

    /* Timeline Container */
    .timeline-container {
      position: relative;
    }

    .timeline-line {
      position: absolute;
      left: 8px;
      top: 32px;
      bottom: 0;
      width: 2px;
      background: linear-gradient(180deg, var(--color-primary), transparent);
    }

    .input-icon {
      position: absolute;
      left: 12px;
      top: 50%;
      transform: translateY(-50%);
      font-size: 16px;
      line-height: 1;
      z-index: 2;
    }

    .input-icon.text-emerald-500 {
      color: var(--color-accent-emerald);
    }

    .input-icon.text-rose-500 {
      color: #f43f5e;
    }

    .input-icon.text-gray-400 {
      color: var(--color-text-muted);
    }

    /* Buttons */
    button {
      min-height: 44px;
    }

    input {
      min-height: 48px;
    }

    @media (max-width: 768px) {
      button {
        min-height: 44px;
      }
      input {
        min-height: 48px;
      }
    }

    /* Route builder card */
    .route-builder-card {
      box-shadow: inset 0 1px 0 rgba(255,255,255,.5), 0 18px 35px rgba(0,0,0,.06);
    }

    /* Share button */
    .btn-share {
      display: inline-flex;
      align-items: center;
      gap: 8px;
      padding: 10px 16px;
      background: linear-gradient(135deg, rgba(59,130,246,.2) 0%, rgba(167,139,250,.15) 100%);
      border: 1px solid rgba(96,165,250,.3);
      border-radius: 10px;
      color: var(--color-primary);
      font-size: 13px;
      font-weight: 600;
      cursor: pointer;
      transition: all 0.2s;
    }

    .btn-share:hover {
      border-color: rgba(96,165,250,.5);
      background: linear-gradient(135deg, rgba(59,130,246,.3) 0%, rgba(167,139,250,.25) 100%);
      box-shadow: 0 8px 16px rgba(59,130,246,.15);
    }

    @keyframes pulse {
      0%, 100% { opacity: 1; }
      50% { opacity: 0.5; }
    }

    /* Toast slide-in */
    @keyframes slideIn {
      from { transform: translateX(100%); opacity: 0; }
      to { transform: translateX(0); opacity: 1; }
    }

    /* Autocomplete loading spinner */
    .input-loading-spinner {
      position: absolute;
      right: 12px;
      top: 50%;
      transform: translateY(-50%);
      width: 18px; height: 18px;
      border: 2px solid rgba(96,165,250,.2);
      border-top-color: #2563eb;
      border-radius: 50%;
      animation: spin .6s linear infinite;
    }
    @keyframes spin { to { transform: translateY(-50%) rotate(360deg); } }

    /* Popup loading skeleton */
    @keyframes shimmer {
      0% { background-position: -200px 0; }
      100% { background-position: 200px 0; }
    }
    .popup-skeleton {
      height: 12px;
      border-radius: 6px;
      background: linear-gradient(90deg, rgba(241,245,249,.6) 25%, rgba(248,250,252,.4) 50%, rgba(241,245,249,.6) 75%);
      background-size: 400px 100%;
      animation: shimmer 1.2s ease infinite;
      margin: 6px 0;
    }

    /* Delete confirm overlay */
    .delete-confirm-wrap {
      position: absolute;
      inset: 0;
      background: rgba(241,245,249,.92);
      backdrop-filter: blur(6px);
      display: flex;
      align-items: center;
      justify-content: center;
      gap: 8px;
      border-radius: inherit;
      z-index: 5;
      padding: 8px;
    }
    .delete-confirm-wrap span {
      font-size: 12px;
      font-weight: 600;
      color: #f87171;
    }
    .delete-confirm-wrap button {
      padding: 6px 14px;
      border-radius: 8px;
      font-size: 12px;
      font-weight: 700;
      border: none;
      cursor: pointer;
      min-height: 32px;
    }

    /* Utility animations */
    .transition-all {
      transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
    }

    .transition-opacity {
      transition: opacity 0.2s;
    }

    @media (max-width: 640px) {
      #app-wrapper {
        padding: 8px 0 0;
      }

      .left-menu {
        border-radius: 24px;
        padding: 20px;
      }

      .bundle-grid {
        grid-template-columns: repeat(3, 1fr);
      }

      #toast-container {
        top: auto;
        bottom: 24px;
        right: 12px;
        left: 12px;
      }

      .toast {
        width: 100%;
      }

      /* ── Mobile compact: icon-only tabs ── */
      .top-menu-strip {
        gap: 4px;
        margin-bottom: 6px;
        padding-bottom: 6px;
        flex-wrap: nowrap !important;
        overflow: hidden !important;
        width: 100%;
        box-sizing: border-box;
      }
      .menu-icon-btn {
        padding: 6px;
        min-height: 36px;
        min-width: 0;
        width: 36px;
        border-radius: 10px;
        flex-shrink: 1;
      }
      .menu-emoji {
        font-size: 16px;
      }
      .tab-label {
        display: none !important;
      }
      .menu-right-group {
        gap: 4px !important;
        margin-left: auto;
        flex-shrink: 0;
      }
      .menu-pill-badge {
        top: -4px;
        right: -4px;
        font-size: 9px;
        min-width: 16px;
        height: 16px;
        line-height: 16px;
        padding: 0 4px;
      }

      /* ── Stats row compact inline ── */
      .stats-row {
        gap: 6px;
        margin-bottom: 10px;
      }
      .stat-pill {
        flex-direction: row;
        gap: 5px;
        padding: 5px 10px;
        align-items: center;
        border-radius: 999px;
      }
      .stat-pill span {
        font-size: 10px;
      }
      .stat-pill strong {
        font-size: 11px;
      }

      /* ── Hide login hint on mobile ── */
      .login-hint {
        display: none;
      }

      /* ── Bottom sheet content: single vertical scroller only ── */
      .bottom-sheet-content {
        padding: 10px 12px;
        overflow-y: auto;
        overflow-x: hidden !important;
        -webkit-overflow-scrolling: touch;
        max-width: 100vw;
        box-sizing: border-box;
      }
      .left-menu {
        overflow-x: hidden !important;
        max-width: 100vw;
      }

      /* ── Fix dropdowns on mobile ── */
      .save-dropdown {
        position: fixed;
        bottom: auto;
        top: auto;
        right: 16px;
        left: 16px;
        width: auto;
        max-height: 60vh;
        overflow-y: auto;
      }
    }
  </style>
</head>
<body><script>window.TTB_USER = {"loggedIn":false,"ajaxUrl":"https:\/\/tantrummingtrailblazers.com\/wp-admin\/admin-ajax.php","nonce":"001545ea6c"};</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="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>
              <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>

            <!-- 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 hover:border-blue-500 cursor-pointer group"
                  style="padding: 14px 16px;"
                  @click="panToPoi(p)">
                  <div style="display:flex; gap:14px; 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 style="font-weight:700; font-size:14px; color:var(--color-text-primary); margin-bottom:4px;" class="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">
                          <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'">
                          {{ 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">
                          {{ 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">
                    <span 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">
                      <div 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>
                  </div>
                  <button @click.stop="confirmDeleteIndex = (confirmDeleteIndex === i ? -1 : i)" class="text-gray-500 hover:text-red-400 p-1 transition flex-shrink-0" 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 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"><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>

            <!-- 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>
  </div>
</div>
</div>

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

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

<script src="https://tantrummingtrailblazers.com/wp-content/plugins/make%20drive%20fun2//app1_with_share1w33222aaa.js?v=1778246761"></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>
    </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&#038;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>
  </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>
