/* ═══ PARTICLE EFFECTS STYLES ═══ */ .particle-container { position: relative; width: 100%; border: 1px solid var(--silver); overflow: hidden; } .particle-container canvas { display: block; } .particle-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--sp-5); } @media (max-width: 768px) { .particle-grid { grid-template-columns: 1fr; } } .particle-card { border: 1px solid var(--silver); overflow: hidden; } .particle-card-label { padding: 12px 16px; border-top: 1px solid var(--silver); background: var(--white); } .particle-card-label h4 { font-family: 'IBM Plex Mono', monospace; font-size: 12px; font-weight: 700; color: var(--cobalt); text-transform: uppercase; letter-spacing: .06em; margin: 0 0 4px; } .particle-card-label p { font-size: var(--text-sm); color: var(--graphite); line-height: 1.5; margin: 0 0 8px; } .copy-config-btn { padding: 5px 12px; background: var(--ice); border: 1px solid var(--silver); font-family: 'IBM Plex Mono', monospace; font-size: 10px; font-weight: 600; color: var(--cobalt); text-transform: uppercase; letter-spacing: .06em; cursor: pointer; transition: background .15s; } .copy-config-btn:hover { background: var(--alice); } .usage-row { display: flex; gap: var(--sp-3); align-items: flex-start; padding: 14px 0; border-bottom: 1px solid var(--fog); } .usage-row:last-child { border-bottom: none; } .usage-badge { flex-shrink: 0; width: 120px; padding: 6px 10px; background: var(--cobalt); color: var(--white); font-family: 'IBM Plex Mono', monospace; font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: .06em; text-align: center; } .perf-table { width: 100%; border-collapse: collapse; font-size: 12px; } .perf-table th { padding: 10px 14px; text-align: left; font-family: 'IBM Plex Mono', monospace; font-weight: 600; color: var(--cobalt); background: var(--ice); border-bottom: 2px solid var(--cobalt); } .perf-table td { padding: 10px 14px; border-bottom: 1px solid var(--fog); } .perf-table tbody tr:nth-child(even) { background: var(--fog); } pre.config-block { margin: 0; padding: 16px; background: var(--fog); border: 1px solid var(--silver); font-family: 'IBM Plex Mono', monospace; font-size: 11px; line-height: 1.7; color: var(--eerie); overflow-x: auto; white-space: pre; } /* ═══ SVG ANIMATIONS STYLES ═══ */ .demo-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(360px, 1fr)); gap: var(--sp-6); } .demo-card { border: 1px solid var(--silver); padding: var(--sp-5); } .demo-card h4 { font-family: 'IBM Plex Mono', monospace; font-size: var(--text-sm); font-weight: 600; color: var(--cobalt); margin-bottom: var(--sp-3); text-transform: uppercase; letter-spacing: 0.05em; } .demo-card .demo-area { min-height: 180px; display: flex; align-items: center; justify-content: center; background: var(--fog); border: 1px solid var(--silver); margin-bottom: var(--sp-3); overflow: hidden; position: relative; } .demo-card .demo-area svg { display: block; } .code-block { background: var(--fog); padding: var(--sp-3); font-family: 'IBM Plex Mono', monospace; font-size: 11px; color: var(--graphite); overflow-x: auto; white-space: pre; line-height: 1.6; border-left: 3px solid var(--cobalt); margin-top: var(--sp-3); max-height: 200px; } .controls { display: flex; gap: var(--sp-2); margin-top: var(--sp-3); } .controls button { font-family: 'IBM Plex Mono', monospace; font-size: 11px; padding: 6px 14px; border: 1px solid var(--cobalt); background: var(--white); color: var(--cobalt); cursor: pointer; transition: all 0.15s; } .controls button:hover { background: var(--cobalt); color: var(--white); } .controls button.active { background: var(--cobalt); color: var(--white); } .input-row { display: flex; gap: var(--sp-2); margin-bottom: var(--sp-3); align-items: center; } .input-row input, .input-row select { font-family: 'IBM Plex Mono', monospace; font-size: 12px; padding: 6px 10px; border: 1px solid var(--silver); background: var(--white); color: var(--cobalt); outline: none; } .input-row input:focus { border-color: var(--tufts); } .input-row label { font-family: 'IBM Plex Mono', monospace; font-size: 11px; color: var(--slate); } .combined-section { border: 1px solid var(--silver); padding: var(--sp-6); margin-bottom: var(--sp-6); } .combined-section h4 { font-family: 'IBM Plex Mono', monospace; font-size: var(--text-sm); font-weight: 600; color: var(--cobalt); margin-bottom: var(--sp-4); text-transform: uppercase; letter-spacing: 0.05em; } .combined-section .demo-area { min-height: 220px; display: flex; align-items: center; justify-content: center; background: var(--fog); border: 1px solid var(--silver); margin-bottom: var(--sp-3); overflow: hidden; position: relative; } .anim-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(360px, 1fr)); gap: var(--sp-6); } .anim-card { border: 1px solid var(--silver); padding: var(--sp-5); } .anim-card h4 { font-family: 'IBM Plex Mono', monospace; font-size: var(--text-sm); font-weight: 600; color: var(--cobalt); margin-bottom: var(--sp-3); text-transform: uppercase; letter-spacing: 0.05em; } .anim-card .demo-area { min-height: 180px; display: flex; align-items: center; justify-content: center; background: var(--fog); border: 1px solid var(--silver); margin-bottom: var(--sp-3); overflow: hidden; position: relative; } .scroll-reveal { opacity: 0; transform: translateY(40px); transition: opacity 0.6s ease, transform 0.6s ease; } .scroll-reveal.visible { opacity: 1; transform: translateY(0); } /* ═══ GENERATIVE ART STYLES ═══ */ /* ── Sketch Grid ── */ .sketch-grid { display: grid; grid-template-columns: 1fr 1fr; gap: var(--sp-5); } .sketch-container { border: 1px solid var(--silver); background: var(--white); } .sketch-header { display: flex; justify-content: space-between; align-items: center; padding: 10px 14px; border-bottom: 1px solid var(--silver); background: var(--ice); } .sketch-title { font-family: 'IBM Plex Mono', monospace; font-size: 11px; font-weight: 600; color: var(--cobalt); letter-spacing: .04em; } .sketch-num { font-family: 'IBM Plex Mono', monospace; font-size: 9px; color: var(--steel); } .sketch-canvas-wrap { display: flex; align-items: center; justify-content: center; background: #F4F9FF; min-height: 300px; } .sketch-canvas-wrap canvas { display: block; } .sketch-footer { display: flex; gap: 6px; padding: 10px 14px; border-top: 1px solid var(--silver); } .sketch-btn { padding: 5px 12px; background: var(--white); border: 1px solid var(--silver); font-family: 'IBM Plex Mono', monospace; font-size: 10px; font-weight: 500; color: var(--cobalt); cursor: pointer; transition: background .15s; } .sketch-btn:hover { background: var(--alice); border-color: var(--tufts); } .sketch-btn.primary { background: var(--cobalt); color: var(--white); border-color: var(--cobalt); } .sketch-btn.primary:hover { background: var(--navy); } /* ── Use Case Grid ── */ .use-case-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--sp-4); } .use-case-card { padding: var(--sp-4); border: 1px solid var(--silver); } .use-case-icon { width: 32px; height: 32px; background: var(--alice); border: 1px solid var(--silver); display: flex; align-items: center; justify-content: center; margin-bottom: var(--sp-3); font-family: 'IBM Plex Mono', monospace; font-size: 14px; color: var(--cobalt); } .use-case-title { font-family: 'IBM Plex Mono', monospace; font-size: 11px; font-weight: 600; color: var(--cobalt); margin-bottom: 4px; } .use-case-desc { font-size: 12px; color: var(--graphite); line-height: 1.5; } /* ── Customization Panel ── */ .custom-panel { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--sp-4); } .custom-card { padding: var(--sp-4); border: 1px solid var(--silver); } .custom-card-title { font-family: 'IBM Plex Mono', monospace; font-size: 11px; font-weight: 600; color: var(--cobalt); margin-bottom: 12px; } .slider-row { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; } .slider-label { font-family: 'IBM Plex Mono', monospace; font-size: 9px; color: var(--slate); width: 60px; flex-shrink: 0; } .slider-val { font-family: 'IBM Plex Mono', monospace; font-size: 9px; color: var(--cobalt); font-weight: 600; width: 28px; text-align: right; flex-shrink: 0; } input[type="range"] { -webkit-appearance: none; appearance: none; width: 100%; height: 4px; background: var(--silver); outline: none; border-radius: 0; } input[type="range"]::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; width: 12px; height: 12px; background: var(--cobalt); cursor: pointer; border-radius: 0; } input[type="range"]::-moz-range-thumb { width: 12px; height: 12px; background: var(--cobalt); cursor: pointer; border: none; border-radius: 0; } .bg-select { width: 100%; padding: 4px 6px; border: 1px solid var(--silver); font-family: 'IBM Plex Mono', monospace; font-size: 10px; color: var(--graphite); background: var(--white); cursor: pointer; outline: none; } @media (max-width: 900px) { .sketch-grid { grid-template-columns: 1fr; } .custom-panel { grid-template-columns: 1fr 1fr; } .use-case-grid { grid-template-columns: 1fr 1fr; } } /* ═══ GENERATIVE PATTERNS STYLES ═══ */ /* ══════════════════════════════════════════════════ SHIPMENT VOLUME GRID ══════════════════════════════════════════════════ */ .volume-grid { display: grid; grid-template-columns: repeat(52, 1fr); gap: 2px; max-width: 100%; } .volume-grid .cell { aspect-ratio: 1; border-radius: 1px; min-width: 0; } .volume-grid .cell.v0 { background: var(--ice); } .volume-grid .cell.v1 { background: var(--alice); } .volume-grid .cell.v2 { background: var(--jordy); } .volume-grid .cell.v3 { background: var(--tufts); } .volume-grid .cell.v4 { background: var(--navy); } .volume-grid .cell.v5 { background: var(--cobalt); } .volume-legend { display: flex; align-items: center; gap: var(--sp-2); margin-top: var(--sp-4); font-family: 'IBM Plex Mono', monospace; font-size: 10px; color: var(--slate); } .volume-legend .swatch { width: 12px; height: 12px; border-radius: 1px; } .volume-day-labels { display: grid; grid-template-rows: repeat(7, 1fr); gap: 2px; font-family: 'IBM Plex Mono', monospace; font-size: 9px; color: var(--steel); letter-spacing: .04em; padding-right: var(--sp-2); } .volume-day-labels span { display: flex; align-items: center; justify-content: flex-end; } .volume-month-labels { display: flex; justify-content: space-between; font-family: 'IBM Plex Mono', monospace; font-size: 9px; color: var(--steel); letter-spacing: .04em; margin-top: var(--sp-1); padding-left: 36px; } /* ══════════════════════════════════════════════════ TEMPERATURE COMPLIANCE ══════════════════════════════════════════════════ */ .temp-strip { display: flex; gap: 1px; height: 40px; overflow: hidden; } .temp-strip .day { flex: 1; min-width: 0; } .temp-strip .day.t100 { background: #0F766E; } .temp-strip .day.t99 { background: #10B981; } .temp-strip .day.t98 { background: #34D399; } .temp-strip .day.t95 { background: #6EE7B7; } .temp-strip .day.t90 { background: #A7F3D0; } .temp-strip .day.t85 { background: #FDE68A; } .temp-strip .day.t80 { background: #FBBF24; } .temp-strip .day.t70 { background: #F59E0B; } .temp-strip .day.t60 { background: #EF4444; } .temp-strip .day.tlow { background: #DC2626; } .temp-legend { display: flex; align-items: center; gap: var(--sp-3); margin-top: var(--sp-3); font-family: 'IBM Plex Mono', monospace; font-size: 10px; color: var(--slate); } .temp-legend .swatch { width: 14px; height: 14px; border-radius: 1px; } .temp-month-ruler { display: flex; justify-content: space-between; font-family: 'IBM Plex Mono', monospace; font-size: 9px; color: var(--steel); letter-spacing: .04em; margin-top: var(--sp-1); } /* ══════════════════════════════════════════════════ ROUTE DENSITY MAP ══════════════════════════════════════════════════ */ .route-map-container { position: relative; width: 100%; aspect-ratio: 2.2 / 1; background: var(--ice); border: 1px solid var(--silver); overflow: hidden; } .route-region { position: absolute; background-image: radial-gradient(circle, var(--cobalt) 1px, transparent 1px); } .route-region.northeast { top: 15%; right: 8%; width: 22%; height: 35%; background-size: 6px 6px; } .route-region.southeast { top: 45%; right: 10%; width: 20%; height: 35%; background-size: 10px 10px; } .route-region.midwest { top: 15%; left: 25%; width: 28%; height: 42%; background-size: 12px 12px; } .route-region.south { top: 50%; left: 28%; width: 25%; height: 32%; background-size: 14px 14px; } .route-region.mountain { top: 18%; left: 12%; width: 16%; height: 45%; background-size: 20px 20px; } .route-region.pacific { top: 15%; left: 2%; width: 12%; height: 55%; background-size: 16px 16px; } .route-label { position: absolute; font-family: 'IBM Plex Mono', monospace; font-size: 9px; letter-spacing: .08em; text-transform: uppercase; color: var(--navy); font-weight: 600; } /* ══════════════════════════════════════════════════ PRODUCT MIX MOSAIC ══════════════════════════════════════════════════ */ .mosaic-grid { display: grid; grid-template-columns: repeat(20, 1fr); gap: 1px; } .mosaic-grid .cell { aspect-ratio: 1; min-width: 0; } .mosaic-grid .cell.cheese { background: #D4A843; } .mosaic-grid .cell.frozen { background: #0F766E; } .mosaic-grid .cell.butter { background: #B8860B; } .mosaic-grid .cell.dairy { background: var(--tufts); } .mosaic-grid .cell.other { background: var(--jordy); } .mosaic-grid .cell.produce { background: #6EE7B7; } .mosaic-grid .cell.protein { background: var(--navy); } .mosaic-legend { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-4); margin-top: var(--sp-4); font-family: 'IBM Plex Mono', monospace; font-size: 10px; color: var(--slate); } .mosaic-legend-item { display: flex; align-items: center; gap: var(--sp-1); } .mosaic-legend-item .swatch { width: 12px; height: 12px; border-radius: 1px; } /* ══════════════════════════════════════════════════ HEARTBEAT PATTERN ══════════════════════════════════════════════════ */ .heartbeat { display: flex; align-items: flex-end; gap: 2px; height: 120px; padding: var(--sp-4) 0; overflow: hidden; } .heartbeat .bar { flex: 1; min-width: 0; background: var(--tufts); border-radius: 1px 1px 0 0; animation: hbeat 8s ease-in-out infinite; transform-origin: bottom; } @keyframes hbeat { 0%, 100% { transform: scaleY(1); } 50% { transform: scaleY(0.3); } } .heartbeat-labels { display: flex; justify-content: space-between; font-family: 'IBM Plex Mono', monospace; font-size: 9px; color: var(--steel); letter-spacing: .04em; margin-top: var(--sp-1); } /* ══════════════════════════════════════════════════ DOCUMENT FINGERPRINT ══════════════════════════════════════════════════ */ .fingerprint-grid { display: grid; grid-template-columns: repeat(20, 1fr); grid-template-rows: repeat(4, 1fr); gap: 2px; width: 180px; } .fingerprint-grid .cell { aspect-ratio: 1; border-radius: 1px; min-width: 0; } .fingerprint-grid .cell.on { background: var(--cobalt); } .fingerprint-grid .cell.off { background: var(--alice); } .fp-container { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--sp-6); } .fp-card { border: 1px solid var(--silver); padding: var(--sp-5); display: flex; flex-direction: column; align-items: center; gap: var(--sp-3); } .fp-card-label { font-family: 'IBM Plex Mono', monospace; font-size: 10px; letter-spacing: .06em; text-transform: uppercase; color: var(--slate); } /* ═══ LOTTIE STYLES ═══ */ .concept-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--sp-4); } @media (max-width: 1024px) { .concept-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } } @media (max-width: 600px) { .concept-grid { grid-template-columns: 1fr; } } .concept-card { border: 1px solid var(--silver); overflow: hidden; } .concept-card-frame { height: 160px; display: flex; align-items: center; justify-content: center; background: var(--ice); position: relative; } .concept-card-body { padding: 14px 16px; border-top: 1px solid var(--silver); } .concept-card-body h4 { font-family: 'IBM Plex Mono', monospace; font-size: 11px; font-weight: 700; color: var(--cobalt); text-transform: uppercase; letter-spacing: .06em; margin: 0 0 6px; } .concept-card-body p { font-size: 12px; color: var(--graphite); line-height: 1.6; margin: 0 0 10px; } .concept-meta { display: flex; gap: var(--sp-3); flex-wrap: wrap; } .concept-tag { padding: 3px 8px; font-family: 'IBM Plex Mono', monospace; font-size: 9px; font-weight: 600; text-transform: uppercase; letter-spacing: .04em; border: 1px solid var(--silver); color: var(--slate); } .concept-tag.duration { background: var(--alice); border-color: var(--jordy); color: var(--cobalt); } .concept-tag.trigger { background: var(--fog); border-color: var(--silver); color: var(--graphite); } .player-demo-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--sp-5); } @media (max-width: 768px) { .player-demo-grid { grid-template-columns: 1fr; } } .player-demo { border: 1px solid var(--silver); padding: 24px; display: flex; flex-direction: column; align-items: center; gap: 16px; } .resource-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--sp-4); } @media (max-width: 768px) { .resource-grid { grid-template-columns: 1fr; } } .resource-card { border: 1px solid var(--silver); padding: 20px; } .resource-card h4 { font-family: 'IBM Plex Mono', monospace; font-size: 11px; font-weight: 700; color: var(--cobalt); text-transform: uppercase; letter-spacing: .06em; margin: 0 0 8px; } .resource-card p { font-size: 12px; color: var(--graphite); line-height: 1.6; margin: 0 0 10px; } .resource-card a { font-family: 'IBM Plex Mono', monospace; font-size: 10px; font-weight: 600; color: var(--tufts); text-decoration: none; text-transform: uppercase; letter-spacing: .06em; } .resource-card a:hover { color: var(--cobalt); } pre.code-block { margin: 0; padding: 16px; background: var(--fog); border: 1px solid var(--silver); font-family: 'IBM Plex Mono', monospace; font-size: 11px; line-height: 1.7; color: var(--eerie); overflow-x: auto; white-space: pre; } .integration-row { display: flex; gap: var(--sp-4); align-items: flex-start; padding: 16px 0; border-bottom: 1px solid var(--fog); } .integration-row:last-child { border-bottom: none; } .integration-icon { flex-shrink: 0; width: 48px; height: 48px; background: var(--ice); border: 1px solid var(--silver); display: flex; align-items: center; justify-content: center; } .integration-before { padding: 3px 8px; font-family: 'IBM Plex Mono', monospace; font-size: 9px; font-weight: 600; text-transform: uppercase; letter-spacing: .04em; background: var(--fog); border: 1px solid var(--silver); color: var(--steel); text-decoration: line-through; } .integration-after { padding: 3px 8px; font-family: 'IBM Plex Mono', monospace; font-size: 9px; font-weight: 600; text-transform: uppercase; letter-spacing: .04em; background: var(--alice); border: 1px solid var(--jordy); color: var(--cobalt); }
← Hub Animations — Motion, Effects, Loaders
v10.0
Animation Library
Brand System v10.0 — Unified Animation Collection
Animations
— Motion,
Effects,
Loaders
Every animation across 8 source pages, unified. Dot-matrix resolvers, CSS loaders, SVG icons, particles, page transitions, micro-interactions, motion principles, generative art, generative patterns, SVG.js/Anime.js demos, and Lottie integration.
The complete GFS motion reference: 105 loaders from the Mega Library, 16 advanced dot-matrix resolvers, tsParticles backgrounds, SVG.js + Anime.js + Rough.js demos, p5.js generative sketches, CSS-only data patterns, Lottie concepts, and the full motion design system with easing tokens, duration tokens, entrance/exit animations, scroll effects, micro-interaction specs, and notification choreography.
Dot-Matrix CSS Loaders SVG Icons Particles Transitions Micro-UX Motion Tokens Generative Lottie
Document ID GFS-2026-ANI
Region Global
Status Active
Version 9.0
Date 05 / 18 / 2026
Sources 8 Pages Merged
Render CSS / JS / SVG / Canvas / p5 / Lottie
Owner Global Food Solutions, Inc.
02 Dot-Matrix Loaders 20 Canvas-Based Resolver Animations
■ Each dot in a 9x9 grid calculated at 60fps via requestAnimationFrame. IntersectionObserver pauses off-screen.
03 CSS-Only Loaders 25 Pure CSS Animations — Zero JavaScript
■ All animations use brand CSS variables. No JavaScript required.
04 SVG Animated Icons 20 Inline SVG Animations with CSS
■ Inline SVG with CSS keyframe animations. No external libraries.
05 Particle Effects 15 JavaScript Canvas Particle Systems
■ Canvas-based particle systems. IntersectionObserver pauses off-screen rendering.
06 Page Transitions 10 CSS Entrance / Reveal Animations
■ Hover each card to trigger the animation. Pure CSS keyframes.
07 Micro-Interactions 15 UI Feedback Animations
■ Small, purposeful animations that provide feedback during user interaction.
08Advanced Dot-Matrix Resolvers16 Mathematical Animation Resolvers
How It Works

Each loader is a 7×7 grid of 49 dots. Every animation frame, a resolver function is called for each dot with its row, column, and elapsed time. The resolver returns a value between 0 and 1 that becomes the dot's opacity. This is not CSS keyframes — it is real-time mathematical computation running at 60 fps via requestAnimationFrame.

Resolver Signature
resolver(row, col, time, totalRows, totalCols) => opacity [0..1]
Mathematical Primitives Used
Math.sin / Math.cos
Periodic oscillation — waves, pulses, breathing
Math.atan2
Angular position — spirals, radar, rotation
Manhattan & Euclidean Distance
Ripples, diamonds, proximity decay
Math.exp (Exponential Decay)
Trail falloff, fade tails, attenuation
Noise Approximation
Layered sin/cos for organic flow fields
09Dot-Matrix Integration GuideUsing Resolvers in GFS Portals

1. Copy the DotMatrixLoader class

The loader class is self-contained. Copy it into your portal's script block or module.

const loader = new DotMatrixLoader(
  document.getElementById('my-loader'),
  // Pick any resolver from above:
  (r, c, t, rows, cols) => {
    const dx = c - cols/2, dy = r - rows/2;
    const dist = Math.sqrt(dx*dx + dy*dy);
    return 0.1 + 0.9 * Math.max(0, Math.sin(dist * 1.5 - t * 4));
  },
  { rows: 7, cols: 7, dotSize: 6, gap: 4, color: '#FFFFFF' }
);

2. Destroy when no longer needed

Call loader.destroy() to cancel the animation frame and clean up DOM nodes.

// In your SPA route teardown or modal close:
loader.destroy();
container.textContent = '';

3. Customize appearance

Adjust grid density, dot size, speed, and color to match your context. The resolver itself is pure math — it knows nothing about styling.

// Larger, slower loader for a full-page loading screen
new DotMatrixLoader(container, resolvers.ripple, {
  rows: 11, cols: 11, dotSize: 10, gap: 6,
  color: '#468BE6', speed: 0.6
});

// Tiny, fast loader for inline status indicators
new DotMatrixLoader(container, resolvers.breathing, {
  rows: 3, cols: 3, dotSize: 4, gap: 3,
  color: '#092F64', speed: 2
});
Performance

requestAnimationFrame + 49 dots = negligible CPU. Each frame performs 49 multiplications and 49 DOM style writes. On modern hardware this is sub-0.1ms per frame. Even 16 loaders running simultaneously (784 dots total) stays well under 1ms per frame — invisible in performance profiling.

Accessibility

All loaders respect prefers-reduced-motion: reduce. When the user has requested reduced motion, all animations freeze at their initial state (t=0) showing a static dot pattern. Each loader container includes role="img" and an aria-label describing the animation.

10Dot-Matrix Resolver ReferenceAll 16 Functions at a Glance
# Name Math Primitives Visual Character
11Motion PrinciplesPurposeful / Swift / Consistent

Three rules govern every animation in the GFS system. If a motion does not satisfy all three, it does not ship.

01Purposeful
Every animation has a reason
Motion communicates change, draws attention, or provides feedback. If removing the animation loses no information, it should not exist.
Press confirms the action
02Swift
Never slow the user down
Animations must complete before the user's next action. Most transitions finish in 200ms. Nothing exceeds 600ms except page-level orchestrations.
Start
End
Hover: 200ms travel
03Consistent
Same easing, everywhere
Every element of the same type uses the same motion curve. Toggles always spring. Entrances always ease-out-expo. Exits always ease-in. No exceptions.
All use spring easing
12Easing Tokens6 Curves / Hover to Play

Six easing curves cover every motion need. Each card shows the bezier curve, a live animation demo (hover to play), and the CSS value. Use exactly these tokens -- never define custom curves.

ease-out-expoPrimary entrance
Primary easing for all entrances
cubic-bezier(0.16, 1, 0.3, 1)
ease-in-outMoving elements
For moving elements between positions
cubic-bezier(0.65, 0, 0.35, 1)
springEmphasis / Delight
For emphasis and delight moments
cubic-bezier(0.34, 1.56, 0.64, 1)
ease-inExits only
For exits only -- accelerates away
cubic-bezier(0.7, 0, 0.84, 0)
linearContinuous motion
For continuous motion (spinners, progress)
linear
stepsDiscrete changes
For discrete state changes (loaders)
steps(6, end)
13Duration Tokens5 Tiers / Hover to Demo

Five duration tiers handle every timing need. Hover each bar to see the duration in action. The bar fills at the specified speed.

Token Value Use Cases Live Demo
--dur-instant 0ms Immediate state changes, color swaps, focus rings
--dur-fast 100ms Button hover, opacity changes, small color transitions
--dur-base 200ms Most transitions: toggles, dropdowns, tab switches, tooltips
--dur-slow 400ms Modal open/close, slide panels, accordion expand, page entrances
--dur-slower 600ms Page-level transitions, staggered list orchestrations, chart reveals
14Entrance Animations8 Patterns / Click to Play

Eight entrance patterns for bringing elements into view. Click "Play" to trigger each animation. All use ease-out-expo timing.

Fade In
GFS
@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }
Slide Up
GFS
@keyframes slideUp { from { opacity:0; translateY(24px); } to { opacity:1; translateY(0); } }
Slide Down
GFS
@keyframes slideDown { from { opacity:0; translateY(-24px); } to { opacity:1; translateY(0); } }
Slide Left
GFS
@keyframes slideLeft { from { opacity:0; translateX(24px); } to { opacity:1; translateX(0); } }
Scale Up
GFS
@keyframes scaleUp { from { opacity:0; scale(0.85); } to { opacity:1; scale(1); } }
Blur In
GFS
@keyframes blurIn { from { opacity:0; blur(8px); } to { opacity:1; blur(0); } }
Stagger In
@keyframes staggerIn { from { opacity:0; translateY(12px); } to { opacity:1; translateY(0); } } /* delay: index * 60ms */
Reveal
REVEAL
@keyframes reveal { from { clip-path: inset(0 100% 0 0); } to { clip-path: inset(0 0 0 0); } }
15Exit Animations6 Patterns / Click to Play

