Built with VivekUI

This entire website is built with VivekUI, a free React component library with zero runtime dependencies.

No Tailwind, no shadcn, no MUI, no CSS-in-JS, and no chart library. One install, one CSS import, and the emerald accent you are looking at is seven custom properties in globals.css. Every row below deep-links to the component’s own documentation page.

npm i @the_viveksingh/vivek-ui
The climate charts need no chart library
The two “best time to visit” charts on every trip page are LineChart and BarChart, which ship inside VivekUI as pure inline SVG. Nothing is measured in the browser, so they render complete in the first HTML response — and each one emits a visually hidden <table> of the real numbers, so a screen reader gets the data rather than the word “graphic”. Recharts alone is roughly 100 kB; all six VivekUI charts together are 8.3 kB brotlied. See the charts documentation.

Section by section

46 rows, covering every part of the site.

Each section of the Wanderly template mapped to the VivekUI component that builds it, with a link to that component’s documentation.
Where on the siteComponentWhat it does here
Every page — top barSticky bar that collapses to a sheet on a narrow screen, with the “Built with VivekUI” badge
Every page — top barLight / dark / system, named after the action rather than the current state
Every page — footerLink columns in one named nav, plus the credit block
Every page — footerThe install command, with a live-region confirmation and a legacy fallback
Every page — feedbackTwo live regions mounted empty at boot, so the first toast is never dropped
Home — hero searchType-to-filter destination picker, ARIA activedescendant, focus never leaves the input
Home — hero searchText entry first, calendar popup second
Home — hero searchA real native select, so the platform picker is inherited
Home — hero searchOwns the label, hint and error wiring for all three controls above
Home — tickerZero-JS infinite ticker; stops on hover, on focus and under reduced motion
Home — destination wallThe six trips, with wide feature tiles alternating sides
Home — dealsCSS scroll-snap track that works with JavaScript disabled
Home — dealsGiven a server now, hydration-safe by construction — never reads the clock in render
Home — numbersA description list, so every figure is announced with what it measures
Home — numbersRenders the final value in server HTML, never a zero that hopefully animates
Home — numbersRead-only average as a single role="img", not six dead tab stops
Home — how it worksThree steps as an ordered list inside a nav landmark
Home — social prooffigure / blockquote / figcaption, the markup HTML actually defines for a quote
Home & trips — FAQNative <details>, so it opens with no JavaScript and no ARIA at all
Home — signupPromise-driven busy state, which is what actually stops a double submit
Home — closing askContainer-queried, so it stacks correctly in a narrow column
Destinations — comparisonThe six trips on the numbers, with a visually hidden caption naming the table
Destinations — search echoPoliteness picked from the tone, so it does not talk over the user
Trip page — galleryFive photographs, two at a time above 768px
Trip page — itineraryThe day-by-day. icon carries the day number, statusLabel fixes the announcement
Trip page — inclusionsDecorative in / out marks; the headings carry the meaning
Trip page — locationOpenStreetMap by default — no cookies set before the visitor has agreed to anything
Trip page — bookingFocus trapped, scroll locked, the rest of the page inert, focus returned on close
Trip page — bookingThe sticky booking rail, header / body / footer
Trip page — bookingA real <hr>, which already means "thematic break"
Trip page — bookingToken-based vertical rhythm inside the card, which has no gap of its own
Plan — interestsLive region announcing the whole tag list, and a spoken reason for every rejection
Plan — budgetBuilt on <input type="range">, so the keyboard and the slider role are the platform’s
Plan — no matchesThe glyph, the reason, and the two buttons that fix it
Plan — resultsResponsive columns compiled to custom properties — no CSS generated at render
Trip page — climateAverage high temperature by month. Pure inline SVG, rendered on the server
Trip page — climateRainfall in millimetres by month, with a visually hidden data table
Structure — everywhereLandmark, rhythm and the inner Container in one component
Structure — everywhereCentres content and caps its width with a responsive gutter
Structure — everywherelevel sets semantics, size sets appearance — separately, on purpose
Structure — everywhereBody copy with tone, size, weight and line clamping
Structure — everywhereThe trail, in compound form so each hop is a next/link
Structure — everywhereasChild hands the element to next/link, so a link stays an <a>
Structure — trip cardsThe wrapping badge row on every boarding-pass card
Footer & this pageThe install command, beside its CopyButton
Theme — root layoutOwns the theme, plus the blocking themeScript that prevents a wrong first paint

What is not in this project

The dependency list is the point. Run npm ls --omit=dev and this is all of it.

  • No Tailwind, no PostCSS plugin, no build-time CSS pipeline
  • No Radix, no CVA, no clsx
  • No Recharts, Chart.js, D3 or canvas — the charts are VivekUI
  • No Emotion or styled-components, so no runtime style computation
  • No icon package — the star rating and the status glyphs are CSS
  • Three dependencies in total: next, react, react-dom — plus VivekUI

Take it

MIT licensed. Clone it, swap data/trips.ts, change the accent tokens, ship it. The VivekUI credit in the footer is removable — a star on the repository is appreciated instead.

Read the DocsStar on GitHubUse this templateRead the template docsVivek Kumar Singh

Full guide — data model, theming, SEO, AEO and recipes — in DOCUMENTATION.md. Public repository: intellectwithvivek/wanderly · back to the trips