Skip to main content

Theme Configuration Documentation

Overview

The Theme model provides comprehensive customization options for white-label instances of the Vibemap platform. Each theme controls the visual appearance, branding, and functional behavior of the platform for different organizations.

Table of Contents

  1. Core Fields - Basic theme information and metadata
  2. Visual Styling - Colors, branding, fonts, badges
  3. Event Form Configuration - Event submission forms
  4. Events Display Configuration - Event listing and display
  5. Layout & Grid Display - Page layout and grid settings
  6. Cards Configuration - Card appearance and content
  7. Map Configuration - Comprehensive map settings
  8. Filtering Configuration - Filter UI and behavior
  9. Authentication - Login/signup options
  10. Usage Examples - Code examples for common configurations
  11. Best Practices - Recommended settings and guidelines

Quick Reference by Feature

Layout & View

Cards

Map

Filters


Core Fields

Basic Information

FieldTypeDescription
idUUIDUnique identifier (auto-generated)
nameString (200)Display name of the theme (unique)
slugAutoSlugURL-friendly identifier (auto-generated from name)
descriptionTextDetailed description of the theme's purpose
created_atDateTimeTimestamp of theme creation
updated_atDateTimeTimestamp of last modification
iconImageFieldTheme icon/logo file

Visual Styling

Color Scheme

These fields control the overall color palette of the interface.

FieldTypeExampleDescription
colorString (50)#333333Primary text color
accentString (50)#FF6B6BPrimary accent color for buttons, links, highlights
secondaryString (50)#4ECDC4Secondary accent color for complementary elements
backgroundString (50)#FFFFFFMain background color
foregroundString (50)#F7F7F7Foreground/surface color for cards and panels