Six exit patterns for removing elements from view. All use ease-in timing to accelerate away from the user's focus.

Fade Out
GFS
@keyframes fadeOut { from { opacity: 1; } to { opacity: 0; } }
Slide Down
GFS
@keyframes slideDownExit { from { opacity:1; translateY(0); } to { opacity:0; translateY(24px); } }
Scale Down
GFS
@keyframes scaleDown { from { opacity:1; scale(1); } to { opacity:0; scale(0.85); } }
Blur Out
GFS
@keyframes blurOut { from { opacity:1; blur(0); } to { opacity:0; blur(8px); } }
Collapse
GFS
@keyframes collapse { from { opacity:1; max-height:60px; } to { opacity:0; max-height:0; } }
Dissolve
GFS
@keyframes dissolve { 0% { opacity:1; blur(0); scale(1); } 100% { opacity:0; blur(4px); scale(1.02); } }
16Page Transitions3 Patterns / Storyboard Frames

Three page-level transition patterns shown as storyboard frames. Each frame represents a stage in the transition sequence.

Pattern 1: Cross-Fade Between Pages
Duration: 400ms | Easing: ease-in-out | Trigger: Route change
Frame 1 -- Current
opacity: 1
Frame 2 -- Fade Out
opacity: 0.4
Frame 3 -- Crossover
both: 0.5
Frame 4 -- New Page
opacity: 1
Pattern 2: Slide Between Tabs
Duration: 200ms | Easing: ease-in-out | Trigger: Tab click
Frame 1 -- Tab A Active
Tab A
Tab B
Tab C
Frame 2 -- Slide Start
Tab A
Tab B
Tab C
Frame 3 -- Slide End
Tab A
Tab B
Tab C
Pattern 3: Expand from Card to Detail
Duration: 400ms | Easing: ease-out-expo | Trigger: Card click
Frame 1 -- Card Grid
CLICK
Frame 2 -- Expanding
EXPANDING
Frame 3 -- Overlay
DETAIL VIEW
Frame 4 -- Detail
17Scroll Animations4 Patterns / Live Scroll Demos

