Cohort
HomeSign in
  • WHAT IS COHORT?
  • WHAT'S NEW?
  • Concepts
    • Experience Space
    • Campaigns
    • Standalone campaign
    • Rewards
    • Users
    • Experiences
  • GETTING STARTED
    • Overview
    • Admin Authentication
      • Setup a SAML SSO provider
      • Setup a OIDC SSO provider
    • Test mode
    • Adding Team members
    • Languages Admin interface
    • Languages User interfaces
  • Campaigns
    • Overview
    • Create a campaign
      • Challenge campaign
      • Store campaign
      • Airdrop campaign
      • Standalone campaign
    • Manage a campaign
      • Consult the indicators
      • Share a campaign
      • See the participants
      • Modify a campaign
      • End a campaign
      • Archive a campaign
      • Delete a campaign
    • Campaign display mode
  • REWARDS
    • Overview
    • Perk
      • Create a Perk
      • Manage a Perk
    • Digital Asset
      • Create a Digital Asset
      • Manage a Digital Asset
    • Rewards Distribution mode
  • USER INTERFACES
    • Experience Space
      • Configure your Experience Space branding
      • Customize your Experience Space
      • Customize your Membership Pass
    • Standalone campaigns
  • USERS
    • Overview
    • Import and export users
    • Custom user properties
    • Lists and Segments
    • Badges
  • Integrations
    • Apps
      • Brevo
      • Comarch
      • Facebook
      • Klaviyo
      • Maxxing
      • PostgreSQL
      • Salesforce
      • Shopify
      • Spotify
      • Talon.One
      • Tiktok
      • Typeform
      • Youtube
  • USER ACTIONS
    • Overview
    • Native Applications
    • Social Media
    • Lifestyle
    • Quizz and Surveys
  • INDICATORS
    • Overview
    • General indicators
    • Users indicators
    • Campaigns indicators
  • Developers
    • Overview
    • Embed
    • Merchants API
    • Campaign diffusion
  • Security
    • Security at Cohort
  • GLOSSARY
Powered by GitBook
On this page
  • How to
  • Style customization
  • CSS Variables Cheatsheet
  • Components Customization
  • Customizing Digital Asset cards
  • Customizing Perk cards
  • Customizing Challenge cards
  • Customizing the Membership Pass
  1. USER INTERFACES
  2. Experience Space

Customize your Experience Space

PreviousConfigure your Experience Space brandingNextCustomize your Membership Pass

Last updated 1 month ago

Making your Experience Space an extension of your Brand identity is really important to us. To make you feel like home, we’ve designed the Experience Space to be fully customizable, following the design system we’ve crafted but also while providing your own design for some key components of the Experience Space.

How to

From your Back-Office, click on the cogwheel located in the left corner of the page’s header to open the Organization Settings dropdown and then click on Customization link.

Style customization

You can choose to override the default Experience Space theme by specifying your own values to our design system's CSS variables. You can also provide your own fonts and use them by updating the related font-family variables. You'll find the complete CSS Variables Cheatsheet afterwards.

CSS Variables Cheatsheet

Here is the default theme we’re using for the Experience Space. You don’t need to override each of those variables, you can choose which part of the Experience Space you want to customize.

The names of the variables are quite straightforward and follow the names of existing CSS properties.

Depending on your background color, we automatically handle a dark mode for you if you don’t go deep into customization. You’ll find our dark mode theme at the end.

General

/* The default background color */
--xps-background-color: #f8fafc;
/* The default accent color, we'll be used for Primary Buttons, links and inputs */
--xps-accent-color: #3b82f6;
/* The default text color */
--xps-color: rgba(0 0 0 / 0.9);
/* The default borders color */
--xps-border-color: rgba(0 0 0 / 0.08);
/* The default font family */
--xps-font-family: 'Inter', sans-serif;

Typography

/* The font family used for all "title" elements */
--xps-title-font-family: var(--xps-font-family);
/* The transformation applied to all "title" elements */
--xps-title-text-transform: none;

--xps-h1-color: var(--xps-color);
--xps-h1-font-weight: 600;
--xps-h1-font-size: 1.5rem;
--xps-h1-line-height: 2rem;
--xps-h1-font-family: var(--xps-title-font-family);
--xps-h1-text-transform: var(--xps-title-text-transform);

--xps-h2-color: var(--xps-color);
--xps-h2-font-weight: 600;
--xps-h2-font-size: 1.2rem;
--xps-h2-line-height: 1.75rem;
--xps-h2-font-family: var(--xps-title-font-family);
--xps-h2-text-transform: var(--xps-title-text-transform);

--xps-h3-color: var(--xps-color);
--xps-h3-font-weight: 500;
--xps-h3-font-size: 1rem;
--xps-h3-line-height: 1.5rem;
--xps-h3-font-family: var(--xps-title-font-family);
--xps-h3-text-transform: var(--xps-title-text-transform);

