Skip to main content

User Engagement

Product analytics · Light · Tabbed

A restrained page that barely departs from the default theme, and is better for it. Good evidence that you do not need heavy styling to get a clean result.

What makes it work

  • Terracotta and teal on white, used only for series colours.
  • The monthly metrics table with sparkline rows does most of the work: many metrics on one screen, each with its own trend.
  • Two tabs only, split by the question being asked rather than by data source.
  • A sensible starting point if you are theming your first dashboard.

The views

Each tab is shown below at full width.

User engagement

User Engagement: User engagement

Feature adoption

User Engagement: Feature adoption

See it live

Open the live dashboard to click through it yourself. No Holistics account needed.

Theme code

The theme this dashboard actually uses, written out as a reusable PageTheme. Paste it into a .theme.aml file under Development > Library > Themes to reuse it across your own dashboards, or inline it as a single dashboard's theme: property. Chart colour palettes are set separately, so they are not included here.

user_engagement_theme.theme.aml
PageTheme user_engagement_theme {
background {
bg_color: "#EDE8E3"
}
canvas {
border {
border_color: "#E0D8D0"
border_style: "solid"
border_width {
top: 1
left: 1
right: 1
bottom: 1
}
border_radius {
top_left: 12
top_right: 12
bottom_left: 12
bottom_right: 12
}
}
shadow: "md"
opacity: 1
background {
bg_color: "#FAF8F6"
}
}
block {
text {
font_size: 20
font_color: "#3D3429"
font_style: "normal"
font_family: "Manrope"
font_weight: "normal"
}
label {
font_size: 13
font_color: "#3D3429"
font_style: "normal"
font_family: "Manrope"
font_weight: "semibold"
}
border {
border_style: "none"
border_width {
top: 0
left: 0
right: 0
bottom: 0
}
}
shadow: "none"
opacity: 1
padding {
top: 0
left: 0
right: 0
bottom: 0
}
background {
bg_color: "transparent"
}
}
viz {
table {
header {
bg_color: "#F0EAE2"
font_size: 16
font_color: "#6B5D52"
font_weight: "semibold"
}
general {
bg_color: "#FFFFFF"
font_size: 16
font_color: "#3D3429"
font_family: "Manrope"
hover_color: "#F7F3EE"
banding_color: "#FFFFFF"
grid_color: "#EDE7DF"
border_color: "#E0D8D0"
border_width: 1
}
sub_title {
font_size: 16
font_color: "#6B5D52"
font_weight: "normal"
}
sub_header {
bg_color: "#F0EAE2"
font_size: 18
font_color: "#8B7E74"
font_weight: "normal"
}
}
}
}

The theme is paired with custom CSS, which lives beside it rather than inside it. See Custom CSS for where it goes.

Custom CSS
/* ── Fonts ──────────────────────────────────────────────────────── */
@import url('https://fonts.googleapis.com/css2?family=Crimson+Pro:wght@400;500;600;700&family=Manrope:wght@400;500;600;700&display=swap');

/* ── Typography hierarchy (H1 > H2 > H3 > H4 > p) ─────────────── */

.dac-text-block h1 {
font-family: 'Crimson Pro', Georgia, serif !important;
font-size: 48px !important;
font-weight: 700 !important;
color: #3D3429 !important;
line-height: 1.2 !important;
margin: 0 0 4px 0 !important;
}

.dac-text-block h2 {
font-family: 'Crimson Pro', Georgia, serif !important;
font-size: 28px !important;
font-weight: 600 !important;
color: #3D3429 !important;
line-height: 1.3 !important;
margin: 0 0 4px 0 !important;
}

.dac-text-block h3 {
font-family: 'Crimson Pro', Georgia, serif !important;
font-size: 56px !important;
font-weight: 700 !important;
color: #3D3429 !important;
margin: 0 0 4px 0 !important;
line-height: 1.4 !important;
text-align: left !important;
}

