diff --git a/docs/CLAUDE.md b/docs/CLAUDE.md index 589d12a..7f6deda 100644 --- a/docs/CLAUDE.md +++ b/docs/CLAUDE.md @@ -77,7 +77,7 @@ Sinister Dexter band website - A modular, data-driven static site generator for ## Common Tasks ### 📅 Update Shows -1. Edit `public/data/shows.json` +1. Edit `template/data/shows.json` 2. Add show details in this format: ```json { @@ -97,6 +97,69 @@ Sinister Dexter band website - A modular, data-driven static site generator for 3. Run `npm run build:html` 4. Deploy: `./deploy.sh staging` then `./deploy.sh prod` +### 📸 Add Media to Past Shows +Past shows can include optional media (pictures, vertical videos, horizontal videos): +1. Edit `template/data/shows.json` +2. Add a `media` array to any past show: +```json +{ + "date": "2025-11-14", + "venue": "Club Fox", + "city": "Redwood City, CA", + "time": "7:00 PM - 11:00 PM", + "link": "https://clubfoxrwc.com/", + "media": [ + { + "type": "image", + "url": "https://cdn.sinister-dexter.com/photos/show-photo.jpg", + "alt": "Band performing at Club Fox" + }, + { + "type": "video-vertical", + "platform": "tiktok", + "videoId": "7573064485842242871", + "username": "@sindex_band", + "caption": "From our Nov 14, 2025 show at Club Fox!" + }, + { + "type": "video-horizontal", + "platform": "youtube", + "videoId": "xyz789" + } + ] +} +``` +**Media Types:** +- `image` - Photos from the show (displayed as square thumbnails) +- `video-vertical` - TikTok videos (uses official TikTok embed) +- `video-horizontal` - YouTube videos (iframe embed) + +**Required Fields by Type:** + +**Images:** +- `type`: "image" +- `url`: Direct image URL +- `alt`: Alt text for accessibility + +**TikTok Videos:** +- `type`: "video-vertical" +- `videoId`: TikTok video ID (the numeric ID from the URL) +- `username`: TikTok username (optional, defaults to @sindex_band) +- `caption`: Caption text (optional) +- `url`: Full TikTok URL (optional, auto-generated from videoId) + +**YouTube Videos:** +- `type`: "video-horizontal" +- `videoId`: YouTube video ID (the part after `v=` or in shorts URL) + +3. Run `npm run build:html` +4. Deploy changes + +**Note:** The TikTok embed component is located at `template/partials/components/tiktok-embed.hbs` and can be reused anywhere in templates with: +```handlebars +{{> components/tiktok-embed videoId="7573064485842242871" username="@sindex_band" caption="Optional caption"}} +``` + ### 👥 Update Band Members 1. Edit `public/data/members.json` 2. Add member data: diff --git a/package-lock.json b/package-lock.json index 3c2ec24..99e11cb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -279,6 +279,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -302,6 +303,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -1461,6 +1463,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001726", "electron-to-chromium": "^1.5.173", @@ -1873,6 +1876,7 @@ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", "license": "MIT", + "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/kossnocorp" @@ -2981,6 +2985,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -4287,6 +4292,7 @@ "integrity": "sha512-t/OMHBNAkknVCI7bVB9OWjUUAwhVv9vsPIAGnNUxnu3FxPQN11rjh0sksLMzc3g7IlTgvHmOTl4JM7JHpcv5wA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "defu": "^6.1.4", "exsolve": "^1.0.7", @@ -4421,6 +4427,7 @@ "dev": true, "hasInstallScript": true, "license": "Apache-2.0", + "peer": true, "bin": { "workerd": "bin/workerd" }, diff --git a/public/index.html b/public/index.html index b99df1f..020d9dd 100644 --- a/public/index.html +++ b/public/index.html @@ -237,20 +237,20 @@ "event": [ { "@type": "MusicEvent", - "@id": "https://sinisterdexter.net#event-2025-11-14-club-fox", - "name": "Friday Night Funk", - "description": "Friday night funk at the legendary Club Fox venue", - "startDate": "2025-11-14T19:00:00-08:00", - "endDate": "2025-11-14T23:00:00-08:00", + "@id": "https://sinisterdexter.net#event-2026-09-02-albany-community-center", + "name": "City of Albany's Concert in the Park", + "description": "Free outdoor summer concert series in Albany", + "startDate": "", + "location": { "@type": "Place", - "name": "Club Fox", + "name": "Albany Community Center", "address": { "@type": "PostalAddress", - "streetAddress": "2209 Broadway", - "addressLocality": "Redwood City", + "streetAddress": "1249 Marin Ave", + "addressLocality": "Albany", "addressRegion": "CA", - "postalCode": "94063", + "postalCode": "94706", "addressCountry": "US" } }, @@ -258,16 +258,10 @@ "@type": "MusicGroup", "@id": "https://sinisterdexter.net#band" }, - "offers": { - "@type": "Offer", - "url": "https://www.eventbrite.com/e/sinister-dexter-funk-soul-horns-tickets-1568339939979?aff=ebdssbdestsearch", - "price": "20", - "priceCurrency": "USD", - "availability": "https://schema.org/InStock" - }, + "isAccessibleForFree": true, "eventStatus": "https://schema.org/EventScheduled", "eventAttendanceMode": "https://schema.org/OfflineEventAttendanceMode", - "url": "https://clubfoxrwc.com/" + "url": "https://www.albanyca.gov/City-Calendar/2025/Aug-13-Concert-in-the-Park" } ] } Skip to main content
Sinister Dexter full band

Sinister Dexter

The Right to Be Funky

11-piece soul machine bringing the unique sound of great funk horn bands to the San Francisco Bay Area

Upcoming Shows

7 - 11pm

Friday Night Funk

Friday night funk at the legendary Club Fox venue

PAST SHOWS

Blue Oak Brewing Company San Carlos, CA
3:00 PM - 6:00 PM
Bernal Heights
12:00 PM - 2:00 PM
Redwood City Music in the Park Redwood City, CA
5:30 PM - 7:30 PM

