orbit integration rotation animation icons stack works-with features orbit integration animation rotating icons logos stack technology works-with integration showcase section orbiting logos around a product icon works-with-your-stack section technology ecosystem visualization
Orbit Feature Base
Fetch pattern JSON:
curl https://webspire.de/patterns/orbit-feature/base.json base.html
<section class="ws-orbit-feature not-prose bg-[var(--ws-orbit-feature-bg)] py-24">
<div class="mx-auto max-w-5xl px-6">
<!-- Header -->
<div class="mb-16 text-center">
<p class="text-sm font-semibold uppercase tracking-widest text-[var(--ws-orbit-feature-accent)]">Integrations</p>
<h2 class="mt-3 text-4xl font-bold text-[var(--ws-orbit-feature-text)]">Works with your stack</h2>
<p class="mx-auto mt-4 max-w-md text-[var(--ws-orbit-feature-text-soft)]">Connect to the tools you already use. Zero vendor lock-in.</p>
</div>
<!-- Orbit diagram -->
<div class="relative mx-auto h-72 w-72">
<!-- Center hub -->
<div class="absolute left-1/2 top-1/2 z-20 flex h-16 w-16 -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded-2xl bg-[var(--ws-orbit-feature-hub)] shadow-lg ring-1 ring-[var(--ws-orbit-feature-ring)]">
<svg class="h-7 w-7 text-[var(--ws-orbit-feature-accent)]" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<path d="M12 2L2 7l10 5 10-5-10-5z"></path>
<path d="M2 17l10 5 10-5"></path>
<path d="M2 12l10 5 10-5"></path>
</svg>
</div>
<!-- Inner ring (4 items, 14s clockwise) -->
<div class="absolute inset-10 animate-[spin_14s_linear_infinite] rounded-full border border-dashed border-[var(--ws-orbit-feature-ring)]">
<!-- Top -->
<div class="absolute -top-5 left-1/2 -translate-x-1/2 animate-[spin_14s_linear_infinite_reverse]">
<div class="flex h-10 w-10 items-center justify-center rounded-xl bg-[var(--ws-orbit-feature-item-bg)] text-xs font-bold text-[oklch(0.35_0.15_230)] shadow ring-1 ring-[var(--ws-orbit-feature-ring)]">TS</div>
</div>
<!-- Right -->
<div class="absolute -right-5 top-1/2 -translate-y-1/2 animate-[spin_14s_linear_infinite_reverse]">
<div class="flex h-10 w-10 items-center justify-center rounded-xl bg-[var(--ws-orbit-feature-item-bg)] text-xs font-bold text-[oklch(0.5_0.2_145)] shadow ring-1 ring-[var(--ws-orbit-feature-ring)]">Go</div>
</div>
<!-- Bottom -->
<div class="absolute -bottom-5 left-1/2 -translate-x-1/2 animate-[spin_14s_linear_infinite_reverse]">
<div class="flex h-10 w-10 items-center justify-center rounded-xl bg-[var(--ws-orbit-feature-item-bg)] text-xs font-bold text-[oklch(0.6_0.22_27)] shadow ring-1 ring-[var(--ws-orbit-feature-ring)]">Py</div>
</div>
<!-- Left -->
<div class="absolute -left-5 top-1/2 -translate-y-1/2 animate-[spin_14s_linear_infinite_reverse]">
<div class="flex h-10 w-10 items-center justify-center rounded-xl bg-[var(--ws-orbit-feature-item-bg)] text-xs font-bold text-[oklch(0.42_0.18_260)] shadow ring-1 ring-[var(--ws-orbit-feature-ring)]">Nx</div>
</div>
</div>
<!-- Outer ring (4 items, 22s counter-clockwise) -->
<div class="absolute inset-0 animate-[spin_22s_linear_infinite_reverse] rounded-full border border-dashed border-[var(--ws-orbit-feature-ring-2)]">
<!-- Top -->
<div class="absolute -top-5 left-1/2 -translate-x-1/2 animate-[spin_22s_linear_infinite]">
<div class="flex h-10 w-10 items-center justify-center rounded-xl bg-[var(--ws-orbit-feature-item-bg)] text-xs font-bold text-[oklch(0.5_0.18_55)] shadow ring-1 ring-[var(--ws-orbit-feature-ring-2)]">⚡</div>
</div>
<!-- Right -->
<div class="absolute -right-5 top-1/2 -translate-y-1/2 animate-[spin_22s_linear_infinite]">
<div class="flex h-10 w-10 items-center justify-center rounded-xl bg-[var(--ws-orbit-feature-item-bg)] text-xs font-bold text-[oklch(0.45_0.2_280)] shadow ring-1 ring-[var(--ws-orbit-feature-ring-2)]">PG</div>
</div>
<!-- Bottom -->
<div class="absolute -bottom-5 left-1/2 -translate-x-1/2 animate-[spin_22s_linear_infinite]">
<div class="flex h-10 w-10 items-center justify-center rounded-xl bg-[var(--ws-orbit-feature-item-bg)] text-xs font-bold text-[oklch(0.4_0.18_320)] shadow ring-1 ring-[var(--ws-orbit-feature-ring-2)]">GH</div>
</div>
<!-- Left -->
<div class="absolute -left-5 top-1/2 -translate-y-1/2 animate-[spin_22s_linear_infinite]">
<div class="flex h-10 w-10 items-center justify-center rounded-xl bg-[var(--ws-orbit-feature-item-bg)] text-xs font-bold text-[oklch(0.5_0.2_200)] shadow ring-1 ring-[var(--ws-orbit-feature-ring-2)]">CF</div>
</div>
</div>
</div>
<!-- Integration list -->
<div class="mt-16 flex flex-wrap justify-center gap-3">
<span class="rounded-full bg-[var(--ws-orbit-feature-tag-bg)] px-4 py-1.5 text-sm text-[var(--ws-orbit-feature-text-soft)]">TypeScript</span>
<span class="rounded-full bg-[var(--ws-orbit-feature-tag-bg)] px-4 py-1.5 text-sm text-[var(--ws-orbit-feature-text-soft)]">Go</span>
<span class="rounded-full bg-[var(--ws-orbit-feature-tag-bg)] px-4 py-1.5 text-sm text-[var(--ws-orbit-feature-text-soft)]">Python</span>
<span class="rounded-full bg-[var(--ws-orbit-feature-tag-bg)] px-4 py-1.5 text-sm text-[var(--ws-orbit-feature-text-soft)]">Nx</span>
<span class="rounded-full bg-[var(--ws-orbit-feature-tag-bg)] px-4 py-1.5 text-sm text-[var(--ws-orbit-feature-text-soft)]">Vite</span>
<span class="rounded-full bg-[var(--ws-orbit-feature-tag-bg)] px-4 py-1.5 text-sm text-[var(--ws-orbit-feature-text-soft)]">PostgreSQL</span>
<span class="rounded-full bg-[var(--ws-orbit-feature-tag-bg)] px-4 py-1.5 text-sm text-[var(--ws-orbit-feature-text-soft)]">GitHub</span>
<span class="rounded-full bg-[var(--ws-orbit-feature-tag-bg)] px-4 py-1.5 text-sm text-[var(--ws-orbit-feature-text-soft)]">Cloudflare</span>
</div>
</div>
</section>
Details
Responsive Dark Mode Tailwind Only SSR Safe Copy & Paste
Stable Published
orbitintegrationrotationanimationiconsstackworks-withfeatures
Slots
| Name | Required | Description |
|---|---|---|
| heading | Yes | Section headline |
| subheading | No | One-line description below the headline |
| center-icon | Yes | Central hub icon representing your product |
| inner-items | Yes | Four items on the inner ring (language/framework icons) |
| outer-items | Yes | Four items on the outer ring (service/tool icons) |
| tag-list | No | Pill tags listing all integrations below the orbit |
Two concentric orbit rings rotate in opposite directions around a central product icon. Each ring holds four items that counter-rotate at the same speed, keeping them upright while visually orbiting. The pattern uses Tailwind’s built-in spin keyframe with arbitrary duration and direction overrides — no custom CSS needed.
Animation technique
- Inner ring:
animate-[spin_14s_linear_infinite](clockwise) - Inner items:
animate-[spin_14s_linear_infinite_reverse](counter, upright) - Outer ring:
animate-[spin_22s_linear_infinite_reverse](counter-clockwise) - Outer items:
animate-[spin_22s_linear_infinite](forward, upright)