Four scroll-triggered animation patterns. These activate as elements enter the viewport. Click "Trigger" to simulate the scroll event.

Reveal on Scroll
opacity + translateY(20px) | 500ms ease-out-expo
Counter Animation
0
SHIPMENTS
0
ON-TIME %
0
ROUTES
requestAnimationFrame | 1200ms duration
Progress Bar Fill
Procurement0%
Logistics0%
Cold Chain0%
width transition | 1200ms ease-out-expo
Parallax Subtle Shift
Content Layer
translateY at different rates | max shift: 20px
18Micro-Interaction Specs10 Interactions / Complete Specs

Every common interaction fully specified: trigger, property, duration, easing, and delay. These are non-negotiable -- every implementation must match these specs exactly.

Interaction Trigger Property Animated Duration Easing Delay
Button Hover :hover background-color, box-shadow, transform(Y-2px) 100ms ease-out-expo 0ms
Button Press :active transform(scale 0.97, Y0), box-shadow 80ms ease-out-expo 0ms
Toggle Switch click background-color, knob translateX 200ms spring 0ms
Checkbox Check click stroke-dashoffset (check mark), background-color 200ms spring 0ms
Dropdown Open click opacity, translateY(8px), max-height 200ms ease-out-expo 0ms
Modal Open click opacity, scale(0.95 to 1), backdrop opacity 400ms ease-out-expo backdrop: 0ms, content: 50ms
Toast Appear event opacity, translateY(20px to 0) 200ms ease-out-expo 0ms
Tab Switch click indicator translateX, panel opacity + translateX 200ms ease-in-out indicator: 0ms, panel: 50ms
Accordion Expand click max-height, opacity, chevron rotate(180deg) 400ms ease-out-expo 0ms
Tooltip Show :hover opacity, translateY(4px to 0), scale(0.98 to 1) 100ms ease-out-expo 300ms (intentional)
Live Demos
Button
Toggle
Checkbox
Tooltip
?
Help text
Accordion
Details
Content revealed with 400ms ease-out-expo.
Rule: If an interaction is not in this table, it does not exist in the system. Propose additions through the design governance process before implementing custom animations.
19Loading State TransitionsSkeleton to Content / Reveal Specs
Loading states transition from skeleton placeholders to actual content. The reveal must feel swift and purposeful — content appears to be "unveiled" rather than popping in abruptly.
Phase 1: Skeleton
Timing: Appears immediately (0ms)
Animation: Shimmer pulse 1.5s infinite
Colors: Fog base, +2% lighter pulse
Phase 2: Reveal
Duration: 200ms
Easing: ease-out (0, 0, 0.58, 1)
Properties: opacity 0 to 1, translateY -4px to 0
Phase 3: Complete
Revenue Summary
Total revenue for Q1 2026 reached $4.2M.
Growth: 18% vs prior year quarter.
Northeast region led with 42% share.
State: Final, static
Note: No layout shift between skeleton and content
Rule: Skeleton must match content dimensions
Loading transition rules. Never show a blank screen — skeleton appears at 0ms. If content loads in <200ms, skip skeleton (show content directly). Stagger multiple cards by 60ms each. Never animate width/height during reveal (causes layout shift). Use will-change: opacity, transform on loading containers.
20Notification Entrance/Exit ChoreographyToast Stack / Banner / Inline Alert Timing
Notifications use choreographed entrance and exit animations that respect the user's attention without being disruptive. Each notification type has specific timing based on urgency and placement.
Type Entrance Duration Exit Auto-Dismiss
Toast (success)slideInRight 300ms ease-out-expo4000msfadeOut 200ms ease-inYes
Toast (error)slideInRight 300ms ease-out-expoPersistentslideOutRight 250ms ease-inNo (manual)
Banner (info)slideDown 250ms ease-outPersistentslideUp 200ms ease-inNo (dismiss)
Inline alertexpand 200ms + fadeIn 150msPersistentcollapse 150ms + fadeOut 100msOn resolve
ModalscaleIn 200ms + scrim fadeIn 300msUser-controlledscaleOut 150ms + scrim fadeOut 200msNever
Toast Stack Rules
Max visible toasts: 3
Stack direction: bottom to top
New toast pushes others up (+8px gap)
Older toasts reduce opacity: 100%, 70%, 40%
Position: fixed bottom-right, 24px inset
List Stagger Calculator
Base delay: 0ms (first item)
Stagger increment: 60ms per item
Max stagger: 300ms (cap at 6th item)
Formula: delay = min(index * 60, 300)ms
Easing: cubic-bezier(0.16, 1, 0.3, 1)
Choreography principles. Notifications enter from the direction they relate to (toast from right = peripheral attention; banner from top = page-level context). Exit is always faster than entrance (user wants it gone). Error notifications never auto-dismiss. Maximum 3 simultaneous notifications visible.
21List Stagger Timing CalculatorDelay Curves / Index-Based Animation Offsets
When multiple items animate in sequence (table rows loading, cards appearing, list items entering), each item needs a calculated delay. GFS uses three stagger curves depending on the content type and urgency of display.
Linear Stagger
delay = index * 60ms
Cap: 300ms (6th item)
[0]
0ms
[1]
60ms
[2]
120ms
[3]
180ms
[4]
240ms
[5]
300ms
Use for: Table rows, simple lists, card grids. Equal perceived spacing between items.
Ease-Out Stagger
delay = sqrt(index) * 80ms
First items fast, later items slower
[0]
0ms
[1]
80ms
[2]
113ms
[3]
139ms
[4]
160ms
[5]
179ms
Use for: Dashboard cards, KPI grids. First items appear quickly to reduce perceived latency.
Burst Stagger
delay = index * 30ms (fast burst)
All items within 200ms window
[0]
0ms
[1]
30ms
[2]
60ms
[3]
90ms
[4]
120ms
[5]
150ms
Use for: Navigation items, tab bars, toolbars. Items should appear nearly simultaneously with subtle cascade.
CSS Implementation
.stagger-item { opacity: 0; transform: translateY(8px); animation: gfs-staggerIn 400ms cubic-bezier(0.16, 1, 0.3, 1) forwards; } .stagger-item:nth-child(1) { animation-delay: 0ms; } .stagger-item:nth-child(2) { animation-delay: 60ms; } .stagger-item:nth-child(3) { animation-delay: 120ms; } .stagger-item:nth-child(4) { animation-delay: 180ms; } .stagger-item:nth-child(5) { animation-delay: 240ms; } .stagger-item:nth-child(n+6) { animation-delay: 300ms; } @keyframes gfs-staggerIn { to { opacity: 1; transform: translateY(0); } }
Reduced Motion
When prefers-reduced-motion: reduce is active, all stagger delays collapse to 0ms. Items appear simultaneously with a simple 200ms opacity fade. No translateY movement. This respects users with vestibular disorders.
Performance Notes
Stagger animations use will-change: opacity, transform for GPU acceleration. Never stagger more than 12 items (cap at 300ms total). For lists with 20+ items, animate only the first 6 and show the rest instantly. Remove will-change after animation completes.
Stagger selection guide. Linear: default for most lists and grids. Ease-out: dashboard-style layouts where first content matters most. Burst: navigation elements and toolbars. Always cap total stagger duration at 300ms. If the user scrolls during stagger, complete all remaining items instantly.
22Motion Token Reference TableComplete Animation Token Inventory
Every animation in the GFS design system maps to a named token. This table provides the complete inventory of motion tokens with their CSS values, use cases, and constraints.
Token Name Duration Easing Properties Use Case
--motion-instant0msnoneallDisabled state, reduced motion mode
--motion-micro80msease-outopacity, color, backgroundButton hover, focus ring, toggle switch
--motion-fast120msease-outopacity, transformTooltip show/hide, small hover effects
--motion-normal200msease-out-expoopacity, transformDropdown open, card hover elevation
--motion-expressive300msease-out-expoopacity, transform, heightModal entrance, page transition, accordion
--motion-dramatic400msease-out-expoopacity, transformFull-page transitions, hero reveals
--motion-enter200mscubic-bezier(0.16,1,0.3,1)opacity, translateYElement entrance from below
--motion-exit150msease-inopacity, translateYElement exit upward
--motion-slide-in250msease-out-expotransform (translateX)Drawer/panel slide from edge
--motion-slide-out200msease-intransform (translateX)Drawer/panel dismiss
--motion-scale-in200msease-out-expoopacity, scale(0.95 to 1)Modal/dialog appearance
--motion-scale-out150msease-inopacity, scale(1 to 0.95)Modal/dialog dismiss
--motion-scrim-in300msease-outopacity (0 to 0.6)Overlay backdrop fade-in
--motion-shimmer1500mslinear, infinitebackground-positionSkeleton loading pulse
Motion governance. Only tokens from this table are permitted in production code. Proposing a new motion token requires a design governance review. All exits must be faster than their corresponding entrances. All animations must respect prefers-reduced-motion. Performance budget: no animation may cause a frame drop below 60fps on a 2020-era mid-range device.
23GFS Particle GlobeInteractive tsParticles Network
A pro-grade interactive particle globe replacing the CSS-only version. 80 cobalt-blue particles connect with jordy-blue lines when proximate. Mouse interaction repels particles on hover, creating an organic, responsive feel. Built with tsParticles for GPU-accelerated rendering.
Particles
80
Cobalt dots, 2-4px radius
Links
150px
Connection distance
Speed
1.0
Particle move speed
Interaction
Repulse
On mouse hover
24Branded Backgrounds6 tsParticles Configurations
Six particle configurations tailored to different GFS contexts. Each uses the brand palette and is tuned for subtle, non-intrusive background ambience. Click "Copy Config" to grab the tsParticles JSON for any configuration.

