# Mouka MRR Dashboard > A subscription revenue dashboard that looks like a shipped SaaS product. **Revenue & finance · Light · Tabbed** A subscription revenue dashboard that looks like a shipped SaaS product. If you want a reference for a polished light theme, start here. ## What makes it work - Warm cream and coral on white, with the accent colour used sparingly so it still means something when it appears. - A disciplined type scale: three sizes, and thin section rules instead of card borders. - The metric tree tab shows how the headline number decomposes. That is hard to do well and rare to see. - A cohort retention grid and a revenue movement waterfall carry the analysis using built-in charts only. ## The views Each tab is shown below at full width. ### Overview ### Revenue Movement ### Churn and Retention ### Customers and Segments ### Metric Tree ## See it live [Open the live dashboard](https://demo4.holistics.io/dashboards/v4/114240-mouka-mrr-dashboard?_pl=c41c810fe2c433595bca17de) 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](/docs/admin/dashboard-themes/color-palettes), so they are not included here.
mouka_mrr_theme.theme.aml ```aml PageTheme mouka_mrr_theme { background { bg_color: "#EADFD9" } canvas { border { border_color: "#E8E0D8" 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: "#FBF9F7" } } block { text { font_size: 20 font_color: "#4B4340" font_style: "normal" font_family: "Plus Jakarta Sans" font_weight: "normal" } label { font_size: 13 font_color: "#4B4340" font_style: "normal" font_family: "Plus Jakarta Sans" 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: "#F2ECE4" font_size: 16 font_color: "#4B4340" font_weight: "bold" } general { bg_color: "#FFFFFF" font_size: 18 font_color: "#374151" font_family: "Inter" hover_color: "#F9F5F0" banding_color: "#FFFFFF" grid_color: "#F0EAE2" border_color: "#E8E0D8" border_width: 1 } sub_title { font_size: 16 font_color: "#6B7280" font_weight: "normal" } sub_header { bg_color: "#F9F5F0" font_size: 18 font_color: "#897669" font_weight: "normal" } } } } ```
The theme is paired with custom CSS, which lives beside it rather than inside it. See [Custom CSS](/docs/admin/dashboard-themes/custom-css) for where it goes.
Custom CSS ```css /* ── Fonts ──────────────────────────────────────────────────────── */ @import url('https://fonts.googleapis.com/css2?family=Merriweather:wght@400;700&family=Plus+Jakarta+Sans:wght@400;500;600;700&display=swap'); /* ── Typography hierarchy (H1 > H2 > H3 > H4 > p) ─────────────── */ .dac-text-block h1 { font-family: 'Merriweather', Georgia, serif !important; font-size: 48px !important; font-weight: 700 !important; color: #312520 !important; line-height: 1.2 !important; margin: 0 0 4px 0 !important; } .dac-text-block h2 { font-family: 'Merriweather', sans-serif !important; font-size: 28px !important; font-weight: 600 !important; color: #312520 !important; line-height: 1.3 !important; margin: 0 0 4px 0 !important; } .dac-text-block h3 { font-family: 'Merriweather', Georgia, serif !important; font-size: 28px !important; font-weight: 600 !important; color: #CCC0B2 !important; margin: 0 0 4px 0 !important; line-height: 1.4 !important; text-align: left !important; } .dac-text-block h4 { font-family: 'Plus Jakarta Sans', sans-serif !important; font-size: 24px !important; font-weight: 600 !important; color: #312520 !important; line-height: 1.5 !important; margin: 0 0 2px 0 !important; } .dac-text-block p { font-family: 'Plus Jakarta Sans', sans-serif !important; font-size: 14px !important; font-weight: 400 !important; color: #6B7280 !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 ───────────────────────────────────────────── */ .dac-viz-block-label { font-family: 'Plus Jakarta Sans', sans-serif !important; font-size: 24px !important; font-weight: 600 !important; font-style: normal !important; line-height: 32px; color: #312520 !important; letter-spacing: -0.2px !important; display: flex !important; align-items: center !important; padding: 24px 8px 12px 8px !important; margin-top: 18px; margin-bottom: 32px; } /* ── MetricSheet filter bar ────────────────────────────────────── */ .setting-wrapper { font-size: 16px !important; } .setting-wrapper .truncate.whitespace-pre { font-size: 16px !important; color: #CE5531 !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: #E8E0D8 !important; border-radius: 8px !important; color: #FFFFFF !important; } .dm-filter-form > .mb-0.5 { margin-bottom: 0 !important; font-size: 16px !important; white-space: nowrap !important; } .dac-ic-block-label { color: #FFFFFF !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: #766051 !important; background-color: #F8F2ED !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; color: #2A2522 !important; } #block-v_wyca .text-row { font-weight: 500 !important; color: #766051 !important; } /* ── MetricSheet title ───────────────────────────────────────── */ #block-v_wyca .metric-sheet-title { font-weight: 700 !important; color: #423935 !important; } /* ── MetricSheet sparkline colors ──────────────────────────────── */ .sparkline-wrap rect { stroke: #E1643F !important; fill: #E1643F !important; } .sparkline-wrap path, .sparkline-wrap line, .sparkline-wrap polyline, .sparkline-wrap circle { stroke: #E1643F !important; fill: none !important; } .sparkline-wrap svg [stroke] { stroke: #E1643F !important; } .sparkline-wrap canvas { filter: hue-rotate(200deg) saturate(1.5) !important; } /* ── KPI Card (MarkdownViz) ─────────────────────────────────────── */ /* [1] LABEL — "TOTAL MRR" top text */ .mrr-title { font-family: 'Plus Jakarta Sans', sans-serif !important; font-size: 13px !important; /* label size */ font-weight: 600 !important; /* label weight */ color: #978A81 !important; /* label color */ text-transform: uppercase !important; /* UPPERCASE style */ letter-spacing: 0.08em !important; /* letter spacing */ margin: 0 !important; /* spacing */ } /* [2] VALUE — "65,830.37" big number */ .mrr-value { font-family: 'Merriweather', Georgia, serif !important; font-size: 40px !important; /* value size */ font-weight: 700 !important; /* value weight */ color: #312520 !important; /* value color */ letter-spacing: -0.5px !important; /* tighten spacing */ line-height: 1 !important; /* line height */ margin-top: 8px !important; /* spacing above value */ } /* [3] FOOTER — row with badge + "vs last month" */ .mrr-footer { font-family: 'Plus Jakarta Sans', sans-serif !important; font-size: 16px !important; /* footer text size */ font-weight: 400 !important; /* footer weight */ color: #4B4340 !important; /* "vs last month" color */ margin-top: 10px !important; /* spacing above footer */ } /* [4] BADGE — colored pill next to "vs last month" */ .mrr-badge { display: inline-flex !important; align-items: center !important; gap: 4px !important; padding: 3px 10px !important; border-radius: 6px !important; font-family: 'Plus Jakarta Sans', sans-serif !important; font-size: 16px !important; font-weight: 600 !important; } /* [5] SPARKLINE — SVG area chart at bottom */ .mrr-spark { margin-top: 12px !important; /* spacing above sparkline */ display: block !important; } /* ── Chart VizBlock top padding (tab by tab) ────────────────── */ /* Tab 1: Overview */ #block-t1_mrr_time, #block-t1_waterfall { padding-top: 32px !important; } /* Tab 2: Revenue Movements */ #block-t2_movement, #block-t2_new_vs_churn, #block-t2_exp_contr { padding-top: 32px !important; } /* Tab 3: Churn & Retention */ #block-t3_churn_rates, #block-t3_cust_churn_trend, #block-t3_nrr_trend, #block-t3_churn_reason, #block-t3_cohort, #block-t3_churned_accounts { padding-top: 32px !important; } /* Tab 4: Customers & Segments */ #block-t4_plan_cards, #block-t4_mrr_industry, #block-t4_mrr_region, #block-t4_concentration { padding-top: 32px !important; } /* Tab 5: Deep Dive */ #block-v_qao4, #block-v_e2y6 { padding-top: 32px !important; } /* ── Chart top spacing (Vega-Lite svg.marks) ─────────────────── */ svg.marks { transform: translateY(16px) !important; } /* ── Canvas bg override ─────────────────────────────────────────── */ .dac-canvas { background-color: #FBFAF8 !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; } /* ── Info Tooltip Icons ──────────────────────────────────────── */ .info-icon-wrap { position: relative; display: inline-block; line-height: 1; } .info-icon-wrap .info-icon-btn { width: 18px; height: 18px; cursor: pointer; opacity: 0.5; transition: opacity 0.2s ease; display: block; } .info-icon-wrap:hover .info-icon-btn { opacity: 0.85; } .info-icon-wrap .info-tip { position: absolute; width: 280px; background: #FFFFFF; border: 1px solid #E8E0D8; border-radius: 12px; box-shadow: 0 4px 20px rgba(75, 67, 64, 0.12); padding: 16px 20px; opacity: 0; visibility: hidden; transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1); z-index: 9999; font-family: 'Plus Jakarta Sans', sans-serif; } .info-icon-wrap:hover .info-tip { opacity: 1; visibility: visible; } .info-icon-wrap .info-tip::after { content: ''; position: absolute; width: 0; height: 0; } .info-icon-wrap .info-tip.pos-right { top: 50%; left: calc(100% + 10px); transform: translateY(-50%); } .info-icon-wrap:hover .info-tip.pos-right { left: calc(100% + 14px); } .info-icon-wrap .info-tip.pos-right::after { top: 50%; left: -6px; transform: translateY(-50%); border-top: 6px solid transparent; border-bottom: 6px solid transparent; border-right: 6px solid #FFFFFF; } .info-icon-wrap .info-tip.pos-left { top: 50%; right: calc(100% + 10px); left: auto; transform: translateY(-50%); } .info-icon-wrap:hover .info-tip.pos-left { right: calc(100% + 14px); } .info-icon-wrap .info-tip.pos-left::after { top: 50%; right: -6px; left: auto; transform: translateY(-50%); border-top: 6px solid transparent; border-bottom: 6px solid transparent; border-left: 6px solid #FFFFFF; } .info-icon-wrap .info-tip.pos-top { bottom: calc(100% + 10px); left: 50%; transform: translateX(-50%); } .info-icon-wrap:hover .info-tip.pos-top { bottom: calc(100% + 14px); } .info-icon-wrap .info-tip.pos-top::after { top: 100%; left: 50%; transform: translateX(-50%); border-left: 6px solid transparent; border-right: 6px solid transparent; border-top: 6px solid #FFFFFF; } .info-icon-wrap .info-tip.pos-bottom { top: calc(100% + 10px); left: 50%; transform: translateX(-50%); } .info-icon-wrap:hover .info-tip.pos-bottom { top: calc(100% + 14px); } .info-icon-wrap .info-tip.pos-bottom::after { bottom: 100%; left: 50%; transform: translateX(-50%); border-left: 6px solid transparent; border-right: 6px solid transparent; border-bottom: 6px solid #FFFFFF; } .info-icon-wrap .info-tip-header { font-size: 14px; font-weight: 600; color: #4B4340; margin-bottom: 12px; line-height: 1.3; } .info-icon-wrap .info-tip-section { padding-top: 10px; margin-top: 10px; border-top: 1px solid #E8E0D8; } .info-icon-wrap .info-tip-section:first-of-type { padding-top: 0; margin-top: 0; border-top: none; } .info-icon-wrap .info-tip-label { font-size: 11px; font-weight: 600; color: #978A81; text-transform: uppercase; letter-spacing: 0.08em; margin-bottom: 4px; line-height: 1; } .info-icon-wrap .info-tip-body { font-size: 13px; font-weight: 400; color: #374151; line-height: 1.5; } .info-icon-wrap .info-tip-body code { font-size: 12px; background: #F9F5F0; padding: 1px 5px; border-radius: 4px; color: #4B4340; font-family: 'JetBrains Mono', monospace; } ```