Listen to Our Tracks

Track Listing

All original songs licensed under Creative Commons BY-NC-SA 2.0

Live Performances

Son of a Preacher Man (Dusty Springfield) - Live performance thumbnail

Son of a Preacher Man (Dusty Springfield)

Live at Redwood City Music In The Park, 2022

I Can't Stand The Rain (Ann Peebles) - Live performance thumbnail

I Can't Stand The Rain (Ann Peebles)

Live at Club Fox, 2012

Broadband Connection (Sinister Dexter) - Live performance thumbnail

Broadband Connection (Sinister Dexter)

Live at Club Fox, 2012

LA (Couch) - Live performance thumbnail

LA (Couch)

Blue Oak Brewery, 2025

Who Knows Who (Orgone) - Live performance thumbnail

Who Knows Who (Orgone)

Live at Redwood City Music In The Park, 2023

About the Band

Over 25 Years of Funk

Formed in the summer of 1998 by members of the Stanford Band, Sinister Dexter was created to fill the need for a great local party band. Started by horn players, we put together a band that we wanted to go see – which of course meant a horn-heavy sound and classic funk music inspired by Tower of Power and the Blues Brothers.

We started by playing college parties and small Bay Area clubs like the Quarter Note in Sunnyvale and Blue Chalk Cafe in Palo Alto. In May 2004, we got our first chance to play in San Francisco at the legendary Lost & Found Saloon, where we became regulars and played a sold-out New Year's Eve show to close out 2004.

As the band matured, we expanded into blues, rock, ska, and Latin jazz – anything with a solid groove that we could put great horn parts to. In 2004, we recorded and self-produced our debut CD, Dexterity, featuring 16 original tracks spanning all the genres we'd explored over the years.

In mid-2005, lightning struck when we recruited the incredible Rebecca Lipon as our new lead vocalist. A founding member of the jazz quartet Off Beats with over 15 years of opera and musical theater training, Rebecca forced us to take things to the next level. We refined our sound, trimmed the fat, and got back to our core concept as a funk and soul band.

Today, we're an 11-piece soul machine featuring Rebecca's powerhouse vocals, a hot six-piece horn section, and a rock-solid rhythm section. Our high-energy shows have been described as "Tower of Power, Ozomatli, and Joss Stone in a blender" – bringing the right to be funky to venues throughout the Bay Area.

Tower of Power, Ozomatli, and Joss Stone in a blender

— Mountain View Voice

The Band

11 talented musicians bringing you the finest funk and soul

Rebecca Lipon Weekly

Rebecca Lipon Weekly

🎤 Lead Vocals

Rebecca's love of singing started with Sesame Street, much to her siblings' chagrin, and it never stopped. She was a founding member of the Off Beats, a Jazz quartet, in her late teens, studied opera and musical theater styles for over 15 years, and performed professionally with theater groups in Northern California, Boston and New York. She has been Sinister Dexter's lead singer since 2005, and loves the mix of soul, funk and blues music.

Since 2005

Daniel Walling

Daniel Walling

🎹 Keyboard

Daniel started playing piano like everyone else, because Mom made him take lessons. But then he got hooked, switching from classical to jazz in high school, playing in various jazz combos in college, and in 2004 switching again to funky tasty groovaliciousness with sindex. Critics have described his organ solos as "really f*#$ing loud".

Since 2004

David Mitby

David Mitby

🎸 Bass

Matt Spitz

Matt Spitz

🎸 Guitar

Matt plays guitar, has performed in 38 states, and recently won a Grammy. As of this writing, at least one of those statements is correct. This is his second tour of duty with SinDex after a decade hiatus in New York City.

Jon Wagner
F

Jon Wagner

🥁 Drums

Kevin Wooley
F

Kevin Wooley

🎷 Tenor Sax

Kevin is a founding member of Sinister Dexter and the defacto manager. He's been playing tenor sax since he was 12 years old in jazz groups, symphonic orchestras, and marching bands. He also plays clarinet and soprano sax, but Kenny G ruined that instrument for everyone. Because of his love for music from the sixties and seventies (and disgust with music from the eighties and nineties), he often thinks he was born a couple of decades too late. By day, Kevin is an Oscar-winning engineer for Industrial Light & Magic.

Don Hoffman
F

Don Hoffman

🎺 Lead Trombone

Don's been playing for over 30 years, and his background covers everything from jazz to musical pit orchestras, and symphony to marching bands. He's one of the founding members of Sinister Dexter, and enjoys occasionally playing with other Bay Area bands including Foreverland (which was even better when it was Neverland), which he was also a founding member of.

Josh Schiller
F

Josh Schiller

🎺 Bass Trombone

Josh has been playing bone for a very long time. You could even say it pays him more than anything else he does, especially since he's currently enjoying a life of leisure.

Patrick Neschleba
F

Patrick Neschleba

🎷 Alto & Bari Sax

Patrick has been performing on saxophone for 40 years, and after many years playing trumpet with the Stanford Band, you might see him picking that up for a few songs as well! Patrick wrote the founding email for the band and played a major role in our early direction, music, management, and recording. After a brief hiatus while raising young kids, he returned full-time several years ago and added bari sax to his repertiore. In his day job, Patrick has enjoyed a long career in various leadership roles in the semiconductor industry.

Adam Elman
F

Adam Elman

🎺 Trumpet

Adam is a founding member of Sinister Dexter and is glad to be playing with them again after a brief 14-year hiatus. Starting as a trombone player in bands and orchestras in 9th grade, Adam picked up trumpet after college and decided to stick with it when SinDex began, both because the band already had two great trombone players and because it's way easier to carry a trumpet around. In the rare moments when he's not busy helping raise a kid or designing voice experiences for a large tech company, he likes to arrange and occasionally compose original music.

Lori Karns

Lori Karns

🎺 Trumpet

Stay Connected

Follow Us

Stream Our Music

Join Our Mailing List

Get updates on upcoming shows, new music, and exclusive content!

Send an email to subscribe:

Subscribe to Mailing List

Or email: gigs-subscribe@sinisterdexter.net

Book the Band

