D
Digmarket. Preview
Navigation
Home Free

Travel Route Tracker – Sky Claymorphism

<div class="fp-travel-hospitality-route-tracker-ui">
    <div class="fp-travel-hospitality-route-tracker-ui-stage">
        
        <div class="fp-travel-hospitality-route-tracker-ui-radial"></div>

        <div class="fp-travel-hospitality-route-tracker-ui-card">
            
            <div class="fp-travel-hospitality-route-tracker-ui-header">
                <span class="fp-travel-hospitality-route-tracker-ui-title">Airport Shuttle</span>
                <span class="fp-travel-hospitality-route-tracker-ui-badge" id="fp-travel-hospitality-route-tracker-ui-status">TRACKING</span>
            </div>

            <div class="fp-travel-hospitality-route-tracker-ui-map">
                <svg class="fp-travel-hospitality-route-tracker-ui-svg" viewBox="0 0 100 100" preserveAspectRatio="none">
                    <path class="fp-travel-hospitality-route-tracker-ui-path-bg" d="M 15 85 L 45 60 L 35 25 L 85 15"></path>
                    <path class="fp-travel-hospitality-route-tracker-ui-path-trace" id="fp-travel-hospitality-route-tracker-ui-trace" d="M 15 85 L 45 60 L 35 25 L 85 15"></path>
                </svg>
                <div class="fp-travel-hospitality-route-tracker-ui-node" style="left: 15%; top: 85%;" id="fp-travel-hospitality-route-tracker-ui-n1"></div>
                <div class="fp-travel-hospitality-route-tracker-ui-node" style="left: 45%; top: 60%;" id="fp-travel-hospitality-route-tracker-ui-n2"></div>
                <div class="fp-travel-hospitality-route-tracker-ui-node" style="left: 35%; top: 25%;" id="fp-travel-hospitality-route-tracker-ui-n3"></div>
                <div class="fp-travel-hospitality-route-tracker-ui-node" style="left: 85%; top: 15%;" id="fp-travel-hospitality-route-tracker-ui-n4"></div>
                
                <div class="fp-travel-hospitality-route-tracker-ui-shuttle" id="fp-travel-hospitality-route-tracker-ui-shuttle"></div>
            </div>

            <div class="fp-travel-hospitality-route-tracker-ui-footer">
                <div class="fp-travel-hospitality-route-tracker-ui-stat">
                    <span class="fp-travel-hospitality-route-tracker-ui-stat-lbl">TIME TO HOTEL</span>
                    <span class="fp-travel-hospitality-route-tracker-ui-stat-val" id="fp-travel-hospitality-route-tracker-ui-eta">12 MIN</span>
                </div>
                <div class="fp-travel-hospitality-route-tracker-ui-stat" style="text-align: right;">
                    <span class="fp-travel-hospitality-route-tracker-ui-stat-lbl">DISTANCE</span>
                    <span class="fp-travel-hospitality-route-tracker-ui-stat-val" id="fp-travel-hospitality-route-tracker-ui-dist">4.2 KM</span>
                </div>
            </div>

        </div>

    </div>
</div>
.fp-travel-hospitality-route-tracker-ui {
    /* ━━━━━━━━━━━━━━━━━━
       LAYOUT & SIZING SYSTEM
       ━━━━━━━━━━━━━━━━━━ */
    --fp-container-width: 100%;
    --fp-max-width: 500px;
    --fp-aspect-ratio: 1 / 1;

    /* ━━━━━━━━━━━━━━━━━━
       COLOR SYSTEM (Sky Claymorphism)
       ━━━━━━━━━━━━━━━━━━ */
    --fp-primary-color: #FFFFFF; /* Putih Bersih (Pure White Stage) */
    --fp-secondary-color: #F0F6FC; /* Soft Sky Clay Base */
    --fp-muted-color: #94A3B8; /* Slate 400 Muted */
    --fp-soft-color: #0F172A; /* Hitam (Black Text) */
    --fp-background-color: transparent;

    --fp-info-color: #E0F2FE; /* Sky 100 */
    --fp-warning-color: #7DD3FC; /* Sky 300 */
    --fp-danger-color: #0284C7; /* Sky 600 */
    --fp-accent-color: #0EA5E9; /* Biru Langit Ceria (Sky 500 Accent) */

    /* Semantic Clay Shadows (No HEX/RGB in CSS body) */
    --fp-shadow-light: #FFFFFF;
    --fp-shadow-dark: #D4E1F0;
    --fp-shadow-accent: #BAE6FD;

    width: var(--fp-container-width);
    max-width: var(--fp-max-width);
    margin: 0 auto;
    position: relative;
    background-color: var(--fp-background-color);
    box-sizing: border-box;
    font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
    color: var(--fp-soft-color);
}

