See every season of the year
Move the slider to any date in 2026 — the banner, particles and resolved season info update live. Click any peak on the timeline below to jump straight to it.
Resolved season
Year at a glance
Every peak in the bundled co calendar (Colombia),
including moving holidays computed correctly for 2026 — Mother's
Day on the 2nd Sunday of May, Black Friday on the 4th Friday of
November, Día del Niño on the last Saturday of April.
Install
Pick the path that matches your stack. All paths use the same package.
NPM (Next, Astro, Vue, Svelte, Vite)
# Install npm install seasonly // app.js import { resolveSeason } from 'seasonly'; import { defineAll } from 'seasonly/components'; import co from 'seasonly/calendars/co.json' with { type: 'json' }; defineAll(); const active = resolveSeason(new Date(), co);
One-line CDN (WordPress, Shopify, Webflow, plain HTML)
<!-- Paste anywhere in your <head> or <body> --> <script type="module" src="https://cdn.jsdelivr.net/npm/seasonly@0/src/auto.js" data-locale="co" data-mode="banner+particles" data-message="30% off this Black Friday" data-cta-text="Shop" data-cta-href="/promos"> </script>
Why seasonly
Calendar-aware, not stopwatch-aware
Most particle libraries fire when you tell them to. seasonly resolves which theme should be active today against a pluggable calendar — and the calendar can be Colombian, Mexican, religious, or your own product's anniversary roster.
Moving holidays done right
Mother's Day is the 2nd Sunday of May, not 05-11. Father's Day is the 3rd Sunday of June, not 06-15. seasonly expresses these as rules so the date is correct every year — without manual updates.
Accessibility is not a toggle
prefers-reduced-motion: reduce turns off animations and renders the particles layer empty. Users with vestibular sensitivities set that preference precisely to suppress decorative motion — the right answer is to listen.
Zero deps, by contract
The library has zero runtime and zero dev dependencies. CI fails the build the moment a single dependency sneaks in. The whole source ships at ~20 KB gzipped.