<?xml version="1.0" encoding="utf-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Walk In Clinic Near Me in North Sacramento</title><link>http://onefatherslove.com/Free_clinic_north_sacramento</link><description></description><language>en-United States</language><generator>TandemServer.org | Tandem Server CMS | Version: 2012.01.03</generator><atom:link href="http://onefatherslove.com/Feed.aspx?ControlId=160" rel="self" type="application/rss+xml" /><item><title>Free Medical Clinic Sacramento Walk in Clinic</title><link>http://onefatherslove.com/article.aspx?ArticleId=54</link><guid isPermaLink="true">http://onefatherslove.com/article.aspx?ArticleId=54</guid><description>&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
    &lt;head&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;ins class="adsbygoogle" style="display: block;" data-ad-format="autorelaxed" data-ad-client="ca-pub-2715944356293930" data-ad-slot="5418742786"&gt;&lt;/ins&gt;
        &lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
        &lt;meta charset="UTF-8" /&gt;
        &lt;meta name="viewport" content="width=device-width,initial-scale=1.0" /&gt;
        &lt;title&gt;Free Walk-In Medical Clinics Sacramento | OneFathersLove&lt;/title&gt;
        &lt;style&gt;
            .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.ofl-wrapper{font-size:24px;line-height:1.6;width:100%;max-width:100%;margin:0;padding:0;font-family:system-ui,-apple-system,sans-serif;color:#111}.ofl-search{text-align:center;margin:35px 0 15px 0}.ofl-search input[type="text"]{font-size:22px;padding:12px;width:60%;max-width:320px;border:2px solid #333}.ofl-search input[type="submit"]{font-size:22px;padding:12px 20px;background:#0056b3;color:#fff;border:none;cursor:pointer;font-weight:bold}.ofl-intro-text{margin-bottom:25px;padding:0 5px;font-size:26px}.ofl-intro-text a{color:#0056b3;text-decoration:underline;font-weight:bold}.ofl-card{background:inherit;border:1px solid #000;border-radius:8px;margin-bottom:25px;width:100%;box-shadow:0 1px 3px rgba(0,0,0,.05);display:flex;flex-direction:column;overflow:hidden}.ofl-card-body{display:flex;padding:15px;gap:15px}.ofl-card-img{width:140px;height:140px;object-fit:cover;flex-shrink:0;align-self:flex-start;border-radius:4px;border:none}.ofl-card-content{flex-grow:1}.ofl-card h3{margin:0 0 5px 0;font-size:30px;line-height:1.2;color:#000;font-weight:bold}.ofl-card p{margin:5px 0;font-size:22px;line-height:1.4;color:#555}.ofl-card .address-line{font-weight:normal;color:#333;font-size:22px;margin-bottom:5px}.ofl-card a{color:#0056b3;text-decoration:underline;font-weight:bold}.ofl-card-footer{background-color:#2e7d32;height:18px;width:100%}@media (prefers-color-scheme:dark){body,.ofl-wrapper{background-color:#121212!important;color:#f1f1f1!important}.ofl-card{background-color:inherit!important;border-color:#fff!important}.ofl-card h3{color:#fff!important}.ofl-card p{color:#ccc!important}.ofl-card .address-line{color:#e0e0e0!important}.ofl-card a,.ofl-intro-text a{color:#6ea8fe!important}.ofl-search input[type="text"]{background-color:#2b2b2b!important;color:#fff!important;border-color:#777!important}.ofl-search input[type="submit"]{background-color:#0d6efd!important;color:#fff!important}.ofl-card-footer{background-color:#1b5e20!important}}
        &lt;/style&gt;
        &lt;script type="application/ld+json"&gt;{"@context":"https://schema.org","@graph":[{"@type":"WebSite","name":"OneFathersLove","alternateName":"Sacramento Community Resource Directory","url":"https://onefatherslove.com","potentialAction":{"@type":"SearchAction","target":"https://onefatherslove.com/pages/search_results?q={search_term}","query-input":"required name=search_term"}},{"@type":"MedicalClinic","name":"Health for All (Formerly Las Palmas Clinic)","address":{"@type":"PostalAddress","streetAddress":"1281 North Avenue","addressLocality":"Sacramento","addressRegion":"CA","postalCode":"95838"},"telephone":"(916) 924-6703","description":"Free walk-in clinic for income-based physicals, immunizations, STD testing for uninsured teens and adults, family planning, and temporary health insurance enrollment for uninsured children.","url":"https://health-forall.org/"},{"@type":"MedicalClinic","name":"Mercy Clinic North Highlands","address":{"@type":"PostalAddress","streetAddress":"6060 Watt Avenue","addressLocality":"North Highlands","addressRegion":"CA","postalCode":"95660"},"telephone":"(916) 924-6703","description":"Free medical clinic and health services by appointment. No fee, no co-pay healthcare."},{"@type":"MedicalClinic","name":"Mercy Clinic Folsom","address":{"@type":"PostalAddress","streetAddress":"105 Dean Way","addressLocality":"Folsom","addressRegion":"CA","postalCode":"95630"},"telephone":"(916) 983-3658","description":"FREE medical clinic in Folsom that does not require health insurance. Offers free and low-cost preventive and primary healthcare services."},{"@type":"MedicalClinic","name":"Bayanihan Clinic","address":{"@type":"PostalAddress","streetAddress":"1281 North Avenue","addressLocality":"Sacramento","addressRegion":"CA","postalCode":"95838"},"telephone":["(916) 448-6553","(916) 833-1112"],"description":"Free clinic open on Saturdays serving the uninsured and Filipino community. Call for appointments; limited walk-ins accepted."}]}&lt;/script&gt;
        &lt;div class="ofl-wrapper"&gt;&lt;main&gt;
        &lt;div class="ofl-intro-text"&gt;
        &lt;p&gt;Two free walk-in clinics in Sacramento for people without health insurance in North Highlands and North Sacramento. Please see our &lt;a rel="noopener" href="https://onefatherslove.com/Emergency_room_clinic_24_center_in_sacramento" target="_blank"&gt;24-hour Emergency Rooms&lt;/a&gt; for immediate assistance.&lt;/p&gt;
        &lt;/div&gt;
        &lt;article class="ofl-card"&gt;
        &lt;div class="ofl-card-body"&gt;&lt;img src="Files/Image/Health%20for%20All.png" alt="Health for All North Sacramento logo" class="ofl-card-img" /&gt;
        &lt;div class="ofl-card-content"&gt;
        &lt;h3&gt;Health for All (Formerly Las Palmas Clinic)&lt;/h3&gt;
        &lt;div class="address-line"&gt;1281 North Avenue, Sacramento, CA 95838 (&lt;a rel="noopener" href="https://www.google.com/maps/search/?api=1&amp;amp;query=1281+North+Avenue%2C+Sacramento%2C+CA+95838" target="_blank" aria-label="Map to Health for All"&gt;Map&lt;/a&gt;)&lt;/div&gt;
        &lt;p&gt;&lt;strong&gt;Phone:&lt;/strong&gt; &lt;a href="tel:9169246703"&gt;(916) 924-6703&lt;/a&gt;&lt;/p&gt;
        &lt;p&gt;&lt;strong&gt;Hours:&lt;/strong&gt; Mon. &amp;ndash; Fri. 8:00 a.m. &amp;ndash; 4:00 p.m.&lt;/p&gt;
        &lt;p&gt;Free walk-in clinic for income-based physicals, immunizations, STD testing for uninsured teens and adults, family planning, and temporary health insurance enrollment for uninsured children.&lt;/p&gt;
        &lt;/div&gt;
        &lt;/div&gt;
        &lt;div class="ofl-card-footer"&gt;&lt;/div&gt;
        &lt;/article&gt;&lt;article class="ofl-card"&gt;
        &lt;div class="ofl-card-body"&gt;&lt;img src="https://onefatherslove.com/Files/Image/onefatherslove%20small%20logo.jpg" alt="Mercy Clinic North Highlands logo" class="ofl-card-img" /&gt;
        &lt;div class="ofl-card-content"&gt;
        &lt;h3&gt;Mercy Clinic North Highlands&lt;/h3&gt;
        &lt;div class="address-line"&gt;6060 Watt Avenue, North Highlands, CA 95660 (&lt;a rel="noopener" href="https://www.google.com/maps/search/?api=1&amp;amp;query=6060+Watt+Avenue%2C+North+Highlands%2C+CA+95660" target="_blank" aria-label="Map to Mercy Clinic North Highlands"&gt;Map&lt;/a&gt;)&lt;/div&gt;
        &lt;p&gt;&lt;strong&gt;Phone:&lt;/strong&gt; &lt;a href="tel:9169246703"&gt;(916) 924-6703&lt;/a&gt;&lt;/p&gt;
        &lt;p&gt;&lt;strong&gt;Hours:&lt;/strong&gt; Monday &amp;ndash; Thursday 8:30 a.m. &amp;ndash; 4:00 p.m. (located in a bungalow behind SC Joice Elementary School).&lt;/p&gt;
        &lt;p&gt;Free medical clinic and health services by appointment. No fee, no co-pay healthcare.&lt;/p&gt;
        &lt;/div&gt;
        &lt;/div&gt;
        &lt;div class="ofl-card-footer"&gt;&lt;/div&gt;
        &lt;/article&gt;&lt;article class="ofl-card"&gt;
        &lt;div class="ofl-card-body"&gt;&lt;img src="Files/Image/Mercy%20Clinic%20Folsom.jpg" alt="Mercy Clinic Folsom logo" class="ofl-card-img" /&gt;
        &lt;div class="ofl-card-content"&gt;
        &lt;h3&gt;Mercy Clinic Folsom&lt;/h3&gt;
        &lt;div class="address-line"&gt;105 Dean Way, Folsom, CA 95630 (&lt;a rel="noopener" href="https://www.google.com/maps/search/?api=1&amp;amp;query=105+Dean+Way%2C+Folsom%2C+CA+95630" target="_blank" aria-label="Map to Mercy Clinic Folsom"&gt;Map&lt;/a&gt;)&lt;/div&gt;
        &lt;p&gt;&lt;strong&gt;Phone:&lt;/strong&gt; &lt;a href="tel:9169833658"&gt;(916) 983-3658&lt;/a&gt;&lt;/p&gt;
        &lt;p&gt;FREE medical clinic in Folsom that does not require health insurance. Offers free and low-cost preventive and primary healthcare services.&lt;/p&gt;
        &lt;/div&gt;
        &lt;/div&gt;
        &lt;div class="ofl-card-footer"&gt;&lt;/div&gt;
        &lt;/article&gt;&lt;article class="ofl-card"&gt;
        &lt;div class="ofl-card-body"&gt;&lt;img src="https://onefatherslove.com/Files/Image/onefatherslove%20small%20logo.jpg" alt="Bayanihan Clinic logo" class="ofl-card-img" /&gt;
        &lt;div class="ofl-card-content"&gt;
        &lt;h3&gt;Bayanihan Clinic&lt;/h3&gt;
        &lt;div class="address-line"&gt;1281 North Avenue, Sacramento, CA 95838 (&lt;a rel="noopener" href="https://www.google.com/maps/search/?api=1&amp;amp;query=1281+North+Avenue%2C+Sacramento%2C+CA+95838" target="_blank" aria-label="Map to Bayanihan Clinic"&gt;Map&lt;/a&gt;)&lt;/div&gt;
        &lt;p&gt;&lt;strong&gt;Phone:&lt;/strong&gt; &lt;a href="tel:9164486553"&gt;(916) 448-6553&lt;/a&gt; or &lt;a href="tel:9168331112"&gt;(916) 833-1112&lt;/a&gt;&lt;/p&gt;
        &lt;p&gt;&lt;strong&gt;Hours:&lt;/strong&gt; Saturdays 8:00 a.m. &amp;ndash; 2:00 p.m.&lt;/p&gt;
        &lt;p&gt;Free clinic open on Saturdays serving the uninsured and Filipino community. Call for appointments; limited walk-ins accepted.&lt;/p&gt;
        &lt;/div&gt;
        &lt;/div&gt;
        &lt;div class="ofl-card-footer"&gt;&lt;/div&gt;
        &lt;/article&gt;&lt;/main&gt;
        &lt;form action="https://onefatherslove.com/" id="cse-search-box" class="ofl-search" role="search"&gt;
            &lt;input type="hidden" name="cx" value="partner-pub-2715944356293930:8442542794" /&gt;&lt;input type="hidden" name="cof" value="FORID:10" /&gt;&lt;input type="hidden" name="ie" value="UTF-8" /&gt;&lt;label for="ofl-search-input" class="sr-only"&gt;Search Sacramento resources&lt;/label&gt;&lt;input type="text" id="ofl-search-input" name="q" placeholder="Search Sacramento walk-in clinics..." /&gt;&lt;input type="submit" name="sa" value="Search" /&gt;
        &lt;/form&gt;
        &lt;/div&gt;
    &lt;/body&gt;
&lt;/html&gt;
&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"&gt;
&lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
&lt;title&gt;Resource Finder — Scroll Map Prototype&lt;/title&gt;

&lt;link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" /&gt;

&lt;style&gt;
  * {
    box-sizing: border-box;
    margin: 0;
    padding: 0;
  }

  html {
    overscroll-behavior: none;
  }

  body {
    font-family: Verdana, sans-serif;
    background: radial-gradient(
      ellipse at top,
      #1a0a3a 0%,
      #0a0a0a 60%,
      #000 100%
    );
    color: #1a0a3a;
  }

  #s {
    position: relative;
    width: 100%;
    height: 33vh;
    min-height: 33vh;
    overflow: hidden;
  }

  .map {
    position: absolute;
    top: 0;
    left: 0;
    z-index: 10;
    width: 50%;
    height: 33vh;
  }

  #map {
    width: 100%;
    height: 100%;
  }

  .info {
    position: relative;
    left: 50%;
    width: 50%;
    height: 33vh;
    overflow-y: auto;
    overflow-x: hidden;
    padding: 12px 16px;
    display: flex;
    flex-direction: column;
    gap: 8px;
    overscroll-behavior: contain;
  }

  @media (max-width: 800px) {
    .info {
      padding: 8px 10px;
      gap: 6px;
    }
  }

  .panel {
    background: rgba(255, 255, 255, 0.92);
    border-radius: 10px;
    padding: 10px 12px;
    box-shadow: 0 5px 14px rgba(0, 0, 0, 0.25);
    flex-shrink: 0;
  }

  .scroll-spacer {
    height: 500px;
    border-radius: 10px;
    background: repeating-linear-gradient(
      to bottom,
      rgba(255, 255, 255, 0.04) 0px,
      rgba(255, 255, 255, 0.04) 40px,
      transparent 40px,
      transparent 80px
    );
    display: flex;
    align-items: center;
    justify-content: center;
    text-align: center;
    padding: 15px;
    color: rgba(255, 255, 255, 0.3);
    font-size: 10px;
    flex-shrink: 0;
  }

  .sticky-dashboard {
    position: sticky;
    bottom: 0;
    z-index: 20;

    display: flex;
    flex-direction: column;
    gap: 6px;

    padding-top: 8px;
    padding-bottom: 2px;

    background: linear-gradient(
      to bottom,
      rgba(10, 10, 10, 0),
      rgba(10, 10, 10, 0.96) 18%
    );
  }

  .scroll-instruction {
    background: rgba(255, 255, 255, 0.96);
    border-radius: 10px;
    padding: 10px 12px;
    text-align: center;
    font-size: 15px;
    line-height: 1.25;
    font-weight: 800;
    color: #004ecc;
    box-shadow: 0 5px 14px rgba(0, 0, 0, 0.25);
  }

  .dashboard-widget .dash-label {
    font-size: 9px;
    font-weight: 800;
    color: #004ecc;
    text-transform: uppercase;
    letter-spacing: 0.05em;
  }

  .dashboard-widget .dash-time {
    font-size: 18px;
    font-weight: 800;
    margin-top: 2px;
  }

  .dashboard-widget .dash-sub {
    font-size: 10px;
    color: #555;
    margin-top: 4px;
  }

  .dashboard-widget .dash-weather {
    font-size: 11px;
    color: #1a0a3a;
    margin-top: 6px;
    padding-top: 6px;
    border-top: 1px solid rgba(147, 138, 206, 0.3);
    font-weight: 700;
  }

  .calendar-widget .cal-header {
    font-size: 12px;
    font-weight: 800;
    color: #004ecc;
    text-align: center;
    margin-bottom: 5px;
  }

  .calendar-widget .cal-grid {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
    gap: 2px;
    text-align: center;
  }

  .calendar-widget .cal-day-name {
    font-size: 8px;
    font-weight: 800;
    color: #888;
    padding-bottom: 2px;
  }

  .calendar-widget .cal-day {
    font-size: 10px;
    padding: 3px 0;
    border-radius: 4px;
    color: #1a0a3a;
  }

  .calendar-widget .cal-day.today {
    background: #004ecc;
    color: #fff;
    font-weight: 800;
  }

  .calendar-widget .cal-day.empty {
    visibility: hidden;
  }

  .eta-panel {
    font-size: 11px;
    text-align: center;
  }

  .eta-panel.pending {
    color: #666;
    font-style: italic;
  }

  .eta-panel .eta-figure {
    font-size: 14px;
    font-weight: 800;
    color: #1a0a3a;
  }

  .eta-detail {
    margin-top: 3px;
    font-size: 10px;
    color: #555;
  }

  .location-fallback {
    font-size: 11px;
    color: #555;
  }

  .location-fallback input {
    width: 100%;
    margin-top: 5px;
    padding: 6px 8px;
    border: 1px solid #938ACE;
    border-radius: 5px;
    font-size: 12px;
  }

  .location-fallback button {
    margin-top: 5px;
    padding: 6px 12px;
    background: #938ACE;
    color: #fff;
    border: none;
    border-radius: 5px;
    font-weight: 700;
    font-size: 11px;
    cursor: pointer;
  }

  .filler-note {
    font-size: 10px;
    color: #888;
    text-align: center;
    padding: 10px;
    flex-shrink: 0;
  }