.fp-travel-hospitality-route-tracker-ui * {
    box-sizing: border-box;
}

/* ━━━━━━━━━━━━━━━━━━
   STAGE
   ━━━━━━━━━━━━━━━━━━ */
.fp-travel-hospitality-route-tracker-ui-stage {
    width: 100%;
    aspect-ratio: var(--fp-aspect-ratio);
    background-color: var(--fp-primary-color);
    position: relative;
    overflow: hidden;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 32px;
    /* Inner stage shadow for depth */
    box-shadow: inset 0 0 40px var(--fp-shadow-dark);
}

/* ━━━━━━━━━━━━━━━━━━
   LAYER 2: ROTATIONAL SUNBURST
   ━━━━━━━━━━━━━━━━━━ */
.fp-travel-hospitality-route-tracker-ui-radial {
    position: absolute;
    width: 150%;
    aspect-ratio: 1 / 1;
    background: repeating-conic-gradient(
        var(--fp-info-color) 0deg 15deg,
        var(--fp-primary-color) 15deg 30deg
    );
    top: 50%;
    left: 50%;
    opacity: 0.4;
    /* Layer 2: Continuous Rotation */
    animation: fp-travel-hospitality-route-tracker-ui-spin 40s linear infinite;
    z-index: 0;
    pointer-events: none;
    transform-origin: center center;
    transform: translate(-50%, -50%);
}

@keyframes fp-travel-hospitality-route-tracker-ui-spin {
    0% { transform: translate(-50%, -50%) rotate(0deg); }
    100% { transform: translate(-50%, -50%) rotate(360deg); }
}

/* ━━━━━━━━━━━━━━━━━━
   LAYER 1: CLAYMORPHIC CARD (BREATHING)
   ━━━━━━━━━━━━━━━━━━ */
.fp-travel-hospitality-route-tracker-ui-card {
    position: relative;
    z-index: 2;
    width: 80%;
    height: 80%;
    background-color: var(--fp-secondary-color);
    border-radius: 36px;
    padding: 24px;
    display: flex;
    flex-direction: column;
    /* Claymorphism Dual Shadows */
    box-shadow: 
        16px 16px 32px var(--fp-shadow-dark), 
        -16px -16px 32px var(--fp-shadow-light),
        inset 6px 6px 12px var(--fp-shadow-light),
        inset -6px -6px 12px var(--fp-shadow-dark);
    /* Layer 1: Base Breathing */
    animation: fp-travel-hospitality-route-tracker-ui-breathe 5s ease-in-out infinite alternate;
    transition: box-shadow 0.3s ease, transform 0.3s ease;
}

@keyframes fp-travel-hospitality-route-tracker-ui-breathe {
    0% { transform: translateY(0); }
    100% { transform: translateY(-6px); }
}

/* Header */
.fp-travel-hospitality-route-tracker-ui-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 20px;
}

.fp-travel-hospitality-route-tracker-ui-title {
    font-size: 1rem;
    font-weight: 800;
    letter-spacing: -0.02em;
    color: var(--fp-soft-color);
}

.fp-travel-hospitality-route-tracker-ui-badge {
    font-size: 0.65rem;
    font-weight: 800;
    padding: 6px 12px;
    border-radius: 12px;
    background-color: var(--fp-secondary-color);
    color: var(--fp-accent-color);
    box-shadow: 
        4px 4px 8px var(--fp-shadow-dark), 
        -4px -4px 8px var(--fp-shadow-light);
    text-transform: uppercase;
    letter-spacing: 0.05em;
    transition: all 0.3s ease;
}

