Possible BrandCss and BrandJs parameters

Hello Community,

Is there any documentation available for the Brand Options parameters in the appsettings.console.json file?

I already figured out the BrandLogo setting myself. It appears to be a Base64-encoded image, and that worked perfectly.

However, I would also like to customize some of the colors, if possible. I tried using several CSS color names and parameter names I found in the HTML files, but without success.

Could someone point me to the relevant documentation or provide some examples of the supported branding options?

Thank you very much for your help.

Best regards,
Benjamin

Hi there,
I am not sure we have much on documentation for this right now. I will try and get you something something next week!

Ultimately, you need to extract the CSS classes from the HTML file then you need to use the same names we use but you can change the designs yourself.

I last did this in the pingcastle.exe.config days and not since the appsettings.console.json. I imagine there will be some slight changes required for the formatting.

So it is still fairly straight forward in the appsettings.

This is what you would need to add to get a dark mode report for example - it is not fully complete! I was just jamming with claude for a little bit :sweat_smile:

Ultimately to get the info you need you can right click and inspect element in the web ui to find the class or item that needs the CSS and then add in the css as needed.

{

  "Brand": {

    "BrandLogo": "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",

    "BrandCss": "body { background:#121212 !important; color:#E0E0E0 !important; } #wrapper.well { background:#1E1E1E !important; } .navbar-custom { background-color:#1A1A1A !important; } .navbar-custom .navbar-brand, .navbar-custom .navbar-text { color:#F5A623 !important; } .navbar-custom .navbar-nav .nav-link { color:#E0E0E0 !important; } .sectionheader { color:#8C86FF !important; } .section-header-container { background-color:#242424 !important; border-color:#333333 !important; } h1, h2, h3, h4, h5, h6 { color:#F5F5F5 !important; } a { color:#8C86FF !important; } .nav-tabs .nav-link, .nav-link { color:#8C86FF !important; border-color:#333 #333 #444 !important; } .nav-tabs .nav-link.active, .nav-tabs .nav-item.show .nav-link { color:#F5F5F5 !important; background-color:#242424 !important; } .nav-item.bg-light { background-color:#242424 !important; } .card, .card-body { background-color:#1E1E1E !important; color:#E0E0E0 !important; border-color:#444444 !important; } .card-header { background-color:#242424 !important; color:#E0E0E0 !important; border-color:#333333 !important; } .card-title { color:#F5F5F5 !important; } .btn-primary { background-color:#5851DB !important; border-color:#5851DB !important; } .alert-info { background-color:#1E2A38 !important; color:#E0E0E0 !important; } .tooltip-inner { background-color:#2A2A2A !important; color:#E0E0E0 !important; } .tooltip-arrow::before { border-top-color:#2A2A2A !important; } .popover, .popover-header, .popover-body { background-color:#2A2A2A !important; color:#E0E0E0 !important; border-color:#444444 !important; } table, .table, .text { color:#E0E0E0 !important; } .table { --bs-table-color:#E0E0E0 !important; --bs-table-striped-color:#E0E0E0 !important; --bs-table-hover-color:#E0E0E0 !important; --bs-table-active-color:#E0E0E0 !important; --bs-table-bg:#1E1E1E !important; --bs-table-striped-bg:#262626 !important; --bs-table-border-color:#444444 !important; } .no-records-found, .no-records-found td { color:#E0E0E0 !important; background-color:#1E1E1E !important; } .fixed-table-toolbar, .fixed-table-pagination, .fixed-table-container { background-color:#1E1E1E !important; color:#E0E0E0 !important; } .form-control.search-input { background-color:#1E1E1E !important; color:#E0E0E0 !important; border-color:#444444 !important; } .form-control.search-input::placeholder { color:#888888 !important; } .btn-secondary { background-color:#2A2A2A !important; color:#E0E0E0 !important; border-color:#444444 !important; } .dropdown-menu { background-color:#2A2A2A !important; border-color:#444444 !important; } .dropdown-item { color:#E0E0E0 !important; } .dropdown-item:hover { background-color:#3A3A3A !important; color:#F5F5F5 !important; } .page-link { background-color:#2A2A2A !important; border-color:#444444 !important; } .page-item.active .page-link { background-color:#5851DB !important; color:#fff !important; } .needle, .needle-center { fill:#F5F5F5 !important; } .indicators-border { border-color:#333333 !important; } .model_cell { background-color:#2A2A2A !important; border-color:#555555 !important; } .model_cell.model_good { background-color:#2A2A2A !important; color:#E0E0E0 !important; } .badge { background-color:#333333 !important; color:#E0E0E0 !important; } .bar { fill:#8C86FF !important; } .sectors path\[fill=\\"#77A9E3\\"\] { fill:#8C86FF !important; } .tick text { fill:#E0E0E0 !important; } .tick line { stroke:#666666 !important; } .domain { stroke:#666666 !important; } .modal-content, .modal-body, .modal-footer { background-color:#1E1E1E !important; color:#E0E0E0 !important; border-color:#444444 !important; }",

    "BrandJs": "document.addEventListener('DOMContentLoaded', function() { document.body.classList.add('pingcastle-dark'); document.querySelectorAll('.sectors path\[fill\]').forEach(function(p){ if ((p.getAttribute('fill')||'').toUpperCase() === '#77A9E3') { p.setAttribute('fill', '#8C86FF'); } }); });"

  }

}