&lt;/style&gt;
&lt;/head&gt;

&lt;body&gt;

&lt;section id="s"&gt;

  &lt;div class="map"&gt;
    &lt;div
      id="map"
      role="region"
      aria-label="Route to resource"&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;div class="info" id="info"&gt;

    &lt;div class="scroll-spacer"&gt;
      Scroll up to move your location through the map.
    &lt;/div&gt;

    &lt;div class="sticky-dashboard"&gt;

      &lt;div class="scroll-instruction"&gt;
        Scroll up to move your location through the map.
      &lt;/div&gt;

      &lt;div class="panel dashboard-widget"&gt;

        &lt;div class="dash-label"&gt;
          Today
        &lt;/div&gt;

        &lt;div
          class="dash-time"
          id="dashTime"&gt;
          --:--
        &lt;/div&gt;

        &lt;div class="dash-sub"&gt;
          Your route to the resource
        &lt;/div&gt;

        &lt;div
          class="dash-weather"
          id="dashWeather"&gt;
          Loading weather…
        &lt;/div&gt;

      &lt;/div&gt;

      &lt;div class="panel calendar-widget"&gt;

        &lt;div
          class="cal-header"
          id="calHeader"&gt;
        &lt;/div&gt;

        &lt;div
          class="cal-grid"
          id="calGrid"&gt;
        &lt;/div&gt;

      &lt;/div&gt;

      &lt;div
        class="panel location-fallback"
        id="locationFallback"
        style="display:none;"&gt;

        &lt;div&gt;
          We couldn't get your location.
          Enter your starting address instead:
        &lt;/div&gt;

        &lt;input
          type="text"
          id="manualAddress"
          placeholder="e.g. 500 J St, Sacramento, CA"&gt;

        &lt;button id="manualAddressBtn"&gt;
          Use this address
        &lt;/button&gt;

      &lt;/div&gt;

      &lt;div
        class="panel eta-panel pending"
        id="etaPanel"&gt;

        Allow location access to see how far you are.

      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="filler-note"&gt;
      You've reached the end — the dot should now be at the clinic.
    &lt;/div&gt;

  &lt;/div&gt;