/* Map Area */
.fp-travel-hospitality-route-tracker-ui-map {
    flex-grow: 1;
    position: relative;
    background-color: var(--fp-info-color);
    border-radius: 20px;
    box-shadow: 
        inset 8px 8px 16px var(--fp-shadow-dark),
        inset -8px -8px 16px var(--fp-shadow-light);
    overflow: hidden;
    margin-bottom: 20px;
}

.fp-travel-hospitality-route-tracker-ui-svg {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    z-index: 1;
}

.fp-travel-hospitality-route-tracker-ui-path-bg {
    fill: none;
    stroke: var(--fp-shadow-light);
    stroke-width: 6;
    stroke-linecap: round;
    stroke-linejoin: round;
}

.fp-travel-hospitality-route-tracker-ui-path-trace {
    fill: none;
    stroke: var(--fp-accent-color);
    stroke-width: 6;
    stroke-linecap: round;
    stroke-linejoin: round;
    transition: stroke-dashoffset 0.1s linear;
}

/* Nodes */
.fp-travel-hospitality-route-tracker-ui-node {
    position: absolute;
    width: 16px;
    height: 16px;
    background-color: var(--fp-secondary-color);
    border: 3px solid var(--fp-primary-color);
    border-radius: 50%;
    transform: translate(-50%, -50%);
    z-index: 2;
    box-shadow: 2px 2px 4px var(--fp-shadow-dark);
    transition: all 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
}

.fp-travel-hospitality-route-tracker-ui-node.fp-active {
    background-color: var(--fp-accent-color);
    border-color: var(--fp-info-color);
    transform: translate(-50%, -50%) scale(1.4);
    box-shadow: 0 0 12px var(--fp-shadow-accent);
}

/* Shuttle Bus */
.fp-travel-hospitality-route-tracker-ui-shuttle {
    position: absolute;
    width: 28px;
    height: 14px;
    background-color: var(--fp-accent-color);
    border: 2px solid var(--fp-primary-color);
    border-radius: 12px;
    z-index: 3;
    box-shadow: 4px 4px 8px var(--fp-shadow-dark);
    transition: left 0.1s linear, top 0.1s linear, transform 0.1s linear;
}

/* Shuttle Window */
.fp-travel-hospitality-route-tracker-ui-shuttle::after {
    content: '';
    position: absolute;
    top: 2px;
    right: 4px;
    bottom: 2px;
    width: 8px;
    background-color: var(--fp-info-color);
    border-radius: 2px;
}

/* Footer Stats */
.fp-travel-hospitality-route-tracker-ui-footer {
    display: flex;
    justify-content: space-between;
    align-items: center;
}

.fp-travel-hospitality-route-tracker-ui-stat {
    display: flex;
    flex-direction: column;
    gap: 2px;
}

.fp-travel-hospitality-route-tracker-ui-stat-lbl {
    font-size: 0.65rem;
    font-weight: 700;
    color: var(--fp-muted-color);
    text-transform: uppercase;
    letter-spacing: 0.05em;
}

.fp-travel-hospitality-route-tracker-ui-stat-val {
    font-size: 1.25rem;
    font-weight: 900;
    color: var(--fp-soft-color);
    line-height: 1;
    font-family: ui-monospace, "Cascadia Code", monospace;
}

/* ━━━━━━━━━━━━━━━━━━
   LAYER 3: REACTIVE SPIKE (NODE REACHED)
   ━━━━━━━━━━━━━━━━━━ */
.fp-travel-hospitality-route-tracker-ui-stage.fp-spike .fp-travel-hospitality-route-tracker-ui-card {
    box-shadow: 
        16px 16px 32px var(--fp-shadow-accent), 
        -16px -16px 32px var(--fp-shadow-light),
        inset 6px 6px 12px var(--fp-shadow-light),
        inset -6px -6px 12px var(--fp-shadow-accent);
}