Snow

Falling white dots on cobalt background. Evokes cold chain operations, winter logistics, and temperature-controlled environments.

Network

Connected dots forming a mesh. Represents supply chain network topology, distribution points, and interconnected systems.

Bubbles

Floating circles in blue shades. Gentle and ambient, suitable for backgrounds where content readability is paramount.

Confetti

Celebration effect with blue and white particles. Use for milestone completions, target achievements, and positive outcomes.

Stars

Twinkling dots on dark background. Represents data points, night operations, and subtle dashboard ambience.

Flow

Particles moving left to right. Directional motion representing supply chain flow, logistics movement, and throughput.

25Usage GuideWhere to Use Particle Backgrounds
Particle backgrounds add depth and interactivity when used sparingly. Each GFS context maps to a specific configuration. Follow these assignments to maintain visual consistency across all products.
Hub Landing
Network Config
The connected mesh reinforces GFS's supply chain network identity. Place behind the hero section with 0.3 opacity. Use alice background color for the container.
Loading Screens
Snow Config
Falling particles create a sense of motion during data fetches. Pairs with the GFS globe loader. Use cobalt background, white particles at 0.5 opacity.
Celebrations
Confetti Config
Trigger on milestone completions: quarterly targets hit, 100% compliance achieved, onboarding complete. Auto-stop after 3 seconds.
Dashboards
Stars Config (subtle)
Very low density (20-30 particles), minimal movement. Place behind dashboard chrome only, never behind data tables or charts. Opacity 0.3 maximum.
Portal Login
Globe Config
Full interactive globe behind the login card. Creates a premium first impression. Mouse repulsion gives users something to interact with while credentials load.
Rules for particle backgrounds.
Always keep container opacity between 0.3 and 0.5 -- never let particles compete with content. Never place particles directly behind body text, tables, or form inputs. Performance cap at 100 particles on any device. Particles must not trigger on mobile unless explicitly enabled. All particle containers must include will-change: transform for GPU acceleration.
26Performance TipsResponsive Particle Counts & Optimization
Particle systems are GPU-intensive. Adjust density based on device capability to maintain 60fps rendering. The responsive configuration below detects viewport width and scales particle count accordingly.
Device Viewport Max Particles Link Distance Move Speed Notes
Desktop > 1024px 100 150px 1.0 Full experience, mouse interaction enabled
Tablet 768-1024px 60 120px 0.8 Reduced density, touch interaction
Mobile < 768px 30 100px 0.6 Minimal, consider disabling entirely
Responsive Configuration Code
function getParticleCount() {
  const w = window.innerWidth;
  if (w > 1024) return { count: 100, linkDist: 150, speed: 1.0 };
  if (w > 768)  return { count: 60,  linkDist: 120, speed: 0.8 };
  return              { count: 30,  linkDist: 100, speed: 0.6 };
}