--xps-p-color: rgba(0 0 0 / 0.7);
--xps-p-font-weight: 400;
--xps-p-font-size: 0.875rem;
--xps-p-line-height: 1.25rem;
--xps-p-font-family: var(--xps-font-family);

Buttons

We have 2 types of buttons, those we call Primary and those we call Secondary.

--xps-primary-btn-background-color: var(--xps-accent-color);
--xps-primary-btn-hover-background-color: color-mix(in srgb, var(--xps-accent-color), black 10%);
--xps-primary-btn-color: #ffffff;
--xps-primary-btn-hover-color: #ffffff;
--xps-primary-btn-border-radius: 0.5rem;
--xps-primary-btn-border-color: transparent;
--xps-primary-btn-text-transform: none;

--xps-secondary-btn-background-color: rgba(0 0 0 / 0.04);
--xps-secondary-btn-hover-background-color: rgba(0 0 0 / 0.08);
--xps-secondary-btn-color: var(--xps-color);
--xps-secondary-btn-hover-color: var(--xps-color);
--xps-secondary-btn-border-radius: 0.5rem;
--xps-secondary-btn-border-color: transparent;
--xps-secondary-btn-text-transform: none;

Inputs

Those properties will be applied to all input components (input, textarea, select, etc…)

--xps-input-label-font-size: 0.875rem;
--xps-input-label-font-weight: 500;
--xps-input-label-color: var(--xps-color);
--xps-input-background-color: rgba(0 0 0 / 0.04);
--xps-input-border-radius: 0.375rem;
--xps-input-border-color: var(--xps-border-color);
--xps-input-active-border-color: var(--xps-accent-color);

Links

The color of the <a> tags in the Experience Space

--xps-link-text-color: var(--xps-accent-color);

Images

The border-radius of the <img> tags in the Experience Space

--xps-img-border-radius: 0.5rem;

Membership Pass

You can customize the background color and border-radius of your user’s Membership Pass

--xps-membership-pass-background-color: var(--xps-accent-color);
--xps-membership-pass-border-radius: 0.75rem;

Navbar

You can customize the links of the Experience Space’s header element containing the navigation

--xps-navbar-link-border-radius: var(--xps-secondary-btn-border-radius);
--xps-navbar-link-background-color: none;
--xps-navbar-link-active-background-color: var(--xps-secondary-btn-background-color);
--xps-navbar-link-color: rgba(0 0 0 / 0.6);
--xps-navbar-link-hover-color: rgba(0 0 0 / 0.5);
--xps-navbar-link-active-color: var(--xps-color);
--xps-navbar-link-active-border-color: transparent;

Card components

We have several components looking like cards (Digital Asset, Challenges, Perks, etc…) that you can customize. Don't worry about mobile viewports when you provide width for card components, we take care of it.

--xps-card-border-radius: 0.75rem;
--xps-card-border-color: transparent;
--xps-card-background-color: rgba(0 0 0 / 0.04);
--xps-digital-asset-card-width: 195px;
--xps-perk-card-width: 300px;
--xps-challenge-card-width: 520px;

Tags

Some card components can display tags, those are the properties you can customize

--xps-tag-border-radius: 0.375rem;
--xps-tag-border-color: transparent;
--xps-tag-background-color: rgba(0 0 0 / 0.08);
--xps-tag-color: var(--xps-color);

Panel

You can change the width of the Experience Space left panel.

--xps-left-panel-width: 370px;
// For store pages only
--xps-store-left-panel-width: var(--xps-left-panel-width);
// For space pages only
--xps-space-left-panel-width: var(--xps-left-panel-width);
// For standalone challenges page only
--xps-challenge-left-panel-width: var(--xps-left-panel-width);

Sections visibility and order

It's possible to toggle the visibility of some sections of the Experience Space. It's also possible to change their order.

The nomenclature is --xps-section-<pageName>-<sectionName>-[visibility|order], meaning that putting ---xps-section-home-achievements-visibility to hidden will hide the achievements section on the home page.

/* Like the visibility attributes, possibles values are visible or hidden */
--xps-section-home-achievements-visibility: visible;
--xps-section-home-achievements-challenges-visibility: visible;
--xps-section-home-achievements-rewards-visibility: visible;
--xps-section-home-challenges-visibility: visible;
--xps-section-home-membership-pass-visibility: visible;
--xps-section-home-rewards-visibility: visible;
/* The order value is a number starting at 1. You need to be exhaustive and provide the order of all sections */
--xps-section-home-challenges-order: 1;
--xps-section-home-rewards-order: 2;
--xps-section-home-rewards-digital-assets-visibility: visible;
--xps-section-home-rewards-perks-visibility: visible;
--xps-section-home-rewards-digital-assets-order: 1;
--xps-section-home-rewards-perks-order: 2;
--xps-section-challenge-steps-visibility: visible;
--xps-section-challenge-rewards-visibility: visible;
--xps-section-challenge-faq-visibility: visible;
--xps-section-challenge-steps-order: 1;
--xps-section-challenge-rewards-order: 2;
--xps-section-challenge-faq-order: 3;