.fp-travel-hospitality-route-tracker-ui-stage.fp-spike .fp-travel-hospitality-route-tracker-ui-badge {
    background-color: var(--fp-accent-color);
    color: var(--fp-primary-color);
    box-shadow: 
        4px 4px 8px var(--fp-shadow-accent), 
        -4px -4px 8px var(--fp-shadow-light);
}

.fp-travel-hospitality-route-tracker-ui-stage.fp-spike .fp-travel-hospitality-route-tracker-ui-stat-val {
    color: var(--fp-accent-color);
}

/* Responsive */
@media (max-width: 400px) {
    .fp-travel-hospitality-route-tracker-ui-card { width: 90%; height: 90%; padding: 16px; }
    .fp-travel-hospitality-route-tracker-ui-stat-val { font-size: 1.1rem; }
}
(function() {
    const instances = document.querySelectorAll('.fp-travel-hospitality-route-tracker-ui');

    instances.forEach(root => {
        if (root.dataset.fpInitialized) return;
        root.dataset.fpInitialized = 'true';

        const stage = root.querySelector('.fp-travel-hospitality-route-tracker-ui-stage');
        const tracePath = root.querySelector('#fp-travel-hospitality-route-tracker-ui-trace');
        const shuttle = root.querySelector('#fp-travel-hospitality-route-tracker-ui-shuttle');
        const etaEl = root.querySelector('#fp-travel-hospitality-route-tracker-ui-eta');
        const distEl = root.querySelector('#fp-travel-hospitality-route-tracker-ui-dist');
        const statusBadge = root.querySelector('#fp-travel-hospitality-route-tracker-ui-status');
        
        const nodes = [
            root.querySelector('#fp-travel-hospitality-route-tracker-ui-n1'),
            root.querySelector('#fp-travel-hospitality-route-tracker-ui-n2'),
            root.querySelector('#fp-travel-hospitality-route-tracker-ui-n3'),
            root.querySelector('#fp-travel-hospitality-route-tracker-ui-n4')
        ];

        if (!stage || !tracePath || !shuttle || nodes.includes(null)) return;

        const pathLength = tracePath.getTotalLength();
        tracePath.style.strokeDasharray = pathLength;
        tracePath.style.strokeDashoffset = pathLength;

        let rafId;
        let isVisible = true;
        let lastTime = 0;
        
        // Animation State Machine
        let progress = 0; // 0 to 100
        let state = 'MOVING'; // MOVING -> HOLD (Spike) -> MOVING
        let stateTimer = 0;
        let activeNodeIndex = 0;

        // Rough percentage thresholds for nodes based on path geometry
        // M 15 85 L 45 60 L 35 25 L 85 15
        const nodeThresholds = [0, 31, 60, 100]; 
        const maxTime = 12; // 12 mins starting
        const maxDist = 4.2; // 4.2 km starting

        const observer = new IntersectionObserver((entries) => {
            entries.forEach(entry => isVisible = entry.isIntersecting);
        }, { threshold: 0.1 });
        observer.observe(root);

        function triggerSpike(nodeIdx) {
            state = 'HOLD';
            stateTimer = 0;
            
            nodes.forEach(n => n.classList.remove('fp-active'));
            for(let i=0; i<=nodeIdx; i++) {
                nodes[i].classList.add('fp-active');
            }
            
            stage.classList.add('fp-spike');
            
            if(nodeIdx === 3) {
                statusBadge.textContent = "ARRIVED";
                etaEl.textContent = "0 MIN";
                distEl.textContent = "0.0 KM";
            } else {
                statusBadge.textContent = `STOP ${nodeIdx + 1}`;
            }
        }

        function fp_travel_hospitality_route_tracker_ui_loop(timestamp) {
            if (!document.body.contains(root)) {
                cancelAnimationFrame(rafId);
                observer.disconnect();
                return;
            }

            if (document.visibilityState === 'hidden' || !isVisible) {
                lastTime = timestamp;
                rafId = requestAnimationFrame(fp_travel_hospitality_route_tracker_ui_loop);
                return;
            }

            if (!lastTime) lastTime = timestamp;
            const dt = timestamp - lastTime;
            lastTime = timestamp;

            if (state === 'MOVING') {
                // Advance progress (~10s to complete track)
                progress += (100 / 10000) * dt;

                // Check Node Thresholds
                if (activeNodeIndex < nodeThresholds.length - 1 && progress >= nodeThresholds[activeNodeIndex + 1]) {
                    progress = nodeThresholds[activeNodeIndex + 1];
                    activeNodeIndex++;
                    triggerSpike(activeNodeIndex);
                } else if (progress >= 100) {
                    progress = 100;
                    triggerSpike(3);
                }

                // Update UI Stats
                const pctRemaining = 1 - (progress / 100);
                etaEl.textContent = `${Math.ceil(maxTime * pctRemaining)} MIN`;
                distEl.textContent = `${(maxDist * pctRemaining).toFixed(1)} KM`;
                statusBadge.textContent = "EN ROUTE";

            } else if (state === 'HOLD') {
                stateTimer += dt;
                if (stateTimer > 1500) { // Hold spike for 1.5s
                    stage.classList.remove('fp-spike');
                    
                    if (progress >= 100) {
                        // Reset loop
                        if (stateTimer > 3000) { // Extra wait at end
                            progress = 0;
                            activeNodeIndex = 0;
                            nodes.forEach(n => n.classList.remove('fp-active'));
                            nodes[0].classList.add('fp-active');
                            state = 'MOVING';
                        }
                    } else {
                        state = 'MOVING';
                    }
                }
            }

            // Update SVG Path & Shuttle Transform
            const currentLen = (progress / 100) * pathLength;
            tracePath.style.strokeDashoffset = pathLength - currentLen;

            const pt = tracePath.getPointAtLength(currentLen);
            shuttle.style.left = `${pt.x}%`;
            shuttle.style.top = `${pt.y}%`;

            // Calculate Shuttle Rotation
            if (currentLen > 1) {
                const ptPrev = tracePath.getPointAtLength(currentLen - 1);
                const dx = pt.x - ptPrev.x;
                const dy = pt.y - ptPrev.y;
                const angle = Math.atan2(dy, dx) * 180 / Math.PI;
                shuttle.style.transform = `translate(-50%, -50%) rotate(${angle}deg)`;
            } else {
                shuttle.style.transform = `translate(-50%, -50%) rotate(0deg)`;
            }

            rafId = requestAnimationFrame(fp_travel_hospitality_route_tracker_ui_loop);
        }

        // Init Start State
        nodes[0].classList.add('fp-active');
        const startPt = tracePath.getPointAtLength(0);
        shuttle.style.left = `${startPt.x}%`;
        shuttle.style.top = `${startPt.y}%`;
        
        // Kickstart loop
        rafId = requestAnimationFrame(fp_travel_hospitality_route_tracker_ui_loop);
    });
})();
Created by Digital Market Created: Apr 27, 2026 • Updated: Apr 27, 2026

