Skip to content
shadcn.io

shadcn.io is not affiliated with official shadcn/ui

Radio Weekly Programme Profile Block for React

A radio presenter profile as the station's weekly programme: Monday to Sunday by hour as a table of shows that span their hours, a line at the fixed now, the show on air named, a card for each picked show, and day tabs on a small screen.

Framework
UI library

Preview

Preview width

Installation

Part of Pro
Pro unlocks the code and one-line install of every Pro button and text effect, plus the MCP for your AI editor.
Have Pro already? Sign in to open it.Opens here as soon as you're Pro.

Overview

Give a station its week as a grid, with this radio weekly programme profile for React with Base UI. A compact header holds the title and one sentence, and the wide hairline frame under it opens on the presenter: initials, name, role and station, and a dot and the words "On air: Drive Time". The grid is a native table with Monday to Sunday across and the hours from 06:00 to 22:00 down; each show is a cell that spans its hours, with its name and its time, and a heavy line crosses the grid at the fixed "now" (Friday 16:00, with the weekday worked out from the page's own date). Picking a show with a click or the arrow keys opens its card under the grid: its days and hours, its host, its genres and its last guest with the day they were on. Hours with no show are drawn blank and called music with no presenter. Below a large screen the grid becomes seven day Tabs, each a list of that day's shows and gaps, and both layouts share one pick. It's built from Tabs, Badge, Status, Avatar and Guides, with CSS only. The station, the shows, the hosts and the guests are invented. For a station page, a presenter's page or any profile with a weekly rota.

FAQ

How do I fill it with my own shows?

Edit SHOWS in the Ark file: each show has the days it airs (Monday is 0), the hour it starts, how many hours it runs, a host, two genres and its last guest with a day. The grid places every show with a cell that spans its hours, the day lists find the gaps between shows, and the card and the "On air" word are worked out from the data and the fixed date. Change AS_OF and NOW_HOUR to move the now line.

How is the now line placed, and does it move?

It is a fixed reading: the weekday comes from the date constant and the hour from NOW_HOUR, and the line is placed from the grid's own row height, so it always sits on the top edge of that hour's row. It doesn't tick: nothing reads the clock, so the page looks the same whenever it loads. In your app, feed it the real time and move the line from a timer or a server value.

How do I use the grid with a keyboard or a screen reader?

Every show cell holds a native radio, so Tab enters the grid at the picked show and the arrow keys step through the shows in table order, picking each. A screen reader hears the show, the day and the hours ("Drive Time, Friday, 16:00 to 19:00"). The picked show's other days are tinted so you can see where else it airs, and the card says which days. The now line is decoration; the "On air" word and the table's caption say the same thing in text.

What happens on a phone or a narrow screen?

Below 1024 pixels the grid is replaced by one row of day tabs that scrolls sideways, today's tab first selected, and a list of that day's shows in time order with the gaps named. Each list is the same height, so switching days moves nothing, and picking a show fills the same card. The tabs move between days with the arrow keys.

What stays local, and how do I wire it to real data?

Everything: picking a show only changes the card and the polite status line, and nothing plays, streams or is sent. To wire it up, load your station's schedule into SHOWS (a server component can pass it in), keep the helpers that place shows and find gaps, and replace the fixed "now" with the real time. Last guests are typed sample data.

Is it accessible?

The grid is a table with a caption, th cells for the days and hours, and today's column marked with aria-current="date". The state is never colour alone: the picked cell has a double ring, the on-air show has a word and a dot, and a gap says what it is. The status line is a polite live region present from the start. The table is laid out left to right in any language (it is a time axis), the names inside it are isolated for mixed scripts, and the entrance is a CSS fade that stops under reduced motion.

  • Pro

    A podcast host profile as a season grid: three seasons by up to ten episodes shaded in four weights by downloads or length, a triangle on each season's best, and a band with the picked episode's guest, date, length, downloads and its season's average.

  • Pro

    A DJ profile as upcoming gigs under month rules: venue, city, doors time in the city's own hours and genres on each row, a city menu and genre chips that narrow the list, sold-out nights with no ticket button, and an Add to calendar button that saves a real .ics file.

  • Pro

    A music listener profile with top artists by range: a start cell with the listener and facts from the history, and a segmented control that re-ranks ten artists in place with plays, a share bar and the move against the period before as a sign and an arrow.

  • Pro

    An animator profile as a frame scrubber: a drawn stage worked out from the frame number, a slider through 96 frames at 24 a second with the timecode and shot name, shots as buttons that jump to their first frame, and the credits.

  • Pro

    An architect profile as performance targets: tabs for three projects, each with energy, carbon and daylight targets drawn as bars with a tick, the figure reached, and Meets or Misses in words with a glyph, beside a rating worked out from the targets met.

  • Pro

    An author profile as a look inside: four books with drawn typographic covers, a read-only rating and an award badge, and a reading pane with a drop cap, a text size group and Next and Previous between two pages, beside a Follow toggle.