const cfg = getParticleCount();

tsParticles.load("my-container", {
  particles: {
    number:  { value: cfg.count },
    color:   { value: "#092F64" },
    links:   { enable: true, distance: cfg.linkDist, color: "#93BFEF", opacity: 0.4 },
    move:    { enable: true, speed: cfg.speed },
    size:    { value: { min: 2, max: 4 } },
    opacity: { value: 0.5 }
  },
  interactivity: {
    events: {
      onHover: { enable: w > 768, mode: "repulse" }
    },
    modes: {
      repulse: { distance: 100, duration: 0.4 }
    }
  },
  detectRetina: true
});
Additional performance guidelines.
Use detectRetina: true for crisp rendering on HiDPI displays. Set fpsLimit: 60 to prevent unnecessary overdraw. Disable link lines on mobile -- they are the most expensive render operation. Prefer out-mode: "out" over "bounce" to reduce collision calculations. Test on the lowest-spec target device before shipping.
27SVG.js Live Demos6 Programmatic SVG Generators

Each demo below generates SVGs programmatically using the SVG.js library. These are live, editable, and use the GFS brand color palette throughout.

01 / GFS Logo (Programmatic)

const draw = SVG().addTo('#svgLogo').size(300,180); // Outer circle draw.circle(120).fill('none') .stroke({color:'#092F64',width:4}).center(150,90); // Ellipses for globe effect draw.ellipse(80,120).fill('none') .stroke({color:'#468BE6',width:1.5}).center(150,90); draw.ellipse(120,80).fill('none') .stroke({color:'#468BE6',width:1.5}).center(150,90); // Horizontal lines for(let i=-2; i<=2; i++){ draw.line(90,90+i*15,210,90+i*15) .stroke({color:'#93BFEF',width:0.8}); } // GFS text draw.text('GFS').font({size:24,weight:800, family:'Inter'}).fill('#092F64').center(150,90);