Dark Mode

Here are the applied variables if we detect the need to apply a dark mode based on your background color.

--xps-color: #ffffff;
--xps-border-color: rgba(255 255 255 / 0.2);
--xps-card-background-color: rgba(255 255 255 / 0.08);

--xps-input-background-color: rgba(255 255 255 / 0.08);

--xps-p-color: rgba(255 255 255 / 0.7);

--xps-secondary-btn-background-color: rgba(255 255 255 / 0.08);
--xps-secondary-btn-hover-background-color: rgba(255 255 255 / 0.04);

--xps-navbar-link-color: rgba(255 255 255 / 0.6);
--xps-navbar-link-hover-color: rgba(255 255 255 / 0.5);

--xps-tag-background-color: #ffffff;
--xps-tag-color: rgba(0 0 0 / 0.9);

Components Customization

In addition to the design system personalization, you are also able to provide your own implementation of several components used on the Experience Space. This feature is quite advanced, therefore be sure to have some experience in web development or we suggest that you contact us if you need some help.

All the component customization's forms work the same way :

  • First, there's a toggle to enable / disable the customization. Don't worry, if you have created a custom component and chose to disable it, it won't be erased and you can simply toggle back to find your implementation.

  • Then, there's a JSON editor with randomly generated data. The goal here is to provide a way to easily represent which data is available in the component's context that you'll be able to use to create your custom component. You can modify the data within the JSON editor and it will be updated in real time in the preview section. You'll find a complete description of each schema afterwards.

Each custom component shares the same default context data:

Property
Type
Note

user

nullable

Can be null if a user accesses a store or a standalone challenge page un-logged.

user.id

string (uuid)

user.email

string

user.membership.memberHandle

string

Represents the user's unique nickname

user.membership.memberId

number

Represents the user's ID number

user.membership.subscriptionDate

date

user.membership.imageUrl

string

Represents the membership pass image URL you've provided in the back-office

lang

enum

Can be any of those but standard one are fr, en and es.Provided to help you deal with translations.

isMobile

boolean

Will be true if on a mobile viewport. Provided to help you deal with responsiveness.

Here is an example of a custom component implementation for the Perk's cards.

<style>
#perk-card {
  border: 1px solid var(--xps-card-border-color);
  border-radius: var(--xps-card-border-radius);
  background-color: var(--xps-card-background-color);
  text-align: center;
}

#perk-card .top {
  min-height: 170px;
  border-bottom: 1px solid var(--xps-card-border-color);
}

#perk-card video {
  object-fit: cover;
  aspect-ratio: 16 / 9;
}

#perk-card .usage {
  align-self: flex-end;
  font-size: 0.75rem;
  text-transform: capitalize;
  color: #aaaaaa;
  font-weight: 900;
}

#perk-card .footer {
  display: flex;
  flex-direction: column;
  padding: 0.5rem;
}

</style>
<div id="perk-card">
  <div class="top">
    {%if perk.bannerVideoUrl %}
      <video autoPlay playsInline loop muted disablePictureInPicture>
        <source src={{perk.bannerVideoUrl}} />
        <img src={{perk.bannerVideoThumbnailUrl}} />
      </video>
    {%else%}
      <img src="{{perk.bannerImageUrl}}" />
    {%endif%}
  </div>
  <div class="footer">
    {%if perk.access %}
      <p class="usage">
        {% if perk.access.usagesLeft and perk.access.usagesLeft > 0 %}
          {{perk.access.usagesLeft}} left
        {% elsif perk.access.canBeUsed %}
          Available
        {%endif%}
      </p>
    {%endif%}
    <h3>{{ perk.title }}</h3>
  </div>
</div>

Customizing Digital Asset cards

You can provide your own custom component for Digital Asset cards. Digital Asset cards can be found in several places : in Challenges or Stores rewards list, in the Space home page or in the Space rewards page. Here are the context data dedicated to the Digital Asset custom component:

Property
Type
Note

digitalAsset

Represents a Digital Asset reward

digitalAsset.title

string

digitalAsset.description

string

digitalAsset.imageUrl

string

digitalAsset.videoUrl

string - nullable

Provided if the media you provided for the Digital Asset is a video

digitalAsset.smartContractAddress

string - nullable

Provided if the Digital Asset is an NFT