Description

Let us look at the Travel Route Tracker Sky Claymorphism component. This free UI asset provides a modular card system specifically engineered for the travel and hospitality sector. We built this entirely from scratch to handle complex itinerary mapping without the usual framework bloat. You get a sterile DOM structure that integrates cleanly into your existing booking application architecture.

Travel platforms often process heavy streams of live transit data and require absolute reliability during user navigation. Massive client side payloads completely ruin performance metrics when immediate access is needed for a flight connection or hotel route. This component solves that bottleneck directly. By strictly avoiding external libraries like Tailwind, Bootstrap, or GSAP, it keeps your bundle size minimal. This ensures rapid rendering for tourists and travel agents who need to review active transit paths on varying mobile networks.

Technical Architecture & Performance

  • Zero dependency codebase: Built strictly with pure HTML, CSS, and Vanilla JavaScript to keep your front end stack incredibly light.

  • Guaranteed performance metrics: Optimized to help your routing software maintain 90 plus PageSpeed scores and pass Core Web Vitals easily.

  • Safely scoped CSS: All styling is strictly scoped to prevent any class name collisions when you drop these cards into a massive monolithic repository.

  • Sterile DOM markup: Features clean HTML with absolutely no unnecessary wrappers or deep nesting trees to parse.

Design & Aesthetic Impact

