Skip to content
Componentsbeta

Dance style picker

Pick dances from the WeDance taxonomy — 150 styles in 14 families. Popular styles first, the rest one tap away grouped by family, and a search that knows aliases like “LA style”, “On2” or “Kompa”.

Example

2 selected

Pick all you dance — you can change this later.

Value: ["Salsa","Urban Kiz"]

vue
<Field label="Which dances?" optional>
  <DanceStylePicker v-model="form.danceStyles" />
</Field>

States

Salsa

Cuban

Caribbean & Latin party

1 selected

3 selected

“Afro-Cuban” is an alias of Afro; “Pole fusion” is unknown, so it shows as a removable chip.

Pick at least one dance.

1 selected

Single choice · restricted options

vue
<Field label="Dance style" optional>
  <DanceStylePicker v-model="goalStyles" single :searchable="false" />
</Field>

Salsa

Cuban

1 selected

vue
<!-- only what this festival teaches, no search for a short list -->
<DanceStylePicker v-model="picked" :options="festival.styles" />

Filter row

DanceStyleFilter is the single-select row on filter surfaces (city pages, festivals) — the picker's chips without search or families.

Value: "Bachata"

vue
<!-- single-select filter: tap again to clear, v-model is '' when off -->
<DanceStyleFilter v-model="selectedStyle" :styles="city.styles" />

Read-only chips

DanceStyleChips shows stored styles on cards and profiles, tinted by family.

  • Salsa
  • Zouk
  • Urban Kiz
  • Lindy Hop
  • Tango
  • Casino
  • Timba
  • Rueda
  • +3
vue
<DanceStyleChips :styles="artist.styles" :max="3" />

Taxonomy

One source of truth in shared/dance-styles.ts, used by the picker, filters and the v3 sync.

vue
import { findDanceStyle, sortDanceStyles, canonicalDanceStyle } from '#shared/dance-styles'

findDanceStyle('urban kizz')   // → { id: 'urban-kiz', name: 'Urban Kiz', family: 'kizomba', … }
canonicalDanceStyle('LA style')  // → 'Salsa'
sortDanceStyles(['Zouk', 'Salsa']) // → ['Salsa', 'Zouk'] (popularity order)
FamilyStyles (popularity order)
SalsaSalsa · Salsa LA · Salsa NY · Salsa Colombian · Latin Fusion · Mambo · Pachanga · Salsaton
CubanCasino · Timba · Rueda · Rumba · Afro-Cuban · Son Cubano · Reparto · Cha-Cha-Cha · Bolero · Contradanza · Danzón · Rumba Columbia · Rumba Yambu
BachataBachata · Bachata Sensual · Bachata Dominicana · Bachata Moderna · Bachatango
Kizomba & SembaKizomba · Urban Kiz · Tarraxo · Semba · Douceur · Kuduro · Urban Tarraxa
BrazilianZouk · Lambada · Samba · Forró · Capoeira · Funk Carioca · Maxixe
Caribbean & Latin partyReggaeton · Merengue · Dancehall · Cumbia · Bump · Champeta · Dembow · Grinding · Kompa · Perreo · Vallenato · Zouk Love
AfricanAfrobeats · Afro House · Amapiano
SwingLindy Hop · West Coast Swing · Balboa · Boogie-Woogie · Charleston · Collegiate Shag · East Coast Swing · Hand Dancing · Modern Jive · Rock and Roll · Shimmy · Swing
TangoTango · Contact Tango · Finnish Tango · Milonga · Show Tango · Tango Camacupense · Tango Canyengue · Tango Liso · Tango Nuevo · Tango Oriental Uruguayan · Tango Orillero · Tango Salon · Tango Valparaísino · Tango Vals
BallroomBallroom · Ballroom Cha-Cha · Ballroom Latin · Ballroom Samba · Ballroom Tango · Discofox · Foxtrot · Jive · Paso Doble · Quickstep · Rhumba · Viennese Waltz · Waltz
Street & urbanHip Hop · Breaking · Commercial · Electric Boogaloo · High Heels · House · K-Pop · Krump · Locking · Popping · Street Dance · Twerk · Vogue
Stage & studioBallet · Belly Dance · Burlesque · Contemporary · Flamenco · Jazz · Modern · Pole Dance · Zumba
Folk & worldAdıyaman · Bar · Bavarian Folk · Ceili · Ceilidh · Country Dance · Halay · Hora · Horon · Jig · Kaşık Oyunu · Kolbaştı · Polka · Schottische · Semah · Sevillanas · Şıksaray · Spanish Bolero · Van · Zeybek
IndianBhangra · Bharatanatyam · Bollywood · Garba · Ghoomar · Kathak · Kathakali · Kuchipudi · Lavani · Manipuri · Mohiniyattam · Odissi · Rasleela · Sattriya
Workshop topicsLadies Styling · Theory

Props

DanceStylePicker

PropTypeDefaultDescription
v-modelstring[][]Canonical style names — the values 2026 stores (`Salsa`, `Urban Kiz`). Unknown legacy values are kept and shown as removable chips.
optionsstring[]allRestrict the choice to these names or aliases (e.g. a festival’s styles).
singlebooleanfalseAt most one; choosing another replaces it. v-model stays an array.
searchablebooleantrueShow the search box (hidden anyway when the list is no longer than popularCount).
expandedbooleanfalseOpen every family from the start instead of “popular first”.
popularCountnumber8How many of the most popular styles lead before “All styles”.
labelstring"Dance styles"Accessible name of the chip group. The Field label names the search box.
placeholderstring—Search box placeholder.
disabled · invalidbooleanfalseAlso read from a surrounding Field.

DanceStyleFilter

PropTypeDefaultDescription
v-modelstring''The active style, emitted as passed in `styles`; empty when cleared. Alias-aware: “salsa” keeps Salsa on.
stylesstring[]—Styles to offer (e.g. what a city’s events have); sorted by popularity, aliases de-duplicated.
leadnumber3How many show before “+N more” (the active style always stays visible).
labelstring"Filter by dance style"Accessible name of the chip group.

DanceStyleChips

PropTypeDefaultDescription
stylesstring[]—Stored style values; sorted by popularity, aliases shown by canonical name.
maxnumber0Show this many then “+N”. 0 = all.
size'sm' | 'md''sm'Chip size.

Do & don't

1 selected

Do — Use the picker wherever someone chooses styles, so values match the taxonomy and filters find them.

Don't — Hard-code a short style list in a page — it drifts (Afro-Cuban vs Afro, Cha-Cha vs Cha-Cha-Cha) and filters miss it.

Accessibility

  • Every style is a real button with aria-pressed (ToggleChip): Tab to it, Space/Enter toggles it.
  • The Field label names the search box; the chip group has its own accessible name (label prop) and the Field hint/error via aria-describedby.
  • In the search box, Enter toggles the best match and clears the query; Escape clears the query.
  • Result counts and the selection count are announced through a polite live region.
  • Families are sections labelled by their heading, so screen-reader users can jump between them.
  • Selected chips add a check icon, so state never relies on colour alone.