Available for clubs, festivals, corporate events, and private parties

Contact for Booking

Email: booking@sinisterdexter.net

No track selected
\ No newline at end of file + } Skip to main content

Sinister Dexter

The Right to Be Funky

11-piece soul machine bringing the unique sound of great funk horn bands to the San Francisco Bay Area

Upcoming Shows

Corporate Holiday Party

City of Albany's Concert in the Park

Albany Community Center

Free outdoor summer concert series in Albany

PAST SHOWS

Club Fox Redwood City, CA
7:00 PM - 11:00 PM
@sindex_band

From our Nov 14, 2025 show at Club Fox!

Blue Oak Brewing Company San Carlos, CA
3:00 PM - 6:00 PM
Bernal Heights
12:00 PM - 2:00 PM

Listen to Our Tracks

Track Listing

All original songs licensed under Creative Commons BY-NC-SA 2.0

Live Performances

Son of a Preacher Man (Dusty Springfield) - Live performance thumbnail

Son of a Preacher Man (Dusty Springfield)

Live at Redwood City Music In The Park, 2022

I Can't Stand The Rain (Ann Peebles) - Live performance thumbnail

I Can't Stand The Rain (Ann Peebles)

Live at Club Fox, 2012

Broadband Connection (Sinister Dexter) - Live performance thumbnail

Broadband Connection (Sinister Dexter)

Live at Club Fox, 2012

LA (Couch) - Live performance thumbnail

LA (Couch)

Blue Oak Brewery, 2025

Who Knows Who (Orgone) - Live performance thumbnail

Who Knows Who (Orgone)

Live at Redwood City Music In The Park, 2023

About the Band

Over 25 Years of Funk

Formed in the summer of 1998 by members of the Stanford Band, Sinister Dexter was created to fill the need for a great local party band. Started by horn players, we put together a band that we wanted to go see – which of course meant a horn-heavy sound and classic funk music inspired by Tower of Power and the Blues Brothers.

We started by playing college parties and small Bay Area clubs like the Quarter Note in Sunnyvale and Blue Chalk Cafe in Palo Alto. In May 2004, we got our first chance to play in San Francisco at the legendary Lost & Found Saloon, where we became regulars and played a sold-out New Year's Eve show to close out 2004.

As the band matured, we expanded into blues, rock, ska, and Latin jazz – anything with a solid groove that we could put great horn parts to. In 2004, we recorded and self-produced our debut CD, Dexterity, featuring 16 original tracks spanning all the genres we'd explored over the years.

In mid-2005, lightning struck when we recruited the incredible Rebecca Lipon as our new lead vocalist. A founding member of the jazz quartet Off Beats with over 15 years of opera and musical theater training, Rebecca forced us to take things to the next level. We refined our sound, trimmed the fat, and got back to our core concept as a funk and soul band.

Today, we're an 11-piece soul machine featuring Rebecca's powerhouse vocals, a hot six-piece horn section, and a rock-solid rhythm section. Our high-energy shows have been described as "Tower of Power, Ozomatli, and Joss Stone in a blender" – bringing the right to be funky to venues throughout the Bay Area.

Tower of Power, Ozomatli, and Joss Stone in a blender

— Mountain View Voice

The Band

11 talented musicians bringing you the finest funk and soul

Rebecca Lipon Weekly

Rebecca Lipon Weekly

🎤 Lead Vocals

Rebecca's love of singing started with Sesame Street, much to her siblings' chagrin, and it never stopped. She was a founding member of the Off Beats, a Jazz quartet, in her late teens, studied opera and musical theater styles for over 15 years, and performed professionally with theater groups in Northern California, Boston and New York. She has been Sinister Dexter's lead singer since 2005, and loves the mix of soul, funk and blues music.

Since 2005

Daniel Walling

Daniel Walling

🎹 Keyboard

Daniel started playing piano like everyone else, because Mom made him take lessons. But then he got hooked, switching from classical to jazz in high school, playing in various jazz combos in college, and in 2004 switching again to funky tasty groovaliciousness with sindex. Critics have described his organ solos as "really f*#$ing loud".

Since 2004

David Mitby

David Mitby

🎸 Bass

Matt Spitz

Matt Spitz

🎸 Guitar

Matt plays guitar, has performed in 38 states, and recently won a Grammy. As of this writing, at least one of those statements is correct. This is his second tour of duty with SinDex after a decade hiatus in New York City.

Jon Wagner
F

Jon Wagner

🥁 Drums

Kevin Wooley
F

Kevin Wooley

🎷 Tenor Sax

Kevin is a founding member of Sinister Dexter and the defacto manager. He's been playing tenor sax since he was 12 years old in jazz groups, symphonic orchestras, and marching bands. He also plays clarinet and soprano sax, but Kenny G ruined that instrument for everyone. Because of his love for music from the sixties and seventies (and disgust with music from the eighties and nineties), he often thinks he was born a couple of decades too late. By day, Kevin is an Oscar-winning engineer for Industrial Light & Magic.

Don Hoffman
F

Don Hoffman

🎺 Lead Trombone

Don's been playing for over 30 years, and his background covers everything from jazz to musical pit orchestras, and symphony to marching bands. He's one of the founding members of Sinister Dexter, and enjoys occasionally playing with other Bay Area bands including Foreverland (which was even better when it was Neverland), which he was also a founding member of.

Josh Schiller
F

Josh Schiller

🎺 Bass Trombone

Josh has been playing bone for a very long time. You could even say it pays him more than anything else he does, especially since he's currently enjoying a life of leisure.

Patrick Neschleba
F

Patrick Neschleba

🎷 Alto & Bari Sax

Patrick has been performing on saxophone for 40 years, and after many years playing trumpet with the Stanford Band, you might see him picking that up for a few songs as well! Patrick wrote the founding email for the band and played a major role in our early direction, music, management, and recording. After a brief hiatus while raising young kids, he returned full-time several years ago and added bari sax to his repertiore. In his day job, Patrick has enjoyed a long career in various leadership roles in the semiconductor industry.

Adam Elman
F

Adam Elman

🎺 Trumpet