.dac-text-block h4 {
font-family: 'Manrope', sans-serif !important;
font-size: 24px !important;
font-weight: 600 !important;
color: #3D3429 !important;
line-height: 1.5 !important;
margin: 0 0 2px 0 !important;
}

.dac-text-block p {
font-family: 'Manrope', sans-serif !important;
font-size: 14px !important;
font-weight: 400 !important;
color: #8B7E74 !important;
line-height: 1.6 !important;
margin: 0 !important;
}

/* ── Text blocks: transparent by default ────────────────────────── */
.dac-text-block {
background: transparent !important;
box-shadow: none !important;
border: none !important;
}

/* ── Viz block labels (chart titles → Crimson Pro) ──────────── */
.dac-viz-block-label {
font-family: 'Crimson Pro', Georgia, serif !important;
font-size: 24px !important;
font-weight: 600 !important;
font-style: normal !important;
line-height: 32px;
color: #3D3429 !important;
letter-spacing: -0.2px !important;
display: flex !important;
align-items: flex-end !important;
padding: 24px 8px 12px 8px !important;
margin-top: 18px;
margin-bottom: 0px;
min-height: 56px;
}

/* ── KPI labels (Total users, Monthly active users, etc.) ─────── */
.h-kpi-metric-label {
font-family: 'Manrope', sans-serif !important;
font-size: 13px !important;
font-weight: 500 !important;
color: #8B7E74 !important;
}

/* ── KPI block card background ────────────────────────────────── */
.ci-h-kpi-metric-body {
background-color: #F5F4EE !important;
border-radius: 12px !important;
padding: 20px !important;
gap: 4px !important;
}

/* ── KPI big numbers → Crimson Pro ─────────────────────────────── */
.h-kpi-metric-kpi {
font-family: 'Crimson Pro', Georgia, serif !important;
color: #2A2118 !important;
}

/* ── MetricSheet filter bar ────────────────────────────────────── */
.setting-wrapper {
font-size: 16px !important;
justify-content: flex-start !important;
}

.setting-wrapper .truncate.whitespace-pre {
font-size: 16px !important;
color: #D4714A !important;
font-weight: 600 !important;
}

.setting-wrapper .hui-select-trigger {
font-size: 16px !important;
}

/* ── FilterBlock: inline label + styled value ─────────────────── */
.dm-filter-form {
display: flex !important;
flex-direction: row !important;
align-items: center !important;
gap: 12px !important;
min-height: 48px !important;
border-color: #E0D8D0 !important;
border-radius: 8px !important;
}

.dm-filter-form > .mb-0.5 {
margin-bottom: 0 !important;
font-size: 16px !important;
white-space: nowrap !important;
}

.dac-ic-block-label {
color: #4A4035 !important;
font-size: 4px !important;
}

.dm-filter-form,
.dm-filter-form * {
font-size: 16px !important;
}

.dm-filter-form .h-highlightable-input {
font-size: 16px !important;
box-shadow: none !important;
}

.dm-filter-form .hui-select-trigger {
box-shadow: none !important;
}

.dm-filter-form > .flex.min-w-0.flex-1.items-center {
padding-bottom: 16px !important;
}

.dm-filter-form mark.active {
color: #6B5D52 !important;
background-color: #F7F3EE !important;
font-size: 16px !important;
font-weight: 500 !important;
border-radius: 8px !important;
padding: 2px 6px !important;
}

/* ── Empty bg text block — hide text ─────────────────────────── */
#block-t2_empty_bg .inspecta-inspect,
#block-t2_empty_bg .text-content,
#block-t2_empty_bg .text-content * {
color: #FFFFFF !important;
}

/* ── MetricSheet top margin ──────────────────────────────────── */
#block-v_wyca .ag-root-wrapper {
margin-top: 24px !important;
}

/* ── MetricSheet metric name column ───────────────────────────── */
#block-v_wyca .ag-cell-value {
font-weight: 400 !important;
}