&lt;/section&gt;


&lt;script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"&gt;&lt;/script&gt;

&lt;script&gt;

  /* ============================================================
     RESOURCE LOCATION
  ============================================================ */

  const destination = {
    lat: 38.5816,
    lng: -121.4944,
    name: "WellSpace Health Clinic"
  };


  /* ============================================================
     MAP
  ============================================================ */

  const map = L.map('map', {
    zoomControl: true
  }).setView(
    [destination.lat, destination.lng],
    13
  );


  L.tileLayer(
    'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
    {
      attribution: '© OpenStreetMap contributors'
    }
  ).addTo(map);


  L.marker([
    destination.lat,
    destination.lng
  ])
  .addTo(map)
  .bindPopup(`&lt;b&gt;${destination.name}&lt;/b&gt;`);


  let dotMarker = null;
  let startLatLng = null;


  /* ============================================================
     USER LOCATION DOT
  ============================================================ */

  function placeDot(latlng) {

    if (!dotMarker) {

      dotMarker = L.circleMarker(latlng, {
        radius: 8,
        color: '#fff',
        fillColor: '#007bff',
        fillOpacity: 0.9,
        weight: 3
      })
      .addTo(map)
      .bindPopup("You are here");

    } else {

      dotMarker.setLatLng(latlng);

    }
  }


  /* ============================================================
     CLAMP
  ============================================================ */

  function clamp(value, min, max) {
    return Math.max(min, Math.min(max, value));
  }


  /* ============================================================
     MOVE DOT
     
     0%   = actual user location
     100% = resource location
  ============================================================ */

  function moveDotToProgress(progress) {

    if (!startLatLng) return;

    progress = clamp(progress, 0, 1);

    const lat =
      startLatLng.lat +
      ((destination.lat - startLatLng.lat) * progress);

    const lng =
      startLatLng.lng +
      ((destination.lng - startLatLng.lng) * progress);

    placeDot([lat, lng]);

    updateEta(progress);
  }


  /* ============================================================
     MAP FIT
  ============================================================ */

  function fitToRoute() {

    if (!startLatLng) return;

    const bounds =
      L.latLngBounds([
        startLatLng,
        [
          destination.lat,
          destination.lng
        ]
      ]);

    map.fitBounds(
      bounds,
      {
        padding: [40, 40]
      }
    );
  }


  /* ============================================================
     SCROLL → ROUTE PROGRESS
  ============================================================ */

  const infoPanel =
    document.getElementById('info');


  function updateFromScroll() {

    if (!startLatLng) return;

    const maxScroll =
      infoPanel.scrollHeight -
      infoPanel.clientHeight;

    if (maxScroll &lt;= 0) return;

    const progress =
      clamp(
        infoPanel.scrollTop / maxScroll,
        0,
        1
      );

    moveDotToProgress(progress);
  }


  infoPanel.addEventListener(
    'scroll',
    updateFromScroll,
    {
      passive: true
    }
  );


  /* ============================================================
     DASHBOARD TIME
  ============================================================ */

  function renderClock() {

    document.getElementById('dashTime').textContent =
      new Date().toLocaleTimeString(
        [],
        {
          hour: 'numeric',
          minute: '2-digit'
        }
      );
  }


  renderClock();

  setInterval(renderClock, 30000);


  /* ============================================================
     WEATHER
  ============================================================ */

  const WEATHER_CODES = {

    0: 'Clear sky',
    1: 'Mostly clear',
    2: 'Partly cloudy',
    3: 'Overcast',
    45: 'Fog',
    48: 'Freezing fog',
    51: 'Light drizzle',
    53: 'Drizzle',
    55: 'Heavy drizzle',
    61: 'Light rain',
    63: 'Rain',
    65: 'Heavy rain',
    71: 'Light snow',
    73: 'Snow',
    75: 'Heavy snow',
    80: 'Rain showers',
    81: 'Rain showers',
    82: 'Violent showers',
    95: 'Thunderstorm',
    96: 'Thunderstorm w/ hail',
    99: 'Thunderstorm w/ hail'
  };


  async function loadWeather(lat, lng) {

    const el =
      document.getElementById('dashWeather');

    try {

      const res = await fetch(
        `https://api.open-meteo.com/v1/forecast?latitude=${lat}&amp;longitude=${lng}&amp;current_weather=true&amp;temperature_unit=fahrenheit`
      );

      const data = await res.json();

      const cw = data.current_weather;

      if (!cw) {
        throw new Error('no weather data');
      }

      const desc =
        WEATHER_CODES[cw.weathercode] ||
        'Conditions unavailable';

      el.textContent =
        `${Math.round(cw.temperature)}°F — ${desc}`;

    } catch (e) {

      el.textContent =
        'Weather unavailable right now.';

    }
  }


  loadWeather(
    destination.lat,
    destination.lng
  );


  /* ============================================================
     CALENDAR
  ============================================================ */

  function renderCalendar() {

    const now = new Date();

    const year = now.getFullYear();
    const month = now.getMonth();
    const todayDate = now.getDate();

    const monthNames = [
      'January',
      'February',
      'March',
      'April',
      'May',
      'June',
      'July',
      'August',
      'September',
      'October',
      'November',
      'December'
    ];

    document.getElementById('calHeader').textContent =
      `${monthNames[month]} ${year}`;

    const grid =
      document.getElementById('calGrid');

    grid.innerHTML = '';

    [
      'S',
      'M',
      'T',
      'W',
      'T',
      'F',
      'S'
    ].forEach(d =&gt; {

      const el =
        document.createElement('div');

      el.className =
        'cal-day-name';

      el.textContent = d;

      grid.appendChild(el);

    });

    const firstDayIndex =
      new Date(
        year,
        month,
        1
      ).getDay();

    const daysInMonth =
      new Date(
        year,
        month + 1,
        0
      ).getDate();

    for (
      let i = 0;
      i &lt; firstDayIndex;
      i++
    ) {

      const el =
        document.createElement('div');

      el.className =
        'cal-day empty';

      grid.appendChild(el);

    }

    for (
      let d = 1;
      d &lt;= daysInMonth;
      d++
    ) {

      const el =
        document.createElement('div');

      el.className =
        'cal-day' +
        (d === todayDate ? ' today' : '');

      el.textContent = d;

      grid.appendChild(el);

    }
  }


  renderCalendar();


  /* ============================================================
     DISTANCE + TRAVEL TIME
     
     The prototype uses the actual user location and destination.
     Travel time is estimated from the calculated distance.
  ============================================================ */

  function updateEta(progress) {

    const etaPanel =
      document.getElementById('etaPanel');

    if (!startLatLng) return;

    const destLatLng =
      L.latLng(
        destination.lat,
        destination.lng
      );

    const totalMiles =
      startLatLng.distanceTo(destLatLng)
      / 1609.34;

    const remainingMiles =
      totalMiles * (1 - progress);

    if (progress &gt;= 0.98) {

      etaPanel.classList.remove('pending');

      etaPanel.innerHTML =
        `&lt;span class="eta-figure"&gt;You've arrived&lt;/span&gt;`;

      return;
    }

    /*
      Estimated travel speed for the prototype.
      This keeps the time calculation dynamic as distance changes.
    */

    const estimatedSpeedMph = 30;

    const remainingMinutes =
      (remainingMiles / estimatedSpeedMph) * 60;

    const totalSeconds =
      Math.max(
        1,
        Math.round(remainingMinutes * 60)
      );

    const minutes =
      Math.floor(totalSeconds / 60);

    const seconds =
      totalSeconds % 60;

    const timeText =
      minutes &gt; 0
        ? `${minutes} min ${seconds} sec`
        : `${seconds} sec`;

    etaPanel.classList.remove('pending');

    etaPanel.innerHTML =
      `&lt;span class="eta-figure"&gt;${timeText} to get there&lt;/span&gt;
       &lt;div class="eta-detail"&gt;
         ${remainingMiles.toFixed(1)} mi remaining
       &lt;/div&gt;`;
  }


  /* ============================================================
     SET USER LOCATION
  ============================================================ */

  function setStartLocation(lat, lng) {

    startLatLng =
      L.latLng(lat, lng);

    placeDot(startLatLng);

    infoPanel.scrollTop = 0;

    moveDotToProgress(0);

    fitToRoute();

    updateEta(0);

    loadWeather(
      lat,
      lng
    );
  }


  /* ============================================================
     BROWSER GEOLOCATION
  ============================================================ */

  if ('geolocation' in navigator) {

    navigator.geolocation.getCurrentPosition(

      pos =&gt; {

        setStartLocation(
          pos.coords.latitude,
          pos.coords.longitude
        );

      },

      () =&gt; {

        document.getElementById(
          'locationFallback'
        ).style.display = 'block';

      },

      {
        enableHighAccuracy: true,
        timeout: 10000,
        maximumAge: 300000
      }

    );

  } else {

    document.getElementById(
      'locationFallback'
    ).style.display = 'block';

  }


  /* ============================================================
     MANUAL ADDRESS FALLBACK
  ============================================================ */

  document
    .getElementById('manualAddressBtn')
    .addEventListener(
      'click',
      async () =&gt; {

        const q =
          document
            .getElementById('manualAddress')
            .value
            .trim();

        if (!q) return;

        try {

          const res =
            await fetch(
              `https://nominatim.openstreetmap.org/search?format=json&amp;q=${encodeURIComponent(q)}`
            );

          const results =
            await res.json();

          if (
            results &amp;&amp;
            results[0]
          ) {

            setStartLocation(
              parseFloat(results[0].lat),
              parseFloat(results[0].lon)
            );

            document.getElementById(
              'locationFallback'
            ).style.display = 'none';

          } else {

            alert(
              "Couldn't find that address — try adding city and state."
            );

          }

        } catch (e) {

          alert(
            "Address lookup failed. Check your connection and try again."
          );

        }

      }
    );

&lt;/script&gt;

&lt;/body&gt;
&lt;/html&gt;</description><author>Victor Stark</author><pubDate>2026-09-12T22:32:50</pubDate></item></channel></rss>