Adam is a founding member of Sinister Dexter and is glad to be playing with them again after a brief 14-year hiatus. Starting as a trombone player in bands and orchestras in 9th grade, Adam picked up trumpet after college and decided to stick with it when SinDex began, both because the band already had two great trombone players and because it's way easier to carry a trumpet around. In the rare moments when he's not busy helping raise a kid or designing voice experiences for a large tech company, he likes to arrange and occasionally compose original music.

Lori Karns

Lori Karns

🎺 Trumpet

Stay Connected

Follow Us

Stream Our Music

Join Our Mailing List

Get updates on upcoming shows, new music, and exclusive content!

Send an email to subscribe:

Subscribe to Mailing List

Or email: gigs-subscribe@sinisterdexter.net

Book the Band

Available for clubs, festivals, corporate events, and private parties

Contact for Booking

Email: booking@sinisterdexter.net

No track selected
\ No newline at end of file diff --git a/public/styles.css b/public/styles.css index d7486cd..2ead84a 100644 --- a/public/styles.css +++ b/public/styles.css @@ -1 +1 @@ -*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-tap-highlight-color:transparent}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{color:inherit;font-family:inherit;font-feature-settings:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af;opacity:1}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]:where(:not([hidden=until-found])){display:none}@font-face{font-display:swap;font-family:Bebas Neue;font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/bebasneue/v2/JTUSjIg69CK48gW7PXoo9Wlhyw.woff2) format("woff2")}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.gradient-text{background:linear-gradient(135deg,#9333ea,#f59e0b);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.bebas{font-family:Bebas Neue,Arial Narrow,Helvetica Condensed,Arial,sans-serif}.hero-overlay{background:radial-gradient(ellipse at center,transparent 0,rgba(0,0,0,.4) 100%)}.nav-link{transition-duration:.2s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.track-item.active{border-left-width:4px;--tw-border-opacity:1;background-color:rgba(88,28,135,.5);border-color:rgb(192 132 252/var(--tw-border-opacity,1))}@keyframes fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.sr-only{height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;clip:rect(0,0,0,0);border-width:0;white-space:nowrap}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.-left-4{left:-1rem}.-top-8{top:-2rem}.bottom-0{bottom:0}.bottom-20{bottom:5rem}.bottom-8{bottom:2rem}.left-0{left:0}.left-1\/2{left:50%}.left-10{left:2.5rem}.right-0{right:0}.right-10{right:2.5rem}.right-4{right:1rem}.top-0{top:0}.top-1\/2{top:50%}.top-20{top:5rem}.top-4{top:1rem}.top-full{top:100%}.-z-10{z-index:-10}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.z-\[100\]{z-index:100}.z-\[101\]{z-index:101}.z-\[60\]{z-index:60}.col-span-full{grid-column:1/-1}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-12{margin-bottom:3rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-0\.5{margin-left:.125rem}.ml-2{margin-left:.5rem}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mt-1{margin-top:.25rem}.mt-12{margin-top:3rem}.mt-16{margin-top:4rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1/1}.aspect-video{aspect-ratio:16/9}.h-1\.5{height:.375rem}.h-16{height:4rem}.h-2\.5{height:.625rem}.h-32{height:8rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-full{height:100%}.h-screen{height:100vh}.max-h-full{max-height:100%}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.w-16{width:4rem}.w-2\.5{width:.625rem}.w-32{width:8rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-8{width:2rem}.w-80{width:20rem}.w-full{width:100%}.min-w-0{min-width:0}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-6xl{max-width:72rem}.max-w-7xl{max-width:80rem}.max-w-full{max-width:100%}.max-w-md{max-width:28rem}.flex-1{flex:1 1 0%}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,.-translate-y-1\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y:-50%}.-rotate-12{--tw-rotate:-12deg}.-rotate-12,.rotate-12{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-12{--tw-rotate:12deg}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}}.animate-bounce{animation:bounce 1s infinite}.cursor-help{cursor:help}.cursor-pointer{cursor:pointer}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(2rem*var(--tw-space-x-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.75rem*var(--tw-space-y-reverse));margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)))}.overflow-hidden,.truncate{overflow:hidden}.truncate{text-overflow:ellipsis}.truncate,.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-t{border-top-width:1px}.border-amber-500{--tw-border-opacity:1;border-color:rgb(245 158 11/var(--tw-border-opacity,1))}.border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity,1))}.border-gray-800{--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity,1))}.border-purple-500{--tw-border-opacity:1;border-color:rgb(168 85 247/var(--tw-border-opacity,1))}.border-purple-500\/30{border-color:rgba(168,85,247,.3)}.border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity,1))}.bg-amber-500{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity,1))}.bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.bg-black\/30{background-color:rgba(0,0,0,.3)}.bg-black\/60{background-color:rgba(0,0,0,.6)}.bg-black\/90{background-color:rgba(0,0,0,.9)}.bg-black\/95{background-color:rgba(0,0,0,.95)}.bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.bg-gray-900\/30{background-color:rgba(17,24,39,.3)}.bg-gray-900\/50{background-color:rgba(17,24,39,.5)}.bg-green-600{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.bg-purple-600{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity,1))}.bg-purple-900\/30{background-color:rgba(88,28,135,.3)}.bg-red-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-black{--tw-gradient-from:#000 var(--tw-gradient-from-position);--tw-gradient-to:transparent var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-purple-600{--tw-gradient-from:#9333ea var(--tw-gradient-from-position);--tw-gradient-to:rgba(147,51,234,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-purple-900\/30{--tw-gradient-from:rgba(88,28,135,.3) var(--tw-gradient-from-position);--tw-gradient-to:rgba(88,28,135,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-purple-900\/40{--tw-gradient-from:rgba(88,28,135,.4) var(--tw-gradient-from-position);--tw-gradient-to:rgba(88,28,135,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-purple-900\/60{--tw-gradient-from:rgba(88,28,135,.6) var(--tw-gradient-from-position);--tw-gradient-to:rgba(88,28,135,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-purple-950\/30{--tw-gradient-from:rgba(59,7,100,.3) var(--tw-gradient-from-position);--tw-gradient-to:rgba(59,7,100,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.to-amber-500{--tw-gradient-to:#f59e0b var(--tw-gradient-to-position)}.to-amber-900\/30{--tw-gradient-to:rgba(120,53,15,.3) var(--tw-gradient-to-position)}.to-amber-900\/40{--tw-gradient-to:rgba(120,53,15,.4) var(--tw-gradient-to-position)}.to-amber-900\/60{--tw-gradient-to:rgba(120,53,15,.6) var(--tw-gradient-to-position)}.to-black{--tw-gradient-to:#000 var(--tw-gradient-to-position)}.to-purple-800{--tw-gradient-to:#6b21a8 var(--tw-gradient-to-position)}.to-purple-950\/30{--tw-gradient-to:rgba(59,7,100,.3) var(--tw-gradient-to-position)}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.object-center{-o-object-position:center;object-position:center}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-20{padding-bottom:5rem;padding-top:5rem}.py-3{padding-bottom:.75rem;padding-top:.75rem}.py-4{padding-bottom:1rem;padding-top:1rem}.py-8{padding-bottom:2rem;padding-top:2rem}.pb-4{padding-bottom:1rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-\[\'Inter\'\]{font-family:Inter}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.font-sans{font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-5xl{font-size:3rem;line-height:1}.text-6xl{font-size:3.75rem;line-height:1}.text-\[10px\]{font-size:10px}.text-\[150px\]{font-size:150px}.text-\[200px\]{font-size:200px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-light{font-weight:300}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.tracking-wider{letter-spacing:.05em}.text-amber-400{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity,1))}.text-amber-500{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity,1))}.text-amber-500\/10{color:rgba(245,158,11,.1)}.text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.text-green-400{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity,1))}.text-purple-400{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity,1))}.text-purple-500\/10{color:rgba(168,85,247,.1)}.text-purple-500\/30{color:rgba(168,85,247,.3)}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.underline{text-decoration-line:underline}.opacity-0{opacity:0}.opacity-70{opacity:.7}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-lg,.shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.outline{outline-style:solid}.ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring,.ring-2{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-purple-500{--tw-ring-opacity:1;--tw-ring-color:rgb(168 85 247/var(--tw-ring-opacity,1))}.blur{--tw-blur:blur(8px)}.blur,.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-md{--tw-backdrop-blur:blur(12px)}.backdrop-blur-md,.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-opacity{transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-transform{transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-300{transition-duration:.3s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.last\:border-0:last-child{border-width:0}.hover\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05}.hover\:scale-105:hover,.hover\:scale-125:hover{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:scale-125:hover{--tw-scale-x:1.25;--tw-scale-y:1.25}.hover\:border-purple-400:hover{--tw-border-opacity:1;border-color:rgb(192 132 252/var(--tw-border-opacity,1))}.hover\:bg-amber-500:hover{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity,1))}.hover\:bg-amber-600:hover{--tw-bg-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity,1))}.hover\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.hover\:bg-green-700:hover{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.hover\:bg-purple-700:hover{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity,1))}.hover\:bg-purple-900\/30:hover{background-color:rgba(88,28,135,.3)}.hover\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.hover\:from-purple-700:hover{--tw-gradient-from:#7e22ce var(--tw-gradient-from-position);--tw-gradient-to:rgba(126,34,206,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.hover\:to-purple-900:hover{--tw-gradient-to:#581c87 var(--tw-gradient-to-position)}.hover\:text-black:hover{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.hover\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.hover\:text-purple-300:hover{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity,1))}.hover\:text-purple-400:hover{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity,1))}.hover\:text-white:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.hover\:opacity-100:hover{opacity:1}.focus\:not-sr-only:focus{height:auto;margin:0;overflow:visible;padding:0;position:static;width:auto;clip:auto;white-space:normal}.focus\:absolute:focus{position:absolute}.focus\:left-4:focus{left:1rem}.focus\:top-4:focus{top:1rem}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-purple-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(192 132 252/var(--tw-ring-opacity,1))}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-purple-400:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgb(192 132 252/var(--tw-ring-opacity,1))}.group\/badge:hover .group-hover\/badge\:block{display:block}.group:hover .group-hover\:scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05}.group:hover .group-hover\:scale-105,.group:hover .group-hover\:scale-110{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:scale-110{--tw-scale-x:1.1;--tw-scale-y:1.1}.group:hover .group-hover\:border-purple-400{--tw-border-opacity:1;border-color:rgb(192 132 252/var(--tw-border-opacity,1))}.group:hover .group-hover\:bg-black\/40{background-color:rgba(0,0,0,.4)}.group:hover .group-hover\:opacity-100{opacity:1}@media (min-width:640px){.sm\:mt-0{margin-top:0}.sm\:block{display:block}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}}@media (min-width:768px){.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:h-8{height:2rem}.md\:w-8{width:2rem}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:gap-3{gap:.75rem}.md\:p-4{padding:1rem}.md\:px-3{padding-left:.75rem;padding-right:.75rem}.md\:px-4{padding-left:1rem;padding-right:1rem}.md\:py-4{padding-bottom:1rem;padding-top:1rem}.md\:text-3xl{font-size:1.875rem;line-height:2.25rem}.md\:text-5xl{font-size:3rem;line-height:1}.md\:text-6xl{font-size:3.75rem;line-height:1}.md\:text-8xl{font-size:6rem;line-height:1}.md\:text-\[200px\]{font-size:200px}.md\:text-lg{font-size:1.125rem;line-height:1.75rem}.md\:text-xl{font-size:1.25rem;line-height:1.75rem}}@media (min-width:1024px){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:text-9xl{font-size:8rem;line-height:1}} \ No newline at end of file +*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-tap-highlight-color:transparent}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{color:inherit;font-family:inherit;font-feature-settings:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af;opacity:1}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]:where(:not([hidden=until-found])){display:none}@font-face{font-display:swap;font-family:Bebas Neue;font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/bebasneue/v2/JTUSjIg69CK48gW7PXoo9Wlhyw.woff2) format("woff2")}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.gradient-text{background:linear-gradient(135deg,#9333ea,#f59e0b);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.bebas{font-family:Bebas Neue,Arial Narrow,Helvetica Condensed,Arial,sans-serif}.hero-overlay{background:radial-gradient(ellipse at center,transparent 0,rgba(0,0,0,.4) 100%)}.nav-link{transition-duration:.2s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.track-item.active{border-left-width:4px;--tw-border-opacity:1;background-color:rgba(88,28,135,.5);border-color:rgb(192 132 252/var(--tw-border-opacity,1))}@keyframes fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.sr-only{height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;clip:rect(0,0,0,0);border-width:0;white-space:nowrap}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.-left-4{left:-1rem}.-top-8{top:-2rem}.bottom-0{bottom:0}.bottom-20{bottom:5rem}.bottom-8{bottom:2rem}.left-0{left:0}.left-1\/2{left:50%}.left-10{left:2.5rem}.right-0{right:0}.right-10{right:2.5rem}.right-4{right:1rem}.top-0{top:0}.top-1\/2{top:50%}.top-20{top:5rem}.top-4{top:1rem}.top-full{top:100%}.-z-10{z-index:-10}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.z-\[100\]{z-index:100}.z-\[101\]{z-index:101}.z-\[60\]{z-index:60}.col-span-full{grid-column:1/-1}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-12{margin-bottom:3rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-0\.5{margin-left:.125rem}.ml-2{margin-left:.5rem}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mt-1{margin-top:.25rem}.mt-12{margin-top:3rem}.mt-16{margin-top:4rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.aspect-\[9\/16\]{aspect-ratio:9/16}.aspect-square{aspect-ratio:1/1}.aspect-video{aspect-ratio:16/9}.h-1\.5{height:.375rem}.h-16{height:4rem}.h-2\.5{height:.625rem}.h-32{height:8rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-full{height:100%}.h-screen{height:100vh}.max-h-full{max-height:100%}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.w-16{width:4rem}.w-2\.5{width:.625rem}.w-32{width:8rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-8{width:2rem}.w-80{width:20rem}.w-full{width:100%}.min-w-0{min-width:0}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-6xl{max-width:72rem}.max-w-7xl{max-width:80rem}.max-w-full{max-width:100%}.max-w-md{max-width:28rem}.flex-1{flex:1 1 0%}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,.-translate-y-1\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y:-50%}.-rotate-12{--tw-rotate:-12deg}.-rotate-12,.rotate-12{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-12{--tw-rotate:12deg}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}}.animate-bounce{animation:bounce 1s infinite}.cursor-help{cursor:help}.cursor-pointer{cursor:pointer}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(2rem*var(--tw-space-x-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.75rem*var(--tw-space-y-reverse));margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)))}.overflow-hidden,.truncate{overflow:hidden}.truncate{text-overflow:ellipsis}.truncate,.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-t{border-top-width:1px}.border-amber-500{--tw-border-opacity:1;border-color:rgb(245 158 11/var(--tw-border-opacity,1))}.border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity,1))}.border-gray-800{--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity,1))}.border-purple-500{--tw-border-opacity:1;border-color:rgb(168 85 247/var(--tw-border-opacity,1))}.border-purple-500\/30{border-color:rgba(168,85,247,.3)}.border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity,1))}.bg-amber-500{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity,1))}.bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.bg-black\/30{background-color:rgba(0,0,0,.3)}.bg-black\/60{background-color:rgba(0,0,0,.6)}.bg-black\/90{background-color:rgba(0,0,0,.9)}.bg-black\/95{background-color:rgba(0,0,0,.95)}.bg-cyan-600{--tw-bg-opacity:1;background-color:rgb(8 145 178/var(--tw-bg-opacity,1))}.bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.bg-gray-900\/30{background-color:rgba(17,24,39,.3)}.bg-gray-900\/50{background-color:rgba(17,24,39,.5)}.bg-green-600{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.bg-purple-600{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity,1))}.bg-purple-900\/30{background-color:rgba(88,28,135,.3)}.bg-red-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.bg-rose-600{--tw-bg-opacity:1;background-color:rgb(225 29 72/var(--tw-bg-opacity,1))}.bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-black{--tw-gradient-from:#000 var(--tw-gradient-from-position);--tw-gradient-to:transparent var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-purple-600{--tw-gradient-from:#9333ea var(--tw-gradient-from-position);--tw-gradient-to:rgba(147,51,234,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-purple-900\/30{--tw-gradient-from:rgba(88,28,135,.3) var(--tw-gradient-from-position);--tw-gradient-to:rgba(88,28,135,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-purple-900\/40{--tw-gradient-from:rgba(88,28,135,.4) var(--tw-gradient-from-position);--tw-gradient-to:rgba(88,28,135,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-purple-900\/60{--tw-gradient-from:rgba(88,28,135,.6) var(--tw-gradient-from-position);--tw-gradient-to:rgba(88,28,135,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-purple-950\/30{--tw-gradient-from:rgba(59,7,100,.3) var(--tw-gradient-from-position);--tw-gradient-to:rgba(59,7,100,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.to-amber-500{--tw-gradient-to:#f59e0b var(--tw-gradient-to-position)}.to-amber-900\/30{--tw-gradient-to:rgba(120,53,15,.3) var(--tw-gradient-to-position)}.to-amber-900\/40{--tw-gradient-to:rgba(120,53,15,.4) var(--tw-gradient-to-position)}.to-amber-900\/60{--tw-gradient-to:rgba(120,53,15,.6) var(--tw-gradient-to-position)}.to-black{--tw-gradient-to:#000 var(--tw-gradient-to-position)}.to-purple-800{--tw-gradient-to:#6b21a8 var(--tw-gradient-to-position)}.to-purple-950\/30{--tw-gradient-to:rgba(59,7,100,.3) var(--tw-gradient-to-position)}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.object-center{-o-object-position:center;object-position:center}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-20{padding-bottom:5rem;padding-top:5rem}.py-3{padding-bottom:.75rem;padding-top:.75rem}.py-4{padding-bottom:1rem;padding-top:1rem}.py-8{padding-bottom:2rem;padding-top:2rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pt-2{padding-top:.5rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-\[\'Inter\'\]{font-family:Inter}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.font-sans{font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-5xl{font-size:3rem;line-height:1}.text-6xl{font-size:3.75rem;line-height:1}.text-\[10px\]{font-size:10px}.text-\[150px\]{font-size:150px}.text-\[200px\]{font-size:200px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-light{font-weight:300}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.tracking-wider{letter-spacing:.05em}.text-amber-400{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity,1))}.text-amber-500{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity,1))}.text-amber-500\/10{color:rgba(245,158,11,.1)}.text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.text-green-400{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity,1))}.text-purple-400{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity,1))}.text-purple-500\/10{color:rgba(168,85,247,.1)}.text-purple-500\/30{color:rgba(168,85,247,.3)}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.underline{text-decoration-line:underline}.opacity-0{opacity:0}.opacity-70{opacity:.7}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-lg,.shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.outline{outline-style:solid}.ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring,.ring-2{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-purple-500{--tw-ring-opacity:1;--tw-ring-color:rgb(168 85 247/var(--tw-ring-opacity,1))}.blur{--tw-blur:blur(8px)}.blur,.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-md{--tw-backdrop-blur:blur(12px)}.backdrop-blur-md,.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-opacity{transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-transform{transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-300{transition-duration:.3s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.last\:border-0:last-child{border-width:0}.hover\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05}.hover\:scale-105:hover,.hover\:scale-125:hover{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:scale-125:hover{--tw-scale-x:1.25;--tw-scale-y:1.25}.hover\:border-purple-400:hover{--tw-border-opacity:1;border-color:rgb(192 132 252/var(--tw-border-opacity,1))}.hover\:bg-amber-500:hover{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity,1))}.hover\:bg-amber-600:hover{--tw-bg-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity,1))}.hover\:bg-cyan-700:hover{--tw-bg-opacity:1;background-color:rgb(14 116 144/var(--tw-bg-opacity,1))}.hover\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.hover\:bg-green-700:hover{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.hover\:bg-purple-700:hover{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity,1))}.hover\:bg-purple-900\/30:hover{background-color:rgba(88,28,135,.3)}.hover\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.hover\:bg-rose-700:hover{--tw-bg-opacity:1;background-color:rgb(190 18 60/var(--tw-bg-opacity,1))}.hover\:from-purple-700:hover{--tw-gradient-from:#7e22ce var(--tw-gradient-from-position);--tw-gradient-to:rgba(126,34,206,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.hover\:to-purple-900:hover{--tw-gradient-to:#581c87 var(--tw-gradient-to-position)}.hover\:text-black:hover{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.hover\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.hover\:text-purple-300:hover{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity,1))}.hover\:text-purple-400:hover{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity,1))}.hover\:text-white:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.hover\:opacity-100:hover{opacity:1}.focus\:not-sr-only:focus{height:auto;margin:0;overflow:visible;padding:0;position:static;width:auto;clip:auto;white-space:normal}.focus\:absolute:focus{position:absolute}.focus\:left-4:focus{left:1rem}.focus\:top-4:focus{top:1rem}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-purple-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(192 132 252/var(--tw-ring-opacity,1))}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-purple-400:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgb(192 132 252/var(--tw-ring-opacity,1))}.group\/badge:hover .group-hover\/badge\:block{display:block}.group:hover .group-hover\:scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05}.group:hover .group-hover\:scale-105,.group:hover .group-hover\:scale-110{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:scale-110{--tw-scale-x:1.1;--tw-scale-y:1.1}.group:hover .group-hover\:border-purple-400{--tw-border-opacity:1;border-color:rgb(192 132 252/var(--tw-border-opacity,1))}.group:hover .group-hover\:bg-black\/40{background-color:rgba(0,0,0,.4)}.group:hover .group-hover\:opacity-100{opacity:1}@media (min-width:640px){.sm\:mt-0{margin-top:0}.sm\:block{display:block}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}}@media (min-width:768px){.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:h-8{height:2rem}.md\:w-8{width:2rem}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:gap-3{gap:.75rem}.md\:p-4{padding:1rem}.md\:px-3{padding-left:.75rem;padding-right:.75rem}.md\:px-4{padding-left:1rem;padding-right:1rem}.md\:py-4{padding-bottom:1rem;padding-top:1rem}.md\:text-3xl{font-size:1.875rem;line-height:2.25rem}.md\:text-5xl{font-size:3rem;line-height:1}.md\:text-6xl{font-size:3.75rem;line-height:1}.md\:text-8xl{font-size:6rem;line-height:1}.md\:text-\[200px\]{font-size:200px}.md\:text-lg{font-size:1.125rem;line-height:1.75rem}.md\:text-xl{font-size:1.25rem;line-height:1.75rem}}@media (min-width:1024px){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:text-9xl{font-size:8rem;line-height:1}} \ No newline at end of file diff --git a/scripts/build.js b/scripts/build.js index 8d47b86..1033f33 100755 --- a/scripts/build.js +++ b/scripts/build.js @@ -33,6 +33,19 @@ Handlebars.registerHelper('slice', (array, start, end) => { Handlebars.registerHelper('gt', (a, b) => a > b); +Handlebars.registerHelper('eq', (a, b) => a === b); + +Handlebars.registerHelper('startsWith', (str, prefix) => { + return str && typeof str === 'string' && str.startsWith(prefix); +}); + +Handlebars.registerHelper('isDifferentYear', (dateStr) => { + if (!dateStr) return false; + const eventYear = new Date(dateStr).getFullYear(); + const currentYear = new Date().getFullYear(); + return eventYear !== currentYear; +}); + // Helper to lookup nested array values Handlebars.registerHelper('lookup', (array, index, property) => { if (!array || !array[index]) return ''; @@ -493,6 +506,9 @@ function prepareTemplateData(data) { console.log(` 🎵 ${tracks.length} tracks`); console.log(` 🖼️ ${data.images.thumbnail ? data.images.thumbnail.length : 0} gallery images`); + // Filter out private events for structured data (SEO) + const publicShows = upcomingShows.filter(show => !show.private); + return { site, band, @@ -500,6 +516,7 @@ function prepareTemplateData(data) { hero, members, upcomingShows, + publicShows, pastShows, videos, images: data.images, diff --git a/template/data/shows.json b/template/data/shows.json index 376dcb3..e4df4fa 100644 --- a/template/data/shows.json +++ b/template/data/shows.json @@ -1,18 +1,45 @@ { "upcomingShows": [ + { + "date": "2025-12-05", + "name": "Corporate Holiday Party", + "venue": "The Fillmore", + "address": "1805 Geary Blvd, San Francisco, CA 94115", + "time": "", + "link": "mailto:booking@sinisterdexter.net", + "description": "Book us for your own!", + "private": true + }, + { + "date": "2026-09-02", + "name": "City of Albany's Concert in the Park", + "venue": "Albany Community Center", + "address": "1249 Marin Ave, Albany, CA 94706", + "time": "", + "link": "https://www.albanyca.gov/City-Calendar/2025/Aug-13-Concert-in-the-Park", + "description": "Free outdoor summer concert series in Albany" + } + ], + "pastShows": [ { "date": "2025-11-14", "name": "Friday Night Funk", "venue": "Club Fox", "address": "2209 Broadway, Redwood City, CA 94063", + "city": "Redwood City, CA", "time": "7:00 PM - 11:00 PM", "link": "https://clubfoxrwc.com/", - "tickets": "https://www.eventbrite.com/e/sinister-dexter-funk-soul-horns-tickets-1568339939979?aff=ebdssbdestsearch", - "description": "Friday night funk at the legendary Club Fox venue", - "admission": "$20" - } - ], - "pastShows": [ + "media": [ + { + "type": "video-vertical", + "platform": "tiktok", + "url": "https://www.tiktok.com/@sindex_band/video/7573064485842242871", + "videoId": "7573064485842242871", + "username": "@sindex_band", + "caption": "From our Nov 14, 2025 show at Club Fox!" + } + ] + }, { "date": "2025-10-19", "venue": "Blue Oak Brewing Company", diff --git a/template/partials/components/scripts.hbs b/template/partials/components/scripts.hbs index e31f7fa..972bb7a 100644 --- a/template/partials/components/scripts.hbs +++ b/template/partials/components/scripts.hbs @@ -143,4 +143,46 @@ const tracks = {{{json tracks}}}; loadTrack(0); } })(); + + + + + + + \ No newline at end of file diff --git a/template/partials/components/tiktok-embed.hbs b/template/partials/components/tiktok-embed.hbs new file mode 100644 index 0000000..9caa9bd --- /dev/null +++ b/template/partials/components/tiktok-embed.hbs @@ -0,0 +1,27 @@ +{{!-- + TikTok Video Embed Component + + Usage: + {{> components/tiktok-embed videoId="7573064485842242871" username="@sindex_band" caption="Optional caption text"}} + + Parameters: + - videoId (required): The TikTok video ID + - username (optional): TikTok username (defaults to @sindex_band) + - caption (optional): Caption text to display + - url (optional): Full TikTok URL (auto-generated if not provided) +--}} +
+
+
+ + {{#if username}}{{username}}{{else}}@sindex_band{{/if}} + + {{#if caption}}

{{caption}}

{{/if}} +
+
+
diff --git a/template/partials/head/structured-data.hbs b/template/partials/head/structured-data.hbs index aef154a..f9af07f 100644 --- a/template/partials/head/structured-data.hbs +++ b/template/partials/head/structured-data.hbs @@ -66,9 +66,9 @@ "@type": "ContactPoint", "contactType": "Booking", "email": "{{site.bookingEmail}}" - }{{#if upcomingShows}}, + }{{#if publicShows}}, "event": [ - {{#each upcomingShows}} + {{#each publicShows}} { "@type": "MusicEvent", "@id": "{{../site.url}}#event-{{this.id}}", diff --git a/template/partials/sections/hero.hbs b/template/partials/sections/hero.hbs index 59b82a3..a551fa0 100644 --- a/template/partials/sections/hero.hbs +++ b/template/partials/sections/hero.hbs @@ -7,21 +7,42 @@ class="relative h-screen flex items-center justify-center overflow-hidden" > - - - - {{site.title}} full band + - -
+ + + + {{site.title}} full band + + + + +
diff --git a/template/partials/sections/shows.hbs b/template/partials/sections/shows.hbs index 1406528..e0e7a5f 100644 --- a/template/partials/sections/shows.hbs +++ b/template/partials/sections/shows.hbs @@ -19,7 +19,7 @@
{{#if this.endTime}} {{formatTimeRange this.startTime this.endTime}} @@ -57,13 +57,15 @@ {{/if}}
- - + + + {{#unless this.private}} {{#if this.description}}

{{this.description}}

{{/if}} - - + {{/unless}} + + {{#if this.ticketing.ageRestriction}}

{{this.ticketing.ageRestriction}}

@@ -71,6 +73,14 @@
+ {{#if this.private}} + + + Book us for your own event → + + {{else}} + {{#if this.isFree}} FREE {{else}} @@ -78,22 +88,22 @@ {{this.ticketing.admission}} {{/if}} {{/if}} - + {{#if this.ticketing.link}} - + Learn More → {{/if}} {{#if this.ticketing.ticketUrl}} - Buy Tickets → {{/if}} + {{/if}}
@@ -120,60 +130,98 @@ {{#if pastShows}}
{{#each (limit pastShows 3)}} -
-
- - - {{#if this.venue.link}} - - {{this.venue.name}} - - {{else}} - {{this.venue.name}} - {{/if}} - - {{this.venue.address.city}} - - {{#if this.performanceNotes}} - ({{this.performanceNotes}}) - {{/if}} -
-
{{this.time}}
-
- {{/each}} - - {{#if (gt pastShows.length 3)}} - -