The visual direction pairs bright Sky Clean tones with a modern claymorphism design to establish a soft and welcoming environment. This tactile floating aesthetic ensures visual clarity for users interacting with complex travel routes and dense itinerary schedules. For the interaction layer, we implemented custom zig zag path tracing animations. These sharp directional transitions provide clear visual feedback for live flight paths and transit connections without requiring heavy javascript animation scripts. The final result is a clean user interface that looks premium and functions perfectly for strict enterprise travel environments.

Enterprise Use Cases

  • Flight connection dashboards: Display active transit routes and layover details using the card grid so passengers can monitor their journeys quickly.

  • Travel agency itinerary builders: Build a fast rendering routing page where booking agents can organize and review massive datasets of multi city tours within a lightweight interface.

  • Hotel shuttle tracking panels: Create a responsive control layout for hospitality managers to track active transport vehicles and guest arrivals across multiple resort properties.

Technical Details

  • ElementCards
  • IndustryHospitality, Travel
  • StyleClaymorphism (Soft 3D)
  • AnimationZig-Zag
  • ColorBlue
Report Issue

Highlights & Benefits

Copy-Paste Ready

Drop the code straight into your project without configuration.

Zero Dependencies

Built strictly with pure CSS & Vanilla JS for maximum speed.

ADA & WCAG Ready

Constructed with strict adherence to WCAG accessibility standards for perfect contrast and screen-reader support.

Sterile DOM Structure

Utilizes a highly optimized, clean DOM architecture ensuring lightning-fast render and maximum PageSpeed scores.

You need an active subscription or purchase to leave a review for this premium component.

Travel Route Tracker – Sky Claymorphism

Category:

Description

Let us look at the Travel Route Tracker Sky Claymorphism component. This free UI asset provides a modular card system specifically engineered for the travel and hospitality sector. We built this entirely from scratch to handle complex itinerary mapping without the usual framework bloat. You get a sterile DOM structure that integrates cleanly into your existing booking application architecture.

Travel platforms often process heavy streams of live transit data and require absolute reliability during user navigation. Massive client side payloads completely ruin performance metrics when immediate access is needed for a flight connection or hotel route. This component solves that bottleneck directly. By strictly avoiding external libraries like Tailwind, Bootstrap, or GSAP, it keeps your bundle size minimal. This ensures rapid rendering for tourists and travel agents who need to review active transit paths on varying mobile networks.

Technical Architecture & Performance

  • Zero dependency codebase: Built strictly with pure HTML, CSS, and Vanilla JavaScript to keep your front end stack incredibly light.

  • Guaranteed performance metrics: Optimized to help your routing software maintain 90 plus PageSpeed scores and pass Core Web Vitals easily.

  • Safely scoped CSS: All styling is strictly scoped to prevent any class name collisions when you drop these cards into a massive monolithic repository.

  • Sterile DOM markup: Features clean HTML with absolutely no unnecessary wrappers or deep nesting trees to parse.

Design & Aesthetic Impact

The visual direction pairs bright Sky Clean tones with a modern claymorphism design to establish a soft and welcoming environment. This tactile floating aesthetic ensures visual clarity for users interacting with complex travel routes and dense itinerary schedules. For the interaction layer, we implemented custom zig zag path tracing animations. These sharp directional transitions provide clear visual feedback for live flight paths and transit connections without requiring heavy javascript animation scripts. The final result is a clean user interface that looks premium and functions perfectly for strict enterprise travel environments.

Enterprise Use Cases

  • Flight connection dashboards: Display active transit routes and layover details using the card grid so passengers can monitor their journeys quickly.

  • Travel agency itinerary builders: Build a fast rendering routing page where booking agents can organize and review massive datasets of multi city tours within a lightweight interface.

  • Hotel shuttle tracking panels: Create a responsive control layout for hospitality managers to track active transport vehicles and guest arrivals across multiple resort properties.