02 / Animated Self-Drawing Badge

const draw = SVG().addTo('#svgBadge').size(300,180); const circle = draw.circle(120).fill('none') .stroke({color:'#092F64',width:3, dasharray:'377',dashoffset:'377'}) .center(150,90); // Animate stroke drawing circle.animate(1500,'<>').attr({ 'stroke-dashoffset': 0 });

03 / Product Icon Generator

function generateIcon(name) { const draw = SVG().addTo('#svgIcon').size(300,180); const hash = hashString(name); const sides = 3 + (hash % 5); // 3-7 sides draw.polygon(generatePolygon(sides,50)) .fill('#E9F5FF').stroke({color:'#092F64',width:2}) .center(150,90); draw.text(name[0].toUpperCase()) .font({size:32,weight:800}).fill('#092F64') .center(150,90); }

04 / Dynamic Bar Chart

function generateBarChart(values) { const draw = SVG().addTo('#svgBarChart').size(300,180); const colors = ['#092F64','#468BE6','#93BFEF']; const barW = 240 / values.length; values.forEach((v, i) => { const h = (v / 100) * 140; draw.rect(barW - 6, h).fill(colors[i % 3]) .move(30 + i * barW, 160 - h).radius(2); }); draw.line(25,160,275,160) .stroke({color:'#092F64',width:1.5}); }

05 / Certification Badge Builder

function generateCertBadge(name) { const draw = SVG().addTo('#svgCert').size(300,180); // Shield shape draw.path('M150,15 L235,45 L235,110 ...') .fill('#E9F5FF').stroke({color:'#092F64',width:2.5}); draw.circle(60).fill('none') .stroke({color:'#468BE6',width:1.5}).center(150,90); draw.polygon(starPoints(150,85,20,9)) .fill('#468BE6'); draw.text(name).font({size:10,weight:700, family:'IBM Plex Mono'}).fill('#092F64') .center(150,140); }

06 / QR Code Pattern Generator

function generateQR() { const draw = SVG().addTo('#svgQR').size(300,180); const size = 10, cols = 16, rows = 10; for(let r=0; r<rows; r++){ for(let c=0; c<cols; c++){ if(Math.random() > 0.45){ draw.rect(size, size) .fill('#092F64') .move(60 + c*(size+2), 20 + r*(size+2)) .radius(1); } } } // Corner markers [[60,20],[60+13*12,20],[60,20+7*12]].forEach(([x,y])=>{ draw.rect(30,30).fill('none') .stroke({color:'#092F64',width:3}).move(x,y); draw.rect(14,14).fill('#468BE6').move(x+8,y+8); }); }
28Anime.js Animation Gallery8 Interactive Animations / Controls

Each animation below uses Anime.js for timeline-based motion design. All demos include play, pause, and restart controls. The animations use the GFS brand colors and follow our motion design principles.

01 / Logo Entrance -- Stagger Text

G l o b a l F o o d
const anim1 = anime({ targets: '.gfs-char', translateX: [-40, 0], opacity: [0, 1], duration: 800, delay: anime.stagger(80), easing: 'easeOutExpo', autoplay: false });

02 / Counter -- 0 to 99.2

0
ACCURACY SCORE
const counterObj = { value: 0 }; const anim2 = anime({ targets: counterObj, value: [0, 99.2], round: 10, duration: 2000, easing: 'easeInOutQuad', update: () => { el.textContent = counterObj.value.toFixed(1); }, autoplay: false });

03 / Path Drawing -- Truck Outline

const anim3 = anime({ targets: '#truckPath', strokeDashoffset: [900, 0], duration: 2500, easing: 'easeInOutSine', autoplay: false });

04 / Stagger Grid -- 5x5 Dots

const anim4 = anime({ targets: '.grid-dot', scale: [0, 1], opacity: [0, 1], backgroundColor: ['#E9F5FF','#092F64'], delay: anime.stagger(60, { grid: [5, 5], from: 'center' }), duration: 600, easing: 'easeOutElastic(1, .5)', autoplay: false });

05 / Morphing Shape

const anim5 = anime.timeline({ autoplay: false, loop: true }).add({ targets: '#morphShape', d: 'M40,30 L160,30 L160,130 L40,130 Z', duration: 1000, easing: 'easeInOutQuad' }).add({ targets: '#morphShape', d: 'M100,20 L170,70 L140,140 L60,140 L30,70 Z', duration: 1000, easing: 'easeInOutQuad' }).add({ targets: '#morphShape', d: 'M100,20 A60,60 0 1,1 99.99,20', duration: 1000, easing: 'easeInOutQuad' });

06 / Timeline Sequence

const anim6 = anime.timeline({ autoplay: false, easing: 'easeOutExpo' }).add({ targets: '.tl-box:nth-child(1)', opacity: [0,1], translateY: [-30,0], scale: [0.5,1], duration: 600 }).add({ targets: '.tl-box:nth-child(2)', opacity: [0,1], translateX: [-30,0], scale: [0.5,1], duration: 600 }, '-=300').add({ targets: '.tl-box:nth-child(3)', opacity: [0,1], translateY: [30,0], scale: [0.5,1], duration: 600 }, '-=300');

07 / Scroll-Triggered Reveal

// IntersectionObserver triggers on scroll const observer = new IntersectionObserver( entries => { entries.forEach(entry => { if(entry.isIntersecting){ anime({ targets: entry.target, translateY: [40, 0], opacity: [0, 1], duration: 800, easing: 'easeOutCubic' }); } }); }, { threshold: 0.3 } );

08 / Elastic Bounce

const anim8 = anime({ targets: '#bounceBall', translateY: [0, 110], scaleX: [1, 1.3], scaleY: [1, 0.7], duration: 1200, easing: 'easeOutBounce', direction: 'alternate', loop: true, autoplay: false });
29Combined EffectsRough.js + SVG.js + Anime.js Together

These demos combine multiple libraries to create rich, interactive effects. Rough.js provides the hand-drawn aesthetic, SVG.js handles vector generation, and Anime.js drives the animations.

01 / Hand-Drawn Line Animation (Rough.js + Anime.js)

// Draw Rough.js lines progressively using Anime.js timing const progressObj = { value: 0 }; anime({ targets: progressObj, value: [0, 1], duration: 2000, easing: 'easeInOutQuad', update: function() { ctx.clearRect(0, 0, 600, 200); const rc = rough.canvas(canvas); const segments = Math.floor(progressObj.value * 8); for(let i = 0; i < segments; i++) { rc.line(50+i*65, y1, 50+(i+1)*65, y2, { roughness:2, stroke:'#092F64' }); rc.circle(x, y, 10, { fill:'#468BE6' }); } } });

02 / Animated Bar Chart (SVG.js + Anime.js)

// SVG.js creates the chart, Anime.js animates bars const draw = SVG().addTo('#combinedChart2').size(400,200); const values = [70, 90, 55, 85, 60, 95, 45]; const colors = ['#092F64','#468BE6','#93BFEF',...]; values.forEach((v, i) => { draw.rect(35, 0).fill(colors[i]) .move(30 + i*50, 170).radius(2) .addClass('chart-bar'); }); anime({ targets: '.chart-bar', height: (el, i) => values[i] * 1.5, y: (el, i) => 170 - values[i] * 1.5, delay: anime.stagger(100), duration: 1000, easing: 'easeOutElastic(1, .6)' });
30What is Generative ArtAlgorithmic / Unique / Branded

Algorithmically created artwork that is unique every time. Using GFS's color palette and visual DNA — dots, lines, grids — these sketches generate one-of-a-kind branded visuals for backgrounds, social media, posters, and presentations.

4
Live Sketches
5
Brand Colors
Unique Outputs
0
Build Steps
31Live SketchesInteractive / Mouse-Responsive / Exportable
Network Pulse SKETCH 01
Dot Matrix Flow SKETCH 02
Data Landscape SKETCH 03
Brand DNA Spiral SKETCH 04
32Use CasesWhere to Deploy Generated Art
SM
Social Media Backgrounds
Save any sketch as PNG, crop to platform dimensions, and use as unique branded backgrounds for LinkedIn, X, or Instagram posts.
SL
Presentation Slide Backgrounds
Generate a subtle Network Pulse or Data Landscape, overlay with a semi-transparent white scrim, and use as a branded slide background.
DC
Document Cover Art
Use as cover art for proposals, reports, and SOWs. Each document gets a unique generative cover that still reads as unmistakably GFS.
EM
Email Header Images
Crop a Dot Matrix Flow or Spiral sketch to email header dimensions (600x200) for branded newsletter and announcement headers.
LB
Lobby Screen Displays
Run any sketch fullscreen in a kiosk browser for visitor-facing lobby displays. The constant motion and brand colors create an ambient presence.
BC
Business Card Backgrounds
Generate a static Spiral or Dot Matrix frame, export at 2x resolution, and use as the abstract background for business card reverse sides.
33CustomizationAdjust Parameters in Real Time
01 — Network Pulse
Nodes 30
Speed 5
Intensity 60
Background
02 — Dot Matrix Flow
Density 16
Speed 8
Intensity 70
Background
03 — Data Landscape
Layers 6
Speed 5
Intensity 80
Background
04 — Brand DNA Spiral
Dots 200
Speed 4
Intensity 80
Background
34Shipment Volume Grid52-Week x 7-Day Contribution Graph

Inspired by contribution graphs, this 52x7 grid maps one full year of GFS shipment volume. Each cell represents a single day. Color intensity corresponds to shipment count: lightest for quiet days, deepest cobalt for peak volume. Weekends naturally show less activity. Holiday weeks create visible valleys. Peak seasons — spring produce, fall procurement — glow dark.

MTWTFSS
JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC
Less
More Shipment count per day — FY 2025
Pattern Logic: Weekdays (Mon-Fri) carry higher volume. Saturdays are light; Sundays near-zero. Spring and fall show seasonal peaks from produce procurement and pre-holiday stocking. July 4th week and Christmas week create visible valleys. The pattern is instantly recognizable as GFS operational rhythm.
35Temperature Compliance Gradient365-Day Cold Chain Barcode

A DNA-barcode-style visualization of daily cold chain compliance across one calendar year. Each vertical bar is one day. Green means 100% compliance. Rare yellows mark days where minor deviations occurred. A red bar means a breach event. The overwhelmingly green result tells the GFS story: relentless compliance.

JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC
100%
99%
95%
90%
85%
Breach 1 breach in 365 days = 99.7% annual compliance
Reads like DNA. The strip format compresses a full year of cold chain data into a single horizontal bar. The visual is overwhelmingly green — which is the point. Deviations stand out because they are rare. This is GFS operational excellence, made visible.
36Route Density MapDot-Matrix Distribution Visualization

A simplified US geography where dot density represents GFS shipment volume per region. Northeast is densest — that is home territory. Central regions show moderate activity. The West Coast has lighter, strategic coverage. Pure CSS using repeating background patterns at varied densities.

NE
SE
MW
S
MT
PAC
High Medium Low
Northeast Corridor
47%
of total shipment volume
Central / Midwest
31%
of total shipment volume
West / Pacific
22%
of total shipment volume
Dot density = data density. This pattern can be applied to any regional data set: customer concentration, warehouse locations, delivery frequency. The dot-matrix aesthetic ties directly to GFS's data-driven identity.
37Product Mix MosaicTapestry-Style Category Visualization

Each row represents one week. Each column represents a product category. Cell color corresponds to the category. The result is a textile-like tapestry that reveals patterns in GFS's product mix over time: seasonal shifts, product launches, and procurement cycles become visible as color bands.

Cheese
Butter
Frozen Veg
Dairy
Produce
Protein
Other
Read vertically: see how one category's share changes over time. Read horizontally: see the product mix for any given week. Spring produce expansion is visible as the green band widens. Fall cheese and butter ramp shows holiday procurement. Every row tells a story.
38Heartbeat PatternCSS-Animated Operations Rhythm

An animated continuous pattern representing GFS operations in real time. Morning hours (6-10 AM) spike as shipments depart. Midday levels sustain. Afternoon shows a secondary peak for receiving. Night drops to baseline monitoring. The pattern loops every 8 seconds, creating a living, breathing rhythm.

12 AM3 AM6 AM9 AM12 PM3 PM6 PM9 PM12 AM
Peak Hour
7:30 AM
Secondary Peak
3:00 PM
Low Point
2:30 AM
Animation
8s Loop
Living brand element. This pattern can be used as a background animation for dashboards, loading screens, or ambient displays. Color transitions from jordy (low activity) through tufts and navy to cobalt (peak) encode intensity meaning into the animation.
39Unique Document FingerprintVisual Hash / Document Identity

Every GFS document gets a unique visual fingerprint generated from its ID number. The fingerprint is a 20x4 grid where cell on/off patterns are derived deterministically from the document number. Like a visual hash. Each fingerprint is unique but all share the GFS blue palette — making them instantly identifiable as GFS documents.

GFS-2026-001
GFS-2026-042
GFS-2026-117
GFS-2026-203
GFS-2026-389
GFS-2026-500
Visual authentication. Fingerprints can be placed on invoices, shipment manifests, compliance certificates, and any document requiring quick visual verification. Matching the fingerprint to the document ID confirms authenticity at a glance. Each pattern is deterministic — the same ID always produces the same fingerprint.
40Network Flow VisualizationSupply Chain Node Graph / CSS-Only
The network flow pattern maps GFS supply chain connections as a node graph. Each node represents a facility (warehouse, DC, customer), and connecting lines show product flow volume. Thicker lines = higher volume. Animated pulse dots travel the paths to indicate active shipments.
HQ
EDGEWOOD
DC1
BOSTON
DC2
PHILA
DC3
BALTIMORE
DC4
RICHMOND
DC5
HARTFORD
DC6
CHARLOTTE
C1
C2
C3
C4
HQ Distribution Center Customer Line weight = volume
Node Sizing
Hub (HQ): 64px diameter
Distribution Center: 40px diameter
Customer endpoint: 24px diameter
Vendor/supplier: 32px diameter
All nodes use border-radius: 50%
Connection Lines
Primary routes: 3-4px stroke
Secondary routes: 2px stroke
Last-mile: 1.5px dashed
Color: Cobalt (primary), Tufts (secondary)
Opacity: 20-30%
Pulse Animation
Dot size: 2-4px radius
Duration: 2-4s per path
repeatCount: indefinite
Opacity: 60-80%
Use SVG animateMotion
Network flow visualizations are used on operations dashboards, annual reports, and investor decks to show GFS distribution reach. Node positions can be geographic (map-based) or topological (force-directed layout). Always include a legend. Maximum recommended nodes: 30 for readability.
41Daily Rhythm Heatmap24-Hour Operations Intensity / CSS Grid
The daily rhythm heatmap encodes 24 hours of GFS operational intensity into a single visual row. Each cell represents one hour. Color intensity maps to activity level: order volume, truck dispatches, or warehouse pick rates. Stacking 7 rows creates a weekly view.
MON
TUE
WED
THU
FRI
SAT
SUN
12a
3a
6a
9a
12p
3p
6p
9p
Intensity:
LowHigh
Rhythm heatmaps reveal operational patterns at a glance: peak dispatch windows, order clustering, warehouse load distribution. Data source: NetSuite transaction timestamps aggregated hourly. Use Cobalt single-hue with opacity mapping. Friday peaks reflect end-of-week order surges. Saturday/Sunday show reduced weekend operations.
42Route Optimization PatternDelivery Sequence Visualization / Before-After
The route optimization pattern visualizes delivery sequence improvements. A before/after comparison shows how GFS routing algorithms reduce total mileage, delivery time, and fuel consumption by reordering stops. The pattern uses numbered waypoints connected by path lines on a simplified grid.
Before Optimization
142 miles / 8.2 hrs
D
1
2
3
4
5
142
Miles
8.2
Hours
20.3
Gal Diesel
After Optimization
89 miles / 5.1 hrs
D
1
2
3
4
5
89
Miles
5.1
Hours
12.7
Gal Diesel
-37%
Miles Reduced
-38%
Time Saved
-37%
Fuel Saved
$38
Savings/Route
Visual Spec
Depot marker: 28px square, Cobalt fill
Stop markers: 24px circle, numbered
Before path: Red #DC2626, dashed 6,4
After path: Green #16A34A, solid 2.5px
Background: Fog with dot grid overlay
Stats bar: 3-column grid below map
Data Source
Algorithm: Nearest-neighbor + 2-opt swap
Input: NetSuite delivery schedule + geocodes
Constraints: time windows, truck capacity, DOT hours
Output: ordered stop list + estimated metrics
Update frequency: nightly batch or on-demand
Average improvement: 25-40% mileage reduction
Route optimization visuals appear in fleet dashboards, driver dispatch screens, and monthly operations reviews. The before/after pattern clearly communicates savings to non-technical stakeholders. Always show the same stops in both panels — only the sequence changes. Color coding: red = unoptimized, green = optimized.
43What is LottieVector Animation Technology

Lottie is a vector animation format that renders After Effects animations in real time. Animations are exported as JSON, resulting in tiny file sizes, infinite scalability, and smooth 60fps playback on any device.

Unlike GIFs or video, Lottie files are resolution-independent, interactive, and programmable. A typical Lottie animation is 2-10KB -- smaller than a single JPEG thumbnail. They can be controlled via JavaScript: play, pause, reverse, scrub to frame, or trigger on scroll. For GFS, Lottie replaces static icons, CSS spinners, and placeholder illustrations with polished, brand-aligned motion.

2-10 KB
Typical File Size
60 fps
Render Speed
Infinite
Scalability
JSON
Source Format
Perfect for: loading screens, micro-interactions, mascot animations, onboarding flows, success/error states, and email headers (with GIF fallback).
44GFS Animation Concepts8 Branded Lottie Designs
Eight animation concepts designed specifically for GFS. Each card shows a static keyframe mockup with the intended motion description, duration, and recommended trigger. These serve as briefs for Lottie production.

GFS Globe Assembly

Globe forming from scattered particles. Dots drift inward, orbital rings draw on, connection lines fade in. The signature GFS loading animation as a polished Lottie.

2.5s On Load

Frosty Wave

GFS mascot Frosty waving. Arm raises and waves in a friendly loop. Snowflake particles drift around. Used for welcome screens and empty state greetings.

1.5s On Load

Frosty Thinking

Frosty with animated thought bubbles rising. Neutral expression, bubbles scale up and float. Used during AI processing, search loading, and data analysis states.

2.0s On Load

Temperature Gauge

Thermometer filling up with animated mercury. Color shifts from blue (cold) to teal (optimal). Tick marks label temperature ranges. Cold chain monitoring visualization.

1.8s On Scroll
GFS

Truck Moving

GFS-branded delivery truck driving across the frame. Wheels rotate, slight bounce on road bumps. Used for shipment tracking, delivery confirmations, and logistics pages.

3.0s On Scroll

Checkmark Success

Animated checkmark drawing inside a circle. Circle draws on first, then the check strokes in with a satisfying snap. Used for form submissions, completed tasks, and confirmations.

0.8s On Click

Cold Chain Link

Chain links connecting one by one with snowflake particles at each joint. Represents unbroken cold chain integrity. Links slide and lock with a subtle pulse effect.

2.0s On Hover

Data Pulse

Bar chart bars animating upward from baseline. Each bar rises sequentially with a slight overshoot and settle. Used for dashboard hero metrics and report introductions.

1.2s On Scroll
45Lottie Player Usagedotlottie-player Element & Sizes
The <dotlottie-player> web component renders Lottie animations with zero JavaScript setup. Include the CDN script as a module, then use the custom element anywhere in your HTML. Below are the three standard sizes used across GFS products.
Base Element
<script src="https://cdn.jsdelivr.net/npm/@dotlottie/player-component@2/dist/dotlottie-player.mjs"
        type="module"></script>

<dotlottie-player
  src="animation.lottie"
  background="transparent"
  speed="1"
  style="width: 200px; height: 200px;"
  loop
  autoplay
></dotlottie-player>
Three Standard Sizes
Inline
24 x 24 px
style="width:24px;height:24px;"
Button icons, inline status indicators, table cell animations. Sits alongside text at the same line height.
Card
120 x 120 px
style="width:120px;height:120px;"
Empty states, card illustrations, sidebar decorations. Centered within its container with padding.
Renders at 400px
Hero
400 x 400 px
style="width:400px;height:400px;"
Landing page heroes, login backgrounds, full-page loading screens. Centered with max-width constraint.
Player attributes reference.
src -- URL or path to .lottie or .json file
background -- container background, use "transparent" for overlays
speed -- playback multiplier (0.5 = half, 2 = double)
loop -- boolean, enables infinite looping
autoplay -- boolean, starts on load
hover -- boolean, plays only on mouse hover
direction -- 1 (forward) or -1 (reverse)
mode -- "normal" or "bounce" (ping-pong)
46Free Lottie ResourcesLottieFiles.com Categories for GFS
LottieFiles.com hosts thousands of free animations. The categories below are most relevant to GFS operations. Download, recolor to our palette, and deploy. All free-tier animations are MIT-licensed for commercial use.

Logistics

Trucks, warehouses, delivery, shipping containers, forklifts. Core GFS operations in motion.

Browse on LottieFiles

Food

Produce, groceries, food processing, kitchen, meals. Category-specific product animations.

Browse on LottieFiles

Delivery

Package tracking, route maps, doorstep delivery, couriers. Last-mile visualization.

Browse on LottieFiles

Weather

Snowflakes, temperature, cold, frost, ice. Cold chain and seasonal logistics themes.

Browse on LottieFiles

Charts

Bar charts, line graphs, pie charts, data visualization. Dashboard and reporting animations.

Browse on LottieFiles

Success / Error

Checkmarks, X marks, alerts, warnings, celebrations. Form feedback and status indicators.

Browse on LottieFiles
Recoloring Downloaded Lotties
Downloaded Lottie files rarely match GFS colors out of the box. Use the LottieFiles editor or manual JSON editing to remap colors to our palette.
Step Action Details
1 Upload to LottieFiles Editor Go to lottiefiles.com/editor and upload the .json file
2 Select color layers Click each colored element to isolate its fill/stroke
3 Map to GFS palette Primary fills: #092F64 (cobalt). Accents: #468BE6 (tufts). Backgrounds: #E9F5FF (alice). Lines: #93BFEF (jordy)
4 Test at target size Preview at 24px, 120px, and 400px to ensure colors read at all sizes
5 Export and version Download as .lottie format. Name: gfs-[concept]-v[n].lottie. Store in /assets/lottie/
Recoloring rules. Never use colors outside the GFS palette. Remove all warm tones (oranges, reds, yellows) unless they serve a semantic purpose (warning/error). Maintain at least 3:1 contrast ratio for animated elements against their background. Test in both light and dark modes.
47Integration PatternsWhere Lottie Replaces Static Content
Lottie animations replace static elements across five key touchpoints. Each pattern shows what is being replaced, what replaces it, and the implementation approach.
Loading Screens
Replace the CSS spinner with the Lottie Globe Assembly animation. The globe forms from particles during initial data fetch, giving users a branded experience instead of a generic spinner. Use 120px size for inline loaders, 400px for full-page loads.
CSS @keyframes Spinner Lottie Globe Assembly
Empty States
Replace static empty-state icons with animated Frosty. The waving mascot provides a friendly, approachable feel when users land on pages with no data. Frosty Thinking variant works for search results with zero matches.
Static SVG Icon Lottie Frosty Wave
Success Confirmations
Replace the static checkmark with the animated Checkmark Success Lottie. The drawing-on effect provides a satisfying moment of completion. Use in toast notifications, form submissions, and task completions. Set to play once (no loop), triggered on click.
Static Checkmark SVG Lottie Checkmark Success
Onboarding Steps
Replace static step arrows and numbered indicators with animated transitions. The Truck Moving Lottie for logistics onboarding, Cold Chain Link for compliance steps, Data Pulse for analytics setup. Each plays on scroll-into-view for a progressive reveal effect.
Static Step Arrows Lottie Step Animations
Email Headers
Animated GFS logo for email campaigns and transactional emails. Since email clients do not support Lottie natively, render the animation as a GIF fallback at 2x resolution. Use the Globe Assembly at 120px for email headers, with the static first frame as a further fallback for clients that block images.
Static PNG Logo Animated GIF (from Lottie)
Integration checklist.
1. Confirm the animation file is under 50KB (prefer under 15KB).
2. Test on the slowest target device -- animation must not cause jank.
3. Provide a static SVG fallback for no-JS environments.
4. Set loading="lazy" on below-the-fold players.
5. Never autoplay animations that distract from primary content.
6. Respect prefers-reduced-motion -- show the static first frame instead.
Reduced Motion Support
/* CSS: respect user motion preferences */
@media (prefers-reduced-motion: reduce) {
  dotlottie-player {
    display: none;
  }
  .lottie-fallback {
    display: block; /* show static SVG instead */
  }
}

/* JS: check before initializing */
const motionOK = !window.matchMedia("(prefers-reduced-motion: reduce)").matches;
if (motionOK) {
  document.querySelectorAll("dotlottie-player").forEach(p => p.play());
}
← Back to Hub · GFS Design System v10.0 · Global Food Solutions, Inc. · Edgewood, NY · (877) 728-5550