digitalAsset.ownership

nullable

Provided only when the user owns the Digital Asset.

digitalAsset.ownership.id

string (uuid)

digitalAsset.ownership.tokenId

number

Represents the unique number for a given Digital Asset

digitalAsset.ownership.createdAt

date

Customizing Perk cards

You can provide your own custom component for Perk cards. Perk cards can be found in several place : in Challenges or Stores rewards' list, in the Space home page or in the Space rewards page. Here are the context data dedicated to the Perk custom component:

Property
Type
Note

perk

Represents a Perk reward

perk.id

string (uuid)

perk.title

string

perk.description

string - nullable

perk.imageUrl

string - nullable

Provided if the media you provided for the Perk is an image

perk.videoUrl

string - nullable

Provided if the media you provided for the Perk is a video

perk.videoThumbnailUrl

string - nullable

Provided if the media you provided for the Perk is a video

perk.type

enum

perk.raffle

nullable

Provided if the perk is a raffle

perk.raffle.status

enum

perk.integration

nullable

Provided if the perk has been configured with an integration

perk.integration.type

enum

perk.access

nullable

Provided only when the user owns the Perk.

perk.access.id

string (uuid)

perk.usagesCount

number

Represents the number of time a perk has been used

perk.usagesLeft

number - nullable

Provided if there's a limit to the number of times a perk can be used

perk.canBeUsed

boolean

Will be true if the user can use it

Customizing Challenge cards

You can provide your own custom component for Challenge cards. Challenges cards can be found in the Space home page or in the Space Challenges page. Here are the context data dedicated to the Challenge custom component:

Property
Type
Note

challenge

Represents a campaign of type Challenge

challenge.id

string (uuid)

challenge.title

string

challenge.description

string

challenge.imageUrl

string - nullable

Provided if the media you provided for the Challenge is an image

challenge.videoUrl

string - nullable

Provided if the media you provided for the Challenge is a video

challenge.totalSupply

number - nullable

Provided if you chose to limit the number of rewards that can be claimed

challenge.availableSupply

number - nullable

Provided if you chose to limit the number of rewards that can be claimed

challenge.status

enum

challenge.steps

array

Represents the list of tasks to achieve to complete the Challenge

challenge.steps[].id

string (uuid)

challenge.steps[].title

string

challenge.steps[].description

string

challenge.steps[].icon

string (emoji)

challenge.steps[].isCompleted

boolean

Will be true if the user has completed the step

challenge.rewards

array

Represents the list of rewards obtainable for completing a Challenge. Will be empty if no rewards can be gained

challenge.rewards[].id

string (uuid)

challenge.rewards[].title

string

challenge.rewards[].description

string - nullable

challenge.rewards[].imageUrl

string - nullable

challenge.rewards[].videoUrl

string - nullable

challenge.rewards[].type

enum

challenge.participation

nullable

Provided only when the user has opted in to the Challenge

challenge.participation.completedAt

date - nullable

Provided when the user has completed the Challenge

Customizing the Membership Pass

You can provide your own custom component for the Membership Pass. It's only visible in the left panel of the Experience Space at the moment. There's no additional context data other than the default one, except that the user won't be nullable since the Membership Pass is only rendered in a logged in context.

Finally, the editor section coupled with the preview. Custom components can be built using template engine, the Javascript implementation of Liquid template engine made by Shopify. For CSS, simply provide a <style> tag in your component implementation. You can and you should reference variables from the design system. The preview is updated in real time while you are updating the code in the editor. The preview's width will depend on the custom component css variable width value (i.e --xps-perk-card-width). The editor provides autocompletion for context data (exposed through the JSON editor) as well as data validation for context data.

  'ar', // Arabic
  'zh', // Chinese
  'cs', // Czech
  'nl', // Dutch
  'en', // English
  'fr', // French
  'de', // German
  'el', // Greek
  'id', // Indonesian
  'it', // Italian
  'ja', // Japanese
  'ko', // Korean
  'fa', // Persian
  'pl', // Polish
  'pt', // Portuguese
  'ru', // Russian
  'es', // Spanish
  'tr', // Turkish
  'uk', // Ukrainian
  'vi', // Vietnamese
'custom',
'limited-edition',
'custom-product',
'exclusive-content',
'discount',
'pre-sale',
'private-sale',
'giveaway',
'private-community',
'voting',
'survey',
'event-ticket',
'1-1-meeting',
'webinar',
'livestream',
'conciergerie',
'VIP-support',
'community',
'won',
'lost',
'pending'
'cohort.qr-code',
'cohort.form',
'discord.private-access',
'instagram.close-friends-list',
'shopify.discount',
'talon-one.coupon',
'typeform.form'
'published',
'ended'
'digital-asset',
'perk'
LiquidJS