What each `BrandCss` rule does, in order:

Rule Effect
body Page background → near-black `#121212`, base text → light grey
#wrapper.well Main content card background → dark grey `#1E1E1E` (was white)
.navbar-custom Top nav bar background → near-black
.navbar-custom .navbar-brand .navbar-text Brand text next to logo → amber, readable on dark
.navbar-custom .navbar-nav .nav-link Nav menu links → light grey
.sectionheader Section titles → brand purple `#8C86FF` accent, still underlined
.section-header-container Section banner boxes → dark grey `#242424` (was light grey #F6F6F6)
h1h6 All headings → near-white for contrast
a Body hyperlinks → lighter purple `#8C86FF` (original `#5851DB` is too dark to read on #121212)
.nav-tabs .nav-link, .nav-link Tab labels (report section tabs and the generic Maturity Model tab strip, which has no PingCastle-specific class) → lighter purple; without the plain .nav-link rule the Maturity Model tabs stay unstyled/white-on-dark
.nav-tabs .nav-link.active, .nav-item.show .nav-link Active tab background → dark grey instead of white
.nav-item.bg-light Maturity Model level tabs (<li class='nav-item bg-light'>) → dark background instead of Bootstrap’s .bg-light utility grey; needs !important\ because Bootstrap’s own .bg-light utility ships with !important baked in
.card-header Card header bars (Maturity Model indicator groups, rule detail cards) → dark grey background, light text instead of default white/light-grey Bootstrap card header
.card-title Bold card title text → near-white instead of default dark Bootstrap text
.btn-primary Unchanged brand purple — already has enough contrast on dark
.alert-info Info callout → dark navy background instead of light blue
.tooltip-inner Hover tooltips → dark grey instead of white
table, .table, .text Table text (including bootstrap-table cell class .text) → light grey instead of default dark; without .text normal table cell text stays dark-on-dark
.table (CSS variables) Row/text/background colours for native Bootstrap table-striped table-bordered rule-finding tables → sets --bs-table-striped-color``--bs-table-hover-color``--bs-table-active-color, the variables Bootstrap’s .table-striped>tbody>tr:nth-of-type(odd)>* rule reads for text colour directly on each <td> (specificity beats inheriting from .table’s own color, !important or not)
.no-records-found (+ td) “No matching records found” empty-state table row → light text on dark background instead of default dark-on-transparent (unreadable on dark theme)
.card, .card-body Card containers around risk indicators/maturity blocks → dark background instead of default Bootstrap white; border colour also set
.tooltip-arrow::before Tooltip pointer triangle → matches dark tooltip body colour instead of default (mismatched light triangle on a dark tooltip)
.popover, .popover-header, .popover-body Bootstrap 5 hover/click popovers → dark background, light text, visible border instead of default white
.fixed-table-toolbar, .fixed-table-pagination, .fixed-table-container bootstrap-table toolbar/pagination row background → dark, but this alone does not reach the form controls sitting inside it (see next four rows)
.form-control.search-input The “Search” box above each table → dark background/border, light text, dimmed placeholder
.btn-secondary “Rows per page” and export (⭳) toggle buttons → dark background instead of default white
.dropdown-menu Page-size and export-format popup panels → dark background instead of default white
.dropdown-item (+ :hover) Rows inside those dropdowns (10``25``50,JSON``CSV etc.) → light text, visible hover highlight instead of invisible dark-on-dark
.page-link (+ .page-item.active .page-link) Pagination number buttons → dark background instead of default white; active page keeps the brand purple highlight
.needle, .needle-center Gauge pointer + pivot dot — without this the needle is near-invisible (#1A172A on a #121212 background)
.indicators-border Border box around each gauge → lightened so it’s visible against the dark page (default #E1E5EA is barely visible on dark)
.model_cell (+ .model_good) Maturity-model grid squares for “good”/neutral indicators → given an explicit dark background; by default these two rules have no colour declarations at all and would otherwise render as a near-invisible dark square with only a black border
.badge Small count/label pills → dark background instead of default white Bootstrap badge
.bar Histogram bar fill (e.g. password-age charts) → recoloured to light purple #8C86FF instead of the default blue #77A9E3
.tick text (+ .tick line, .domain) Chart axis labels, tick marks, and baseline → light grey/mid-grey instead of hardcoded inline black, which was otherwise invisible on a dark background
.sectors path[fill="#77A9E3"] Single-value (100%) pie charts → recoloured to the same light purple as .bar; attribute-selector targets only this exact hardcoded blue so multi-category pies (which reuse the same no-class rendering path but with a 20-colour palette) are left untouched
.modal-content, .modal-body, .modal-footer Rest of every modal dialog → dark background/text/border, matching the already-purple .modal-header; without this the header is themed but the body/footer beneath it stay default Bootstrap white

Hope this helps!

Hello Joe,

thank you very much for that detailed reply. I am sure everyything i need to change is somewhere in there :slight_smile:

I will try it and give you a reply how much i needed ti change.

Thank you very much

Best regards
Benjamin

No problem at all Benjamin. Definitely keen to hear how you get on :slight_smile: