Community Wolf
Community
APIAboutContact
Book a demo

Community Wolf

Real-time safety intelligence for citizens and the teams who protect them.

Community Tools

  • Public map
  • Namola
  • WhatsApp

Business Tools

  • Access Control
  • Intelligence
  • Safety API
  • Group Agents
  • Patrol Management
  • Roster Management
  • Safety Survey
  • Pricing
  • Pricing calculator

Resources

  • Docs
  • Changelog
  • Design system

Company

  • Community
  • Business
  • API
  • About
  • Contact

Get pilot updates

New features, city launches, and integration partnerships - delivered monthly.

Subscribe to updates

(c) 2026 Community Wolf. All rights reserved.

Privacy PolicyTerms of Service
Wolf design system
Foundations
  • Brand
  • Voice and tone
  • Colour
  • Typography
  • Spacing and layout
  • Radius, elevation and borders
  • Motion
  • Iconography
  • Imagery and photography
  • Data visualisation
  • Accessibility
Patterns
  • App shell
  • Hero sections
  • Empty states
  • Error states
  • Skeletons and loading
  • Forms
  • Tables and data density
  • Confirmation and destructive actions
  • Authentication surfaces
Components
  • Button
  • Input
  • Card
  • Badge
  • Dialog
  • Label
  • Textarea
  • Select
  • Checkbox
  • Radio group
  • Switch
  • Form field
  • Tabs
  • Popover
  • Tooltip
  • Accordion
  • Alert dialog
  • Confirm dialog
  • Toast (Sonner)
  • Skeleton
  • Empty state

components

Select

Use Select when the answer is one of a known, short list (≤30 options). For bigger sets or free-text filtering, reach for a Combobox instead — it's coming in v0.3.

Read the full spec

Default

A bare trigger + content with a flat list of items. Click, tap or type to open; arrow keys to navigate.

tsx
<Select>
  <SelectTrigger className="w-[220px]">
    <SelectValue placeholder="Pick an area" />
  </SelectTrigger>
  <SelectContent>
    <SelectItem value="camps-bay">Camps Bay</SelectItem>
    <SelectItem value="sea-point">Sea Point</SelectItem>
    …
  </SelectContent>
</Select>

Controlled

Pass `value` and `onValueChange` to drive the select from state. The current value shows live below.

Current value: —

tsx
const [value, setValue] = useState("");
<Select value={value} onValueChange={setValue}>…</Select>

Grouped with labels

Use `SelectGroup` and `SelectLabel` to organise large option sets. Separators help break logical clusters.

tsx
<SelectContent>
  <SelectGroup>
    <SelectLabel>Cape Town</SelectLabel>
    <SelectItem value="camps-bay">Camps Bay</SelectItem>
    <SelectItem value="sea-point">Sea Point</SelectItem>
  </SelectGroup>
  <SelectSeparator />
  <SelectGroup>
    <SelectLabel>Johannesburg</SelectLabel>
    <SelectItem value="sandton">Sandton</SelectItem>
    <SelectItem value="rosebank">Rosebank</SelectItem>
  </SelectGroup>
</SelectContent>

States

Disabled trigger, invalid trigger via `aria-invalid`, and disabled individual items.

Previous — ComponentsTextarea
Next — ComponentsCheckbox