Supported formats: Hex codes (#RRGGBB), CSS color names (red, blue), RGB/RGBA values

Number Badge Styling

Controls the appearance of numeric indicators on map markers and cards.

FieldTypeExampleDescription
num_text_colorString (50)#FFFFFFText color inside number badges
num_badge_sizeInteger24Badge size in pixels
num_bg_colorString (50)#FF6B6BBadge background color
num_border_colorString (50)#CC5555Badge border color
num_themeString (10)light or darkTheme variant for automatic contrast adjustments

Branding

FieldTypeDescription
logo_urlURLFull URL to organization's logo image
font_urlURLGoogle Fonts or custom font stylesheet URL (e.g., https://fonts.googleapis.com/css2?family=Roboto)

Event Form Configuration

Controls the event submission form appearance and behavior.

Display Settings

FieldTypeDefaultDescription
event_form_titleString (255)-Custom title for the event submission form
event_form_messageText-Instructional message shown on the form
event_form_show_vibe_pointsBooleanfalseDisplay vibe point allocation interface
event_form_show_intro_messageBooleanfalseShow introductory message before form
event_form_header_colorString (50)-Header background color (hex or CSS color)

Form Behavior

FieldTypeDefaultDescription
event_form_linkURL-External URL to redirect form submissions (overrides built-in form)
event_form_cityString (100)-Default city pre-filled in location field
event_form_auto_tagsJSON ArraynullTags automatically applied to submitted events
Example: ["community", "local"]
event_form_required_fieldsJSON ArraynullList of required field names
Example: ["title", "date", "location"]
event_form_requires_approvalBooleanfalseEvents require admin approval before publication

Events Display Configuration

Controls how events are displayed to end users.

Event List Settings

FieldTypeDefaultDescription
events_linkURL-Custom URL for "View All Events" link
events_link_newsletterURL-Newsletter signup link shown in events section
events_show_only_event_tagsBooleanfalseFilter to show only event-specific tags
events_event_layoutString (50)-Layout style (e.g., columns, grid, list)
events_search_placeholderString (100)-Placeholder text for event search box
events_open_in_new_tabBooleanfalseOpen event details in new browser tab

Event Filtering

FieldTypeDescription
events_tag_autoJSON ArrayTags to automatically filter/highlight
Example: ["featured", "trending"]
events_vibesJSON ArrayArray of vibe slugs to display in filters
Example: ["artsy", "chill", "energetic"]
FieldTypeDefaultDescription
events_clip_to_boundsBooleanfalseRestrict events to theme's geographic boundary
events_related_eventsBooleanfalseShow related events section
events_related_events_radiusFloat-Search radius for related events (in miles)

Media Settings

FieldTypeDefaultDescription
events_randomize_imagesBooleanfalseRandomize order of event images in galleries

Layout & Grid Display

Controls the overall layout and grid presentation of content.

FieldTypeDefaultDescription
grid_columnsInteger3Number of columns in grid view
show_date_range_selectorBooleanfalseShow date filter in the interface
shown_at_startInteger100Initial number of items to display on page load
show_left_panelBooleantrueDisplay the left sidebar panel
initial_viewString (20)mapStarting view mode: map or grid

Cards Configuration

Controls the behavior and appearance of place/event cards throughout the interface.

Card Layout & Behavior

FieldTypeDefaultDescription
card_styleString (20)listCard display style: list or carousel
cards_open_to_websiteBooleanfalseCards link directly to venue website instead of detail page
cards_open_to_pageString (500)-Custom URL pattern for card links
Example: /places/{slug} or https://external.com/venue/{id}
cards_open_to_blankBooleantrueOpen card links in new tab (target="_blank")
cards_use_dynamic_linkBooleanfalseUse dynamic Firebase/branch.io deep links
hide_no_image_itemsBooleanfalseHide items without images from card display

Card Styling

FieldTypeDescription
cards_title_colorString (50)Color of card title text (hex or CSS color)
button_text_colorString (50)Text color for buttons on cards

Card Content Display

Control which information appears on cards.

FieldTypeDefaultDescription
show_title_on_cardsBooleantrueDisplay title on cards
show_image_on_cardsBooleantrueDisplay image on cards
show_category_on_cardsBooleantrueDisplay category label on cards
show_description_on_cardsBooleanfalseDisplay description text on cards
show_address_on_cardsBooleantrueDisplay address on cards
show_distance_on_cardsBooleanfalseDisplay distance from user location on cards
show_hours_on_cardsBooleanfalseDisplay operating hours on cards
show_phone_on_cardsBooleanfalseDisplay phone number on cards
show_website_on_cardsBooleanfalseDisplay website link on cards
show_rating_on_cardsBooleantrueDisplay rating/review score on cards
show_price_on_cardsBooleanfalseDisplay price level indicator on cards
show_vibes_on_cardsBooleanfalseDisplay vibe tags on cards
show_tags_on_cardsBooleanfalseDisplay tags on cards
show_notes_on_cardsBooleanfalseDisplay user notes on cards
show_offers_on_cardsBooleanfalseDisplay special offers on cards
show_offers_firstBooleanfalseShow offers at top of card (above other content)
show_bookmark_buttonBooleantrueDisplay bookmark/save button on cards
subtitle_sourceString (50)categorySource for card subtitle: category, address, description, etc.

Map Configuration

Comprehensive settings for map display and interactions.

Initial Map View

Controls the default map position and orientation when first loaded.

FieldTypeDefaultDescription
map_initial_latFloat-Override default center latitude
map_initial_lngFloat-Override default center longitude
map_initial_zoomFloat12Default zoom level (typically 1-20)
map_initial_bearingFloat0Default compass bearing in degrees (0-360)
map_initial_pitchFloat0Default tilt angle in degrees (0-60)
map_zoom_minFloat1Minimum allowed zoom level
map_zoom_maxFloat20Maximum allowed zoom level

Map Appearance

FieldTypeDefaultDescription
map_styleString (50)lightMap visual style: light, dark, streets, satellite, etc.
map_height_offsetInteger0Adjust map container height by N pixels (can be negative)

Map Interaction

FieldTypeDefaultDescription
map_scroll_zoomBooleantrueEnable/disable scroll wheel zooming
map_cooperative_gesturesBooleanfalseRequire Ctrl+scroll for zoom (prevents accidental zoom while scrolling page)
map_fit_boundsBooleantrueAuto-fit map to show all content on load
map_fit_markersBooleantrueAuto-fit map to show all markers on load
map_paddingInteger50Padding in pixels around map when fitting to bounds
map_story_scrollBooleanfalseEnable story scroll mode for narrative map experiences

Markers & Clustering

FieldTypeDefaultDescription
map_show_markersBooleantrueDisplay map markers for places/events
map_marker_styleString (20)iconsMarker display style: images or icons
map_num_image_markersInteger50Number of image markers to show before switching to icons (performance optimization)
map_numbered_markersBooleanfalseDisplay numbers on markers corresponding to card order
map_shuffle_markersBooleanfalseRandomize marker positions slightly to avoid perfect overlap
map_show_circle_markersBooleanfalseUse simple circle/dot markers instead of icons
map_cluster_markersBooleanfalseEnable marker clustering for high-density areas
map_marker_featuredJSON Object-Configuration for featured/highlighted markers
Example: {"icon": "star", "color": "#FFD700", "size": 1.5}
map_show_featured_firstBooleanfalseDisplay featured items at top of lists and prioritize on map

Popups & Overlays

FieldTypeDefaultDescription
map_show_popupsBooleantrueShow popups when clicking markers
map_should_include_tagsBooleanfalseInclude tag information in map marker popups
map_show_map_cardsBooleanfalseShow card carousel on map (mobile view)
map_title_cardsJSON Object-Configuration for informational cards overlaid on map
Example: {"position": "top-right", "cards": [{"title": "Welcome", "content": "..."}]}

Map Layers & Overlays

FieldTypeDefaultDescription
map_show_boundaryBooleanfalseShow geographic boundary overlay
map_show_heat_mapBooleanfalseDisplay heatmap layer based on place density/popularity
map_show_routeBooleanfalseDisplay route line on map
map_route_colorString (50)-Color for route lines on map
map_show_transitBooleanfalseDisplay public transit layer
map_show_legendBooleanfalseDisplay map legend/key

Boundary Styling

Controls the appearance of geographic boundaries on the map.

FieldTypeDefaultDescription
map_boundary_fill_colorText-Boundary fill color (hex) or Mapbox expression (JSON array)
Example: #FF6B6B or ["interpolate", ["linear"], ["zoom"], ...]
map_boundary_fill_opacityFloat (0-1)0.2Transparency of boundary fill (0=transparent, 1=opaque)
map_boundary_line_colorString (50)-Boundary border line color
map_boundary_line_opacityFloat (0-1)1.0Transparency of boundary line
map_boundary_line_weightInteger2Boundary line thickness in pixels
map_boundary_line_dash_arrayJSON Array-Dash pattern for boundary line
Example: [5, 3] (5px dash, 3px gap)
map_boundary_show_labelsBooleanfalseDisplay labels for boundary regions

Data Loading

FieldTypeDefaultDescription
map_num_places_to_loadInteger100Number of places to load on map initially
map_clip_to_boundsBooleanfalseRestrict displayed places/events to theme's geographic boundary

Additional Map Features

FieldTypeDefaultDescription
map_show_scroll_areaBooleanfalseShow scrollable area indicator for off-screen content

Filtering Configuration

Global filtering rules and UI controls applied across the theme.

Filter Display Settings

FieldTypeDefaultDescription
show_top_level_filtersBooleantrueDisplay filters at top of interface
filter_view_modeString (50)sidebarLayout mode for filters: dropdown, sidebar, panel, etc.
show_filters_overallBooleantrueEnable/disable all filtering functionality
show_item_count_on_filtersBooleantrueDisplay count of items for each filter option
filter_allow_multiple_selectionBooleantrueAllow selecting multiple filter options simultaneously

Filter Types

Control which filter categories are available to users.

FieldTypeDefaultDescription
show_tag_filtersBooleantrueShow tag filtering options
show_category_filtersBooleantrueShow category filtering options
show_vibe_filtersBooleanfalseShow vibe filtering options
show_neighborhood_filtersBooleanfalseShow neighborhood/geography filtering options
show_search_in_filtersBooleantrueShow search bar within filter panel

Tag Filtering

FieldTypeDescription
filters_tags_to_excludeJSON ArrayTags that should be hidden from this theme
Example: ["admin-only", "test"]
filters_tags_to_includeJSON ArrayWhitelist of tags to show (if set, only these appear)
Example: ["featured", "verified", "local"]
filters_tag_namesJSON ObjectCustom display names for tags
Example: {"lgbtq-friendly": "LGBTQ+ Friendly", "wheelchair": "♿ Accessible"}

Category Styling

FieldTypeDescription
map_category_colorsJSON ObjectMap category names to marker colors
Example: {"restaurant": "#FF6B6B", "cafe": "#4ECDC4", "bar": "#95E1D3"}

Authentication

FieldTypeDefaultDescription
show_loginBooleantrueDisplay login/signup options in the interface

Usage Examples

Example 1: Simple Color Theme

theme = Theme.objects.create(
name="Ocean Blue",
accent="#0077BE",
secondary="#00A8E8",
background="#F0F8FF",
foreground="#FFFFFF",
color="#333333"
)

Example 2: Event-Focused Configuration

theme = Theme.objects.create(
name="Community Events",
event_form_title="Submit Your Event",
event_form_city="San Francisco",
event_form_auto_tags=["community", "local"],
event_form_required_fields=["title", "date", "location", "description"],
event_form_requires_approval=True,
events_vibes=["family-friendly", "outdoors", "cultural"],
events_related_events=True,
events_related_events_radius=5.0
)

Example 3: Map-Heavy Custom Theme

theme = Theme.objects.create(
name="Neighborhood Guide",
# Map initial view
map_initial_lat=37.7749,
map_initial_lng=-122.4194,
map_initial_zoom=13,
map_style="streets",

# Boundary styling
map_boundary_fill_color="#FF6B6B",
map_boundary_fill_opacity=0.2,
map_boundary_line_color="#CC5555",
map_boundary_line_weight=3,
map_show_boundary=True,

# Map features
map_show_heat_map=True,
map_cluster_markers=True,
map_numbered_markers=True,
map_show_featured_first=True,

# Category colors
map_category_colors={
"restaurant": "#E74C3C",
"cafe": "#F39C12",
"bar": "#9B59B6",
"shop": "#3498DB"
},

# Filters
filters_tags_to_include=["verified", "local-favorite"],
show_category_filters=True,
show_vibe_filters=True
)

Example 4: Minimal Card Display Theme

theme = Theme.objects.create(
name="Clean & Simple",
# Layout
initial_view="grid",
grid_columns=4,
card_style="list",

# Show only essential card information
show_title_on_cards=True,
show_image_on_cards=True,
show_category_on_cards=True,
show_address_on_cards=False,
show_description_on_cards=False,
show_rating_on_cards=False,
show_vibes_on_cards=False,
show_tags_on_cards=False,

# Hide items without images
hide_no_image_items=True,

# Subtitle configuration
subtitle_source="category"
)

Example 5: Feature-Rich Interactive Map

theme = Theme.objects.create(
name="Interactive City Guide",
# Initial view starts on map
initial_view="map",

# Map configuration
map_style="dark",
map_initial_zoom=12,
map_cooperative_gestures=True,
map_scroll_zoom=True,

# Marker configuration
map_marker_style="images",
map_num_image_markers=100,
map_show_circle_markers=False,
map_cluster_markers=True,
map_show_popups=True,

# Show all layers
map_show_boundary=True,
map_show_heat_map=True,
map_show_transit=True,
map_show_legend=True,

# Rich card display
show_title_on_cards=True,
show_image_on_cards=True,
show_category_on_cards=True,
show_description_on_cards=True,
show_address_on_cards=True,
show_rating_on_cards=True,
show_vibes_on_cards=True,
show_hours_on_cards=True,
show_website_on_cards=True,

# Advanced filters
show_filters_overall=True,
show_tag_filters=True,
show_category_filters=True,
show_vibe_filters=True,
show_neighborhood_filters=True,
show_item_count_on_filters=True,
filter_allow_multiple_selection=True,
filter_view_mode="sidebar"
)

API Methods

get_theme_by_slug(slug)

Retrieve a theme by its URL-friendly slug.

theme = Theme.get_theme_by_slug('ocean-blue')

get_users_associated_with_theme(theme, max_users=10)

Get users associated with a specific theme (excludes 'vibemap' default theme).

users = Theme.get_users_associated_with_theme('community-events', max_users=20)

get_themes_by_user_email(email)

Get all themes accessible to a user by their email address.

themes = Theme.get_themes_by_user_email('user@example.com')

Best Practices

Color Consistency

  • Use a consistent color palette across accent, secondary, and related fields
  • Ensure sufficient contrast between color (text) and background
  • Test colors for accessibility (WCAG AA compliance recommended)
  • Use map_category_colors for immediate visual categorization on maps

Event Configuration

  • When using event_form_link, the external form should post back to Vibemap's API
  • event_form_required_fields should match your form validation logic
  • Set event_form_requires_approval=True for moderated communities

Map Optimization

  • Use map_boundary_fill_opacity between 0.1-0.3 for subtle highlighting
  • Set map_clip_to_bounds=True to improve performance for city-specific themes
  • Enable map_cluster_markers=True for themes with high marker density (100+ places)
  • Use map_num_image_markers to balance visual appeal with performance (recommended: 50-100)
  • Set map_cooperative_gestures=True for content-heavy pages to prevent accidental zooming
  • Use map_fit_bounds=True and map_fit_markers=True for automatic optimal viewport

Card Display Optimization

  • Minimize visible card fields for cleaner, faster-loading interfaces
  • Use hide_no_image_items=True for visually-focused themes
  • Set subtitle_source to the most relevant secondary information for your use case
  • Use card_style="carousel" for mobile-optimized experiences
  • Show only essential information on cards; detailed info can appear on detail pages

Filter Configuration

  • Enable filter_allow_multiple_selection=True for power users and complex searches
  • Use show_item_count_on_filters=True to improve UX (users can see available options)
  • Set filter_view_mode="sidebar" for desktop-first experiences
  • Set filter_view_mode="dropdown" for mobile-first or minimal interfaces
  • Balance number of filter types shown (tags, categories, vibes) with interface simplicity

Tag Management

  • filters_tags_to_exclude takes precedence over filters_tags_to_include
  • Use filters_tag_names to provide user-friendly labels without changing database slugs
  • Keep auto-applied tags (event_form_auto_tags) minimal and relevant

Layout & Performance

  • Use grid_columns=2 for mobile-optimized themes
  • Use grid_columns=3-4 for desktop-optimized themes
  • Set shown_at_start based on expected dataset size (smaller for slower connections)
  • Set initial_view="map" for location-focused experiences
  • Set initial_view="grid" for browsing/discovery experiences

Migration Notes

When creating new themes, ensure:

  1. Organization profiles link to the theme via foreign key
  2. Icon images are optimized (recommended: SVG or PNG < 50KB)
  3. External URLs (logo_url, font_url, event_form_link) are HTTPS
  4. JSON fields validate as proper JSON arrays/objects
  5. Color hex codes include the # prefix

  • OrganizationProfile (accounts/models/organization.py): Links users to themes
  • User (accounts/models/user.py): Users can be associated with multiple themes
  • Event (api/models/events.py): Events inherit theme-based filtering and display rules
  • Place (api/models/places.py): Places displayed according to theme map configuration

Future Enhancements

Potential additions to the Theme model (not yet implemented):

  • Custom CSS injection for advanced styling
  • Theme inheritance/composition (base themes + overrides)
  • A/B testing configurations per theme
  • Mobile-specific theme overrides
  • Accessibility presets (high contrast, large text, etc.)

Complete Field Name Reference

All theme configuration fields organized alphabetically for quick lookup:

A-C

  • accent, background, button_text_color
  • card_style, cards_open_to_blank, cards_open_to_page, cards_open_to_website, cards_title_color, cards_use_dynamic_link
  • color, created_at

E-G

  • event_form_auto_tags, event_form_city, event_form_header_color, event_form_link, event_form_message, event_form_required_fields, event_form_requires_approval, event_form_show_intro_message, event_form_show_vibe_points, event_form_title
  • events_clip_to_bounds, events_event_layout, events_link, events_link_newsletter, events_open_in_new_tab, events_randomize_images, events_related_events, events_related_events_radius, events_search_placeholder, events_show_only_event_tags, events_tag_auto, events_vibes
  • filter_allow_multiple_selection, filter_view_mode
  • filters_tag_names, filters_tags_to_exclude, filters_tags_to_include
  • font_url, foreground
  • grid_columns

H-N

  • hide_no_image_items
  • icon, id, initial_view
  • logo_url
  • map_boundary_fill_color, map_boundary_fill_opacity, map_boundary_line_color, map_boundary_line_dash_array, map_boundary_line_opacity, map_boundary_line_weight, map_boundary_show_labels
  • map_category_colors, map_clip_to_bounds, map_cluster_markers, map_cooperative_gestures
  • map_fit_bounds, map_fit_markers
  • map_height_offset
  • map_initial_bearing, map_initial_lat, map_initial_lng, map_initial_pitch, map_initial_zoom
  • map_marker_featured, map_marker_style
  • map_num_image_markers, map_num_places_to_load, map_numbered_markers
  • map_padding
  • map_route_color
  • map_scroll_zoom, map_should_include_tags, map_show_boundary, map_show_circle_markers, map_show_featured_first, map_show_heat_map, map_show_legend, map_show_map_cards, map_show_markers, map_show_popups, map_show_route, map_show_scroll_area, map_show_transit
  • map_shuffle_markers, map_story_scroll, map_style
  • map_title_cards
  • map_zoom_max, map_zoom_min
  • name, num_badge_size, num_bg_color, num_border_color, num_text_color, num_theme

S-Z

  • secondary, show_bookmark_button
  • show_address_on_cards, show_category_on_cards, show_description_on_cards, show_distance_on_cards, show_hours_on_cards, show_image_on_cards, show_notes_on_cards, show_offers_first, show_offers_on_cards, show_phone_on_cards, show_price_on_cards, show_rating_on_cards, show_tags_on_cards, show_title_on_cards, show_vibes_on_cards, show_website_on_cards
  • show_category_filters, show_date_range_selector
  • show_filters_overall, show_item_count_on_filters
  • show_left_panel, show_login
  • show_neighborhood_filters
  • show_search_in_filters
  • show_tag_filters, show_top_level_filters
  • show_vibe_filters
  • shown_at_start, slug, subtitle_source
  • updated_at

Total: 100+ configuration fields


Support

For questions about theme configuration:

  • Review this documentation
  • Check existing themes in Django admin: /admin/accounts/theme/
  • Refer to frontend implementation in the web application codebase
  • Contact the development team for advanced customization requests