/* ── MetricSheet sparkline colors ──────────────────────────────── */
.sparkline-wrap rect {
stroke: #D4714A !important;
fill: #D4714A !important;
}

.sparkline-wrap path,
.sparkline-wrap line,
.sparkline-wrap polyline,
.sparkline-wrap circle {
stroke: #D4714A !important;
fill: none !important;
}

.sparkline-wrap svg [stroke] {
stroke: #D4714A !important;
}

.sparkline-wrap canvas {
filter: hue-rotate(200deg) saturate(1.5) !important;
}

/* ── KPI Card (MarkdownViz) ─────────────────────────────────────── */

/* [1] LABEL — top text */
.mrr-title {
font-family: 'Manrope', sans-serif !important;
font-size: 13px !important;
font-weight: 600 !important;
color: #8B7E74 !important;
text-transform: uppercase !important;
letter-spacing: 0.08em !important;
margin: 0 !important;
}

/* [2] VALUE — big number */
.mrr-value {
font-family: 'Crimson Pro', Georgia, serif !important;
font-size: 40px !important;
font-weight: 700 !important;
color: #3D3429 !important;
letter-spacing: -0.5px !important;
line-height: 1 !important;
margin-top: 8px !important;
}

/* [3] FOOTER — row with badge + "vs last month" */
.mrr-footer {
font-family: 'Manrope', sans-serif !important;
font-size: 16px !important;
font-weight: 400 !important;
color: #4A4035 !important;
margin-top: 10px !important;
}

/* [4] BADGE — colored pill */
.mrr-badge {
display: inline-flex !important;
align-items: center !important;
gap: 4px !important;
padding: 3px 10px !important;
border-radius: 6px !important;
font-family: 'Manrope', sans-serif !important;
font-size: 16px !important;
font-weight: 600 !important;
}

/* [5] SPARKLINE — SVG area chart at bottom */
.mrr-spark {
margin-top: 12px !important;
display: block !important;
}

/* ── Chart top padding overrides ──────────────────────────────── */
#block-t1_mrr_time {
padding-top: 32px !important;
}

#block-t2_new_vs_churn {
padding-top: 32px !important;
}

#block-t2_exp_contr {
padding-top: 32px !important;
}

/* ── Canvas bg override ─────────────────────────────────────────── */
.dac-canvas {
background-color: #FAF8F6 !important;
}

/* ── MRR Movers date filter: white bg + hide link icon ────────── */
#block-f_movers_date .dm-filter-form {
background-color: #FFFFFF !important;
}

#block-f_movers_date .dac-ic-block-label {
display: none !important;
}

/* ── MetricSheet table styling ───────────────────────────────── */

/* Table corner radius */
.ag-root-wrapper {
border-radius: 12px !important;
overflow: hidden !important;
}

/* Metric name cells */
.ag-cell-value {
font-family: 'Manrope', sans-serif !important;
font-size: 16px !important;
font-weight: 400 !important;
color: #3D3429 !important;
}

/* Number value cells */
.ag-cell {
font-family: 'Manrope', sans-serif !important;
font-size: 16px !important;
color: #3D3429 !important;
}

/* Section heading rows (User engagement, Content creation, etc.) */
.text-row[data-ci="ci-text-row"] {
font-family: 'Manrope', sans-serif !important;
font-size: 16px !important;
font-weight: 600 !important;
color: #6B5D52 !important;
background-color: #F0EAE2 !important;
}

/* Sparkline colors → accent coral */
.sparkline-wrap rect {
stroke: #D4714A !important;
fill: #D4714A !important;
}

.sparkline-wrap path,
.sparkline-wrap line,
.sparkline-wrap polyline,
.sparkline-wrap circle {
stroke: #D4714A !important;
fill: none !important;
}

.sparkline-wrap svg [stroke] {
stroke: #D4714A !important;
}

Open Markdown
Let us know what you think about this document :)