diff --git a/components/package.json b/components/package.json index c0368eee9ca..06e83adbd3f 100644 --- a/components/package.json +++ b/components/package.json @@ -1,6 +1,6 @@ { "name": "defectdojo", - "version": "3.1.100", + "version": "3.1.101", "license": "BSD-3-Clause", "private": true, "dependencies": { diff --git a/docker/entrypoint-first-boot.sh b/docker/entrypoint-first-boot.sh index ffc782b4ccc..ae7d6f9bd5e 100644 --- a/docker/entrypoint-first-boot.sh +++ b/docker/entrypoint-first-boot.sh @@ -1,6 +1,6 @@ #!/bin/bash # called from entrypoint-initializer.sh when no admin user exists (first boot) -cat < { "use strict"; - console.log("[VersionToggle] custom.js loaded"); - // Asset-modelling landing pages per edition. The top nav is otherwise // static, so a single URL can't be correct for both editions: we keep the // "Model Your Assets" nav link in sync with the selected version, and — @@ -28,30 +43,21 @@ }; const setVersion = (version) => { - console.log("[VersionToggle] Setting version to:", version); + // CSS shows the matching menu and highlights the matching button + document.documentElement.dataset.ddVersion = version; - document.querySelectorAll(".version-opensource, .version-pro").forEach(el => { - el.style.display = el.classList.contains(`version-${version}`) ? "block" : "none"; - }); - - localStorage.setItem("version", version); - console.log("[VersionToggle] localStorage updated:", localStorage.getItem("version")); + try { + localStorage.setItem("version", version); + } catch (e) { + // Storage blocked (private browsing) — toggle still works this page + } - // Update dropdown - const selects = document.querySelectorAll("#version-select"); - selects.forEach(sel => { - sel.value = version; - sel.dataset.version = version; - sel.style.visibility = "visible"; + // aria-checked is for assistive tech only; visuals come from the + // html[data-dd-version] attribute above + document.querySelectorAll(".dd-version-seg button[data-version-value]").forEach(btn => { + btn.setAttribute("aria-checked", btn.dataset.versionValue === version ? "true" : "false"); }); - // unhide sidebar after version is applied - const sidebar = document.querySelector(".docs-sidebar"); - if (sidebar) { - sidebar.style.visibility = "visible"; - console.log("[VersionToggle] Sidebar revealed"); - } - // Edition-aware top nav: route "Model Your Assets" to the page that // matches the selected version (see assetNavUrls above). document.querySelectorAll("a.nav-link").forEach(link => { @@ -62,19 +68,20 @@ }; const initVersionToggle = () => { - const storedVersion = localStorage.getItem("version") || "opensource"; - console.log("[VersionToggle] Stored version:", storedVersion); - setVersion(storedVersion); + // custom-head.html already stamped the stored edition on before + // paint; re-applying it here syncs aria-checked and the nav link on + // freshly parsed (or dynamically replaced) markup. + setVersion(document.documentElement.dataset.ddVersion || "opensource"); }; - // Delegated listener on body - document.body.addEventListener("change", (e) => { - if (e.target && e.target.id === "version-select") { - console.log("[VersionToggle] Dropdown changed to:", e.target.value); - setVersion(e.target.value); + // Delegated listener on body — catches every control instance + document.body.addEventListener("click", (e) => { + const btn = e.target.closest("button[data-version-value]"); + if (btn) { + setVersion(btn.dataset.versionValue); // Only on an explicit user toggle (not on load) follow the page to // the matching edition when viewing an asset-modelling page. - switchAssetPageForVersion(e.target.value); + switchAssetPageForVersion(btn.dataset.versionValue); } }); @@ -91,6 +98,56 @@ })(); +// Code block language labels — stamp the fence language onto each +// expressive-code frame's (empty) title span so CSS can render it in the +// header band via attr(data-lang). Frames whose fence "language" is really +// an editor artifact (paths, line ranges) get a generic "code" label. +(() => { + "use strict"; + + const CLEAN_LANG = /^[a-z0-9_+#.-]{1,16}$/i; + + const init = () => { + document.querySelectorAll(".docs-content .expressive-code .frame").forEach(frame => { + const title = frame.querySelector(".header .title"); + if (!title || title.textContent.trim() !== "" || title.dataset.lang) return; + const code = frame.querySelector("pre code[data-lang]"); + let lang = code ? code.dataset.lang : ""; + if (!lang || lang === "fallback" || !CLEAN_LANG.test(lang)) lang = "code"; + title.dataset.lang = lang; + frame.classList.add("dd-has-lang"); + }); + }; + + if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", init); + } else { + init(); + } +})(); + + +// Homepage hero search field — forwards to the DocSearch modal +(() => { + "use strict"; + + const init = () => { + const trigger = document.getElementById("ddHomeSearch"); + if (!trigger) return; + trigger.addEventListener("click", () => { + const btn = document.getElementsByClassName("DocSearch-Button")[0]; + if (btn) btn.click(); + }); + }; + + if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", init); + } else { + init(); + } +})(); + + // Scroll progress bar — shows reading progress on doc pages (() => { "use strict"; diff --git a/docs/assets/scss/common/_custom.scss b/docs/assets/scss/common/_custom.scss index 22e0522e75a..38ece151749 100644 --- a/docs/assets/scss/common/_custom.scss +++ b/docs/assets/scss/common/_custom.scss @@ -1,3 +1,16 @@ +// ============================================================ +// DefectDojo Docs design system +// +// Imported last in doks-core app.scss — everything here wins the +// cascade. Selectors defined here are safelisted from PurgeCSS via +// purgecss-whitelister (see config/postcss.config.js). +// +// Architecture: CSS custom properties define both themes once +// (:root = light, [data-bs-theme="dark"] = dark); components read +// tokens instead of hardcoding hex per mode. Navy header/footer and +// code cards are shared brand surfaces with trust.defectdojo.com. +// ============================================================ + // ============================================================ // Font Face Declarations — Work Sans (Brand Typeface) // ============================================================ @@ -57,52 +70,295 @@ } // ============================================================ -// Layout +// Design tokens — light (default) + dark +// ============================================================ + +:root { + --dd-navy: #{$dd-navy}; + --dd-navy-2: #{$dd-navy-2}; + --dd-blue: #{$dd-fuji-blue}; + --dd-blue-deep: #0f5e9e; + --dd-blue-bright: #4aa3e8; + --dd-orange: #{$dd-torii-orange}; + --dd-orange-deep: #{$dd-torii-hue-03}; + + --dd-page: #ffffff; + --dd-surface: #ffffff; + --dd-surface-2: #f5f8fb; + --dd-ink: #{$dd-ink}; + --dd-muted: #{$dd-muted}; + --dd-border: #{$dd-border}; + --dd-border-strong: #cfd9e6; + --dd-link: #0f5e9e; + --dd-link-hover: #{$dd-fuji-blue}; + --dd-icon-tile: #eaf3fb; + --dd-icon-ink: #0f5e9e; + --dd-shadow-card: 0 1px 2px rgba(10, 22, 40, 0.05), 0 6px 20px -10px rgba(10, 22, 40, 0.1); + --dd-shadow-card-hover: 0 2px 4px rgba(10, 22, 40, 0.06), 0 14px 34px -12px rgba(10, 22, 40, 0.18); + + // Navy brand surfaces (header, footer, hero, code) — same in both modes + --dd-hero-ink: #f2f6fc; + --dd-hero-muted: #b7c5d9; + --dd-hero-line: rgba(151, 180, 216, 0.16); + + // Code cards + --dd-code-bg: #0d1b2f; + --dd-code-border: #23374f; + --dd-code-ink: #d7e3f4; + --dd-code-head: #0a1626; +} + +[data-bs-theme='dark'] { + --dd-page: #0b1422; + --dd-surface: #101d31; + --dd-surface-2: #16253c; + --dd-ink: #e7edf6; + --dd-muted: #93a3ba; + --dd-border: #243449; + --dd-border-strong: #334761; + --dd-link: #4aa3e8; + --dd-link-hover: #7fc0f2; + --dd-icon-tile: #16304a; + --dd-icon-ink: #4aa3e8; + --dd-shadow-card: 0 1px 2px rgba(0, 0, 0, 0.3), 0 6px 20px -10px rgba(0, 0, 0, 0.5); + --dd-shadow-card-hover: 0 2px 4px rgba(0, 0, 0, 0.35), 0 14px 34px -12px rgba(0, 0, 0, 0.6); + + --dd-code-bg: #0e1d33; + --dd-code-border: #273c58; + --dd-code-head: #0b1728; +} + +// ============================================================ +// Layout & base // ============================================================ .container-lg { max-width: 100%; } -html { - font-size: 85%; +body { + background-color: var(--dd-page); + color: var(--dd-ink); + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; } -// ============================================================ -// Typography — Brand Weight Hierarchy -// ============================================================ +a { + color: var(--dd-link); + + &:hover { + color: var(--dd-link-hover); + } +} h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { - font-weight: 600; // Semi Bold per brand guidelines - color: #191919; // Dojo Black + font-weight: 600; + color: var(--dd-ink); +} + +::selection { + background-color: rgba($dd-fuji-blue, 0.22); } // ============================================================ -// Navbar +// Header — navy brand band, both color modes // ============================================================ -.navbar .nav-link { - font-weight: 500; // Medium per brand guidelines for nav/buttons +.dd-header { + background: + linear-gradient(180deg, rgba(23, 121, 197, 0.12), rgba(23, 121, 197, 0) 55%), + var(--dd-navy); + border-bottom: 1px solid rgba(151, 180, 216, 0.14); + padding-top: 0.5rem; + padding-bottom: 0.375rem; + + // Brand hairline: blue→orange stripe across the very top + &::before { + content: ''; + position: absolute; + inset: 0 0 auto; + height: 2px; + background: linear-gradient(90deg, var(--dd-blue) 0%, var(--dd-blue-bright) 55%, var(--dd-orange) 100%); + } + + // Always show the dark-surface logo inside the navy band + .logo-lightmode { + display: none; + } + + .logo-darkmode { + display: inline-block; + } + + .dd-wordmark { + color: var(--dd-hero-ink); + font-weight: 500; + letter-spacing: 0.01em; + } + + .nav-link, + .btn-link { + color: var(--dd-hero-muted); + + &:hover, + &:focus-visible { + color: #ffffff; + } + } + + // The main nav row sits inside #offcanvasNavMain but OUTSIDE + // .offcanvas-body in this header, so scope to .navbar-nav directly. + .navbar-nav .nav-link { + font-size: 0.9375rem; + font-weight: 500; + padding: 0.3125rem 0.75rem; + border-radius: 0.5rem; + white-space: nowrap; + color: var(--dd-hero-muted); + + &:hover { + color: #ffffff; + background-color: rgba(151, 180, 216, 0.12); + } + + &.active { + color: #ffffff; + background-color: rgba(23, 121, 197, 0.28); + } + } + + // Release chip next to the logo + .dd-release-chip { + display: inline-flex; + align-items: center; + font-size: 0.75rem; + font-weight: 500; + letter-spacing: 0.02em; + color: var(--dd-hero-muted); + background: rgba(23, 121, 197, 0.18); + border: 1px solid rgba(151, 180, 216, 0.28); + border-radius: 999px; + padding: 0.2rem 0.75rem; + text-decoration: none; + transition: color 0.15s ease, border-color 0.15s ease; + + &:hover { + color: #ffffff; + border-color: rgba(151, 180, 216, 0.55); + } + } } -.navbar .nav-link.active { - color: #1779C5; // Fuji Blue +// Search pill (DocSearch trigger) in the navy header +#searchToggleDesktop { + border: 1px solid rgba(151, 180, 216, 0.3); + border-radius: 999px; + padding: 0.375rem 1rem; + font-size: 0.875rem; + color: var(--dd-hero-muted); + background: rgba(10, 22, 40, 0.35); + gap: 0.375rem; + min-width: 13rem; + + &:hover { + border-color: rgba(151, 180, 216, 0.6); + color: #ffffff; + background: rgba(23, 121, 197, 0.18); + } + + .search-kbd { + font-family: inherit; + font-size: 0.6875rem; + font-weight: 600; + border: 1px solid rgba(151, 180, 216, 0.34); + border-radius: 0.3125rem; + padding: 0.05rem 0.45rem; + line-height: 1.5; + color: var(--dd-hero-muted); + background: rgba(151, 180, 216, 0.1); + } } -// ============================================================ -// Sidebar -// ============================================================ +.header-social-links { + gap: 0.125rem; + + .social-link { + padding: 0.25rem; + opacity: 0.75; + transition: opacity 0.15s ease; + + &:hover { + opacity: 1; + } + } +} + +// Mobile offcanvas panels use theme surfaces (readable in both modes) +.offcanvas { + background-color: var(--dd-surface); + color: var(--dd-ink); + + .offcanvas-header .btn-link { + color: var(--dd-ink); + } +} + +// Inside the navy header band the offcanvas is inlined on desktop; scope the +// light-on-navy colors so the *panel* (mobile, position: fixed) stays themed. +@media (max-width: 991.98px) { + .dd-header .offcanvas .navbar-nav .nav-link { + color: var(--dd-ink); + + &:hover { + color: var(--dd-link); + background-color: var(--dd-surface-2); + } + + &.active { + color: var(--dd-link); + background-color: var(--dd-icon-tile); + } + } + + .dd-header .offcanvas .dd-wordmark { + color: var(--dd-ink); + } + + .dd-header .offcanvas .logo-darkmode { + display: none; + } + + .dd-header .offcanvas .logo-lightmode { + display: inline-block; + } -.docs-sidebar { - visibility: hidden; // Hide sidebar until version is resolved + [data-bs-theme='dark'] .dd-header .offcanvas .logo-lightmode { + display: none; + } + + [data-bs-theme='dark'] .dd-header .offcanvas .logo-darkmode { + display: inline-block; + } + + .dd-header .offcanvas .dd-release-chip { + color: var(--dd-muted); + background: var(--dd-icon-tile); + border-color: var(--dd-border); + } } +// ============================================================ +// Sidebar — column sizing, edition control, nav tree +// ============================================================ + @media (min-width: 992px) { @supports ((position: -webkit-sticky) or (position: sticky)) { .docs-sidebar { - display: flex !important; // Override Bootstrap d-lg-block { display: block !important } + display: flex !important; // Override Bootstrap d-lg-block flex-direction: column; + flex: 0 0 auto; + width: 17rem; } .docs-version-toggle { @@ -113,567 +369,921 @@ h1, h2, h3, h4, h5, h6, flex: 1; min-height: 0; // Required: allows flex child to shrink below content size overflow-y: auto; + overflow-x: hidden; + scrollbar-width: thin; + scrollbar-color: var(--dd-border) transparent; } .docs-links { - max-height: none; // Parent flex container now handles height/scroll + max-height: none; // Parent flex container handles height/scroll overflow: visible; } + + // Content column takes the remaining width beside fixed rails + .docs-content { + flex: 1 1 0; + width: auto; + min-width: 0; + max-width: 62rem; + } } } -.doks-sidebar .section-nav a { - color: #333333; // Dojo Hue 04 - transition: color 0.15s ease, background-color 0.15s ease; +@media (min-width: 1200px) { + .docs-toc { + flex: 0 0 auto; + width: 15rem; + } } -.doks-sidebar .section-nav a:hover { - color: #1779C5; // Fuji Blue - background-color: rgba(#C6DDF2, 0.3); // Fuji Hue 01, subtle -} +// --- Edition segmented control (Open Source ↔ Pro) --- -.doks-sidebar .section-nav a[aria-current="page"] { - color: #1779C5; // Fuji Blue - font-weight: 600; - border-left: 3px solid #1779C5; - padding-left: 0.5rem; - background-color: rgba(#C6DDF2, 0.15); +.docs-version-toggle { + padding-top: 1.75rem; + padding-bottom: 1rem; } -// ============================================================ -// Buttons -// ============================================================ +.dd-version-seg { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 0.25rem; + padding: 0.25rem; + background: var(--dd-surface-2); + border: 1px solid var(--dd-border); + border-radius: 0.625rem; + + button { + appearance: none; + border: 0; + background: transparent; + border-radius: 0.4375rem; + padding: 0.375rem 0.5rem; + font-size: 0.8125rem; + font-weight: 500; + color: var(--dd-muted); + transition: color 0.15s ease, background 0.15s ease, box-shadow 0.15s ease; + white-space: nowrap; -.btn-primary { - --bs-btn-bg: #1779C5; - --bs-btn-border-color: #1779C5; - --bs-btn-hover-bg: #204D87; - --bs-btn-hover-border-color: #204D87; - --bs-btn-active-bg: #003864; - --bs-btn-active-border-color: #003864; -} + &:hover { + color: var(--dd-ink); + } -.btn-cta { - --bs-btn-bg: #F2561D; - --bs-btn-border-color: #F2561D; - --bs-btn-hover-bg: #F2762E; - --bs-btn-hover-border-color: #F2762E; - --bs-btn-active-bg: #C1230D; - --bs-btn-active-border-color: #C1230D; - --bs-btn-color: #fff; - --bs-btn-hover-color: #fff; - --bs-btn-active-color: #fff; - font-weight: 500; // Medium for buttons -} + // Selected state keys off the edition stamped on before first + // paint (custom-head.html), not aria-checked — the static markup always + // ships aria-checked="true" on Open Source, so styling from it would + // flash the wrong button when Pro is stored. JS keeps aria-checked in + // sync for assistive tech. :not() makes Open Source the no-JS default. + html:not([data-dd-version='pro']) &[data-version-value='opensource'], + html[data-dd-version='pro'] &[data-version-value='pro'] { + color: #ffffff; + font-weight: 600; + } -.hero-actions .btn-outline-secondary { - --bs-btn-color: #191919; - --bs-btn-border-color: #191919; - --bs-btn-hover-bg: #191919; - --bs-btn-hover-border-color: #191919; - --bs-btn-hover-color: #fff; - --bs-btn-active-bg: #333333; - --bs-btn-active-border-color: #333333; - --bs-btn-active-color: #fff; -} + html:not([data-dd-version='pro']) &[data-version-value='opensource'] { + background: var(--dd-blue); + box-shadow: 0 1px 3px rgba(23, 121, 197, 0.4); + } -[data-bs-theme="dark"] .hero-actions .btn-outline-secondary { - --bs-btn-color: #e0e0e0; - --bs-btn-border-color: #e0e0e0; - --bs-btn-hover-bg: #e0e0e0; - --bs-btn-hover-border-color: #e0e0e0; - --bs-btn-hover-color: #191919; - --bs-btn-active-bg: #cccccc; - --bs-btn-active-border-color: #cccccc; - --bs-btn-active-color: #191919; + html[data-dd-version='pro'] &[data-version-value='pro'] { + background: var(--dd-orange); + box-shadow: 0 1px 3px rgba(242, 86, 29, 0.4); + } + } } -// ============================================================ -// Version Selector -// ============================================================ - -#version-select[data-version="opensource"] { - background-color: rgba(#003864, 0.72); - border: 2px solid #003864; - color: white; -} +.version-menu-wrapper { + border-top: 1px solid var(--dd-border); + padding-top: 0.75rem; + padding-right: 0.375rem; -#version-select[data-version="pro"] { - background-color: rgba(#F2561D, 0.72); - border: 2px solid #F2561D; - color: white; + // The theme bleeds .docs-links 24px past its column (margin-right: -24px), + // which pushed every item outside this scroll wrapper and clipped labels, + // badges, and the active pill at the right edge. + .docs-links { + margin-right: 0; + } } -// Hide Pro-versioned content by default (opensource is default). -// JS sets explicit inline display:block/none when version is toggled. -.version-pro { +// Both edition menus render; html[data-dd-version] (stamped before first +// paint by custom-head.html, updated by custom.js on toggle) decides which +// one shows. Without JS the attribute is absent and Open Source shows. +html[data-dd-version='pro'] .version-opensource, +html:not([data-dd-version='pro']) .version-pro { display: none; } // Pro badge — appears next to sidebar items with audience: pro -// Box height is `1lh` so it equals one line-height of the surrounding text. .pro-badge { display: inline-flex; align-items: center; box-sizing: border-box; height: 1lh; margin-left: 0.5em; - padding: 0 0.45em; - border: 1px solid #F2561D; - border-radius: 0.25rem; - background-color: rgba(#F2561D, 0.72); - color: #fff; - font-size: 0.7em; - font-weight: 500; + padding: 0 0.5em; + border-radius: 999px; + background-color: rgba($dd-torii-orange, 0.14); + border: 1px solid rgba($dd-torii-orange, 0.35); + color: var(--dd-orange-deep); + font-size: 0.6875em; + font-weight: 600; + letter-spacing: 0.04em; + text-transform: uppercase; vertical-align: middle; white-space: nowrap; } -// ============================================================ -// Cards -// ============================================================ - -.card { - border-color: #DCDCDC; // Dojo Hue 01 - transition: border-color 0.15s ease, box-shadow 0.15s ease; -} - -.card:hover { - border-color: #82B0D9; // Fuji Hue 02 - box-shadow: 0 2px 8px rgba(#1779C5, 0.1); -} - -.card a.stretched-link { - color: #1779C5; - font-weight: 500; -} - -// ============================================================ -// Code Blocks -// ============================================================ - -:not(pre) > code { - background-color: rgba(#C6DDF2, 0.25); // Fuji Hue 01, subtle - color: #204D87; // Fuji Hue 03 - border-radius: 3px; - padding: 0.15em 0.35em; +[data-bs-theme='dark'] .pro-badge { + color: #f0946e; + background-color: rgba($dd-torii-orange, 0.16); + border-color: rgba($dd-torii-orange, 0.45); } -// ============================================================ -// Breadcrumb -// ============================================================ - -.breadcrumb-item a { - color: #1779C5; -} +// --- Sidebar nav tree --- -.breadcrumb-item.active { - color: #666666; // Dojo Hue 03 -} +.doks-sidebar .section-nav, +.docs-sidebar .section-nav { + padding-top: 0.25rem; -// ============================================================ -// Logo — Dark / Light mode switching -// ============================================================ + // Top-level groups read as small-caps section labels + > ul > li > details > summary { + font-size: 0.75rem; + font-weight: 600; + letter-spacing: 0.06em; + text-transform: uppercase; + color: var(--dd-muted); + padding: 0.375rem 0; + line-height: 1.5; -.logo-darkmode { - display: none; -} + &:hover { + color: var(--dd-ink); + } + } -[data-bs-theme="dark"] .logo-lightmode { - display: none; -} + a { + display: block; + color: var(--dd-muted); + font-size: 0.9063rem; + line-height: 1.4; + margin: 0; + padding: 0.3125rem 0.625rem; + border-radius: 0.4375rem; + transition: color 0.13s ease, background-color 0.13s ease; -[data-bs-theme="dark"] .logo-darkmode { - display: inline-block; -} + &:hover { + color: var(--dd-link); + background-color: var(--dd-surface-2); + } -// ============================================================ -// DocSearch Overrides -// ============================================================ + &[aria-current='page'] { + color: var(--dd-link); + font-weight: 600; + background-color: var(--dd-icon-tile); + border-left: 0; + padding-left: 0.625rem; + } + } -.DocSearch-Container { - z-index: 2000 !important; -} + ul.list-nested { + border-left: 1px solid var(--dd-border); + margin-left: 0.25rem; -.DocSearch-Hit-icon { - display: flex; - align-items: center; -} + li a { + margin-left: -1px; + border-left: 2px solid transparent; + border-top-left-radius: 0; + border-bottom-left-radius: 0; -.DocSearch-Hits mark { - padding: 0; + &[aria-current='page'] { + border-left-color: var(--dd-blue); + } + } + } } -.DocSearch-Logo { - display: none !important; -} +// Chevron indicators on collapsible groups +.section-nav details > summary { + position: relative; + cursor: pointer; + padding-right: 1.5rem; + list-style: none; -@media (max-width: 768px) { - .DocSearch-Modal { - position: fixed !important; + // A clicked summary keeps :focus-visible in most browsers; the default + // outline ring gets clipped by the sidebar's scroll wrapper and reads as + // stray horizontal lines. Use a filled state instead (still obvious for + // keyboard users). + &:focus, + &:focus-visible { + outline: none; } -} - -// ============================================================ -// Selection Color -// ============================================================ -::selection { - background-color: rgba(#1779C5, 0.2); - color: #191919; + &:focus-visible { + background: var(--dd-icon-tile); + border-radius: 0.375rem; + color: var(--dd-ink); + } } -// ============================================================ -// Homepage Sections -// ============================================================ - -.section-features h2 { - color: #1779C5; // Fuji Blue +.section-nav details > summary::-webkit-details-marker { + display: none; } -.section-features a { - color: #F2561D; // Torii Orange for call-to-action links - font-weight: 500; +.section-nav details > summary::after { + content: ''; + position: absolute; + right: 0.375rem; + top: 50%; + width: 0.5rem; + height: 0.5rem; + border-right: 1.5px solid var(--dd-muted); + border-bottom: 1.5px solid var(--dd-muted); + transform: translateY(-70%) rotate(-45deg); + transition: transform 0.18s ease; } -.section-features a:hover { - color: #C1230D; // Torii Hue 03 +.section-nav details[open] > summary::after { + transform: translateY(-70%) rotate(45deg); } // ============================================================ -// Dark Mode — Brand Adaptation +// Content — the reading experience // ============================================================ -[data-bs-theme="dark"] { - // Headings in dark mode — bright white for strong contrast - h1, h2, h3, h4, h5, h6, - .h1, .h2, .h3, .h4, .h5, .h6 { - color: #f0f0f0; - } +.docs-content { + line-height: 1.75; + padding-bottom: 3rem; - // Links use lighter blue in dark mode - a { - color: #82B0D9; // Fuji Hue 02 + > h1 { + font-size: clamp(1.75rem, 3vw, 2.25rem); + font-weight: 700; + letter-spacing: -0.02em; + line-height: 1.15; + margin-bottom: 1.25rem; } - a:hover { - color: #C6DDF2; // Fuji Hue 01 + // Comfortable measure for running text; media/code/tables use full width + p, + ul, + ol, + blockquote { + max-width: 72ch; } - // CTA button — ensure solid fill in dark mode - .btn-cta { - --bs-btn-bg: #F2561D !important; - --bs-btn-border-color: #F2561D !important; - --bs-btn-hover-bg: #F2762E !important; - --bs-btn-hover-border-color: #F2762E !important; - --bs-btn-active-bg: #C1230D !important; - --bs-btn-active-border-color: #C1230D !important; - --bs-btn-color: #fff !important; - --bs-btn-hover-color: #fff !important; - --bs-btn-active-color: #fff !important; - background-color: #F2561D !important; - border-color: #F2561D !important; - color: #fff !important; + p, + li { + font-size: 1.0625rem; } - .btn-cta:hover { - background-color: #F2762E !important; - border-color: #F2762E !important; + li { + margin-bottom: 0.25rem; } - // Primary button in dark mode - .btn-primary { - --bs-btn-bg: #1779C5; - --bs-btn-border-color: #1779C5; - --bs-btn-hover-bg: #82B0D9; - --bs-btn-hover-border-color: #82B0D9; - --bs-btn-color: #fff; - --bs-btn-hover-color: #fff; + h2 { + font-size: 1.4375rem; + letter-spacing: -0.015em; + margin-top: 2.75rem; + padding-top: 1.375rem; + border-top: 1px solid var(--dd-border); + margin-bottom: 0.875rem; } - // Sidebar adjustments for dark mode - .doks-sidebar .section-nav a { - color: #B3B3B3; // Dojo Hue 02 + h2:first-of-type { + border-top: none; + padding-top: 0; } - .doks-sidebar .section-nav a:hover { - color: #82B0D9; - background-color: rgba(#1779C5, 0.1); + h3 { + font-size: 1.1875rem; + letter-spacing: -0.01em; + margin-top: 2rem; + margin-bottom: 0.625rem; } - .doks-sidebar .section-nav a[aria-current="page"] { - color: #82B0D9; - border-left-color: #82B0D9; - background-color: rgba(#1779C5, 0.08); + h4 { + font-size: 1.0313rem; + margin-top: 1.625rem; } - // Inline code in dark mode - :not(pre) > code { - background-color: rgba(#1779C5, 0.15); - color: #C6DDF2; + // Anchor offset beneath the sticky header + :is(h1, h2, h3, h4, h5, h6)[id] { + scroll-margin-top: 7.5rem; } - // Cards in dark mode - .card { - border-color: #333333; + // Framed screenshots + img:not(.markdown-svg) { + max-width: 100%; + height: auto; + border: 1px solid var(--dd-border); + border-radius: 0.625rem; + box-shadow: var(--dd-shadow-card); + margin: 0.375rem 0 1rem; } - .card:hover { - border-color: #82B0D9; - box-shadow: 0 2px 8px rgba(#1779C5, 0.15); + .markdown-svg { + max-width: 100%; + height: auto; } - .card a.stretched-link { - color: #82B0D9; - } + // Tables + table { + font-size: 0.9375rem; + margin-bottom: 1.5rem; + border-color: var(--dd-border); - // Version selector in dark mode - #version-select[data-version="opensource"] { - background-color: rgba(#003864, 0.85); - border-color: #82B0D9; - } + thead th { + background: var(--dd-surface-2); + border-bottom: 2px solid var(--dd-border-strong); + font-weight: 600; + white-space: nowrap; + } - #version-select[data-version="pro"] { - background-color: rgba(#F2561D, 0.85); - border-color: #F2762E; - } + th, + td { + border-color: var(--dd-border); + padding: 0.5625rem 0.875rem; + } - // Pro badge in dark mode - .pro-badge { - background-color: rgba(#F2561D, 0.85); - border-color: #F2762E; + tbody tr:hover { + background: var(--dd-surface-2); + } } - // Selection color in dark mode - ::selection { - background-color: rgba(#82B0D9, 0.3); - color: #DCDCDC; + // Blockquotes as quiet callouts + blockquote { + border-left: 3px solid var(--dd-blue); + padding: 0.75rem 1.125rem; + margin: 1.5rem 0; + color: var(--dd-muted); + background: var(--dd-surface-2); + border-radius: 0 0.5rem 0.5rem 0; + + p:last-child { + margin-bottom: 0; + } } +} + +// Inline code +:not(pre) > code { + background-color: rgba($dd-fuji-blue, 0.08); + color: var(--dd-link); + border: 1px solid rgba($dd-fuji-blue, 0.14); + border-radius: 0.3125rem; + padding: 0.1em 0.35em; + font-size: 0.875em; +} + +[data-bs-theme='dark'] :not(pre) > code { + background-color: rgba($dd-fuji-blue, 0.16); + color: #9fd0f5; + border-color: rgba($dd-fuji-blue, 0.3); +} + +// ============================================================ +// Code blocks — navy cards in both modes +// +// doks-core wraps every fence in an "expressive-code" frame +// (figure.frame > figcaption.header + .highlight > pre.chroma) whose +// look is driven entirely by --ec-* variables. We retheme the frame to +// the navy system by overriding those variables; the selector list +// mirrors the theme's own light-mode flips so the navy palette wins in +// BOTH color modes by cascade position. +// ============================================================ + +:root, +:root:not([data-bs-theme='dark']), +:root[data-bs-theme='light'] .expressive-code, +[data-bs-theme='dark'] { + --ec-brdRad: 0.625rem; + --ec-brdWd: 1px; + --ec-brdCol: var(--dd-code-border); + --ec-codeBg: var(--dd-code-bg); + --ec-codeFg: var(--dd-code-ink); + --ec-codeSelBg: #1d3b53; + --ec-uiFontFml: var(--bs-body-font-family); + --ec-focusBrd: var(--dd-blue-bright); + --ec-sbThumbCol: rgba(151, 180, 216, 0.22); + --ec-sbThumbHoverCol: rgba(151, 180, 216, 0.4); + --ec-frm-shdCol: transparent; + --ec-frm-frameBoxShdCssVal: none; + // Terminal frames (bash/sh fences): navy title bar + slate dots + --ec-frm-trmBg: var(--dd-code-bg); + --ec-frm-trmTtbBg: var(--dd-code-head); + --ec-frm-trmTtbFg: #7288a3; + --ec-frm-trmTtbDotsFg: #4a6076; + --ec-frm-trmTtbDotsOpa: 1; + --ec-frm-trmTtbBrdBtmCol: var(--dd-code-border); + // Editor frames (titled fences): navy tab bar + --ec-frm-edBg: var(--dd-code-bg); + --ec-frm-edTabBarBg: var(--dd-code-head); + --ec-frm-edTabBarBrdCol: var(--dd-code-border); + --ec-frm-edTabBarBrdBtmCol: var(--dd-code-border); + --ec-frm-edActTabBg: var(--dd-code-bg); + --ec-frm-edActTabFg: #9fd0f5; + --ec-frm-edActTabBrdCol: var(--dd-code-border); + --ec-frm-edActTabIndTopCol: var(--dd-blue); + // Copy button + --ec-frm-inlBtnFg: #d7e3f4; + --ec-frm-inlBtnBg: #7288a3; + --ec-frm-inlBtnBgIdleOpa: 0; + --ec-frm-inlBtnBgHoverOrFocusOpa: 0.18; + --ec-frm-tooltipSuccessBg: #178745; +} + +.expressive-code { + margin: 1.25rem 0 1.5rem; + + // The inner Hugo .highlight is plain content inside the frame + .highlight { + margin: 0; + border: 0; + background: transparent; + } + + .highlight pre { + margin: 0; + padding: 0.9375rem 1.125rem; + font-size: 0.875rem; + line-height: 1.65; - // Homepage features section — vibrant headings - .section-features h2 { - color: #C6DDF2; // Fuji Hue 01 — brighter for dark bg + code { + background: transparent; + color: inherit; + padding: 0; + font-size: inherit; + } } - .section-features a { - color: #F2561D; // Full Torii Orange — vivid on dark + // Header band typography (terminal dots bar + stamped language label) + .frame.is-terminal .header, + .frame.dd-has-lang .header { + display: flex; + align-items: center; + justify-content: flex-start; + min-height: 2.125rem; + font-size: 0.6875rem; + font-weight: 600; + letter-spacing: 0.12em; + text-transform: uppercase; + color: #7288a3; } - .section-features a:hover { - color: #F2D49B; // Torii Hue 01 + .frame.is-terminal .header { + padding-inline: 3.75rem 3rem; // clear the traffic dots on the left } - // Homepage description text - .section .lead, - .section .text-center { - color: #DCDCDC; + .frame.dd-has-lang:not(.is-terminal) .header { + padding-inline: 1.125rem 3rem; + background: var(--dd-code-head); + border: 1px solid var(--dd-code-border); + border-bottom-color: var(--dd-code-border); } - // Breadcrumb - .breadcrumb-item a { - color: #82B0D9; + .frame.dd-has-lang:not(.is-terminal) pre, + .frame.dd-has-lang:not(.is-terminal) code { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; } - .breadcrumb-item.active { - color: #B3B3B3; + // Language label stamped by custom.js onto the empty title span + .frame .title[data-lang]:empty::before { + content: attr(data-lang); } -} -// ============================================================ -// WORLD-CLASS ENHANCEMENTS -// ============================================================ + // Copy button (doks clipboard.js injects .copy > .btn-copy > div; the + // theme's own icon mask applies — size and recolor it for the navy card) + .copy button.btn-copy { + width: 1.875rem; + height: 1.875rem; + background: transparent; + opacity: 0.85; -// --- Version Selector Proper Styling --- + > div { + position: absolute; + inset: 0; + background-color: #7288a3; + opacity: 1; + border-radius: inherit; + transition: background-color 0.15s ease; + } -.version-label { - padding-top: 2rem; - font-size: 0.8125rem; - font-weight: 500; - text-transform: uppercase; - letter-spacing: 0.05em; - color: #666666; -} + &:hover { + opacity: 1; + background: rgba(151, 180, 216, 0.14); -.version-menu-wrapper { - border-top: 1px solid #B3B3B3; - padding-top: 0.5rem; + > div { + background-color: #d7e3f4; + } + } + } } -[data-bs-theme="dark"] .version-label { - color: #B3B3B3; +// Bare
 without a fence wrapper (rare) gets the same card look
+.docs-content > pre,
+.docs-content td > pre {
+  background: var(--dd-code-bg);
+  border: 1px solid var(--dd-code-border);
+  border-radius: 0.625rem;
+  color: var(--dd-code-ink);
+  padding: 0.9375rem 1.125rem;
+  font-size: 0.875rem;
 }
 
-[data-bs-theme="dark"] .version-menu-wrapper {
-  border-top-color: #333333;
+// --- Chroma syntax palette, tuned for the navy card ---
+
+.chroma {
+  color: var(--dd-code-ink);
+
+  // Comments
+  .c, .c1, .ch, .cm, .cs, .cp, .cpf { color: #7288a3; font-style: italic; }
+  // Keywords & operators-as-words
+  .k, .kc, .kd, .kn, .kp, .kr, .kt, .ow { color: #82b8f0; }
+  // Strings
+  .s, .s1, .s2, .sa, .sb, .sc, .dl, .sd, .se, .sh, .si, .sx, .sr, .ss { color: #86d7a8; }
+  // Numbers
+  .m, .mb, .mf, .mh, .mi, .mo, .il { color: #f2b26b; }
+  // Names
+  .na { color: #9fd0f5; }
+  .nb, .bp { color: #9fd0f5; }
+  .nc, .nn { color: #e8c07a; }
+  .nd { color: #c3b1f7; }
+  .ne { color: #f2938c; }
+  .nf, .fm { color: #c3b1f7; }
+  .nt { color: #82b8f0; }
+  .nv, .vc, .vg, .vi, .vm { color: #d7e3f4; }
+  .nl { color: #9fd0f5; }
+  // Operators & punctuation
+  .o { color: #94a9c9; }
+  .p { color: #94a9c9; }
+  // Diff
+  .gd { color: #f2938c; background-color: rgba(242, 147, 140, 0.12); }
+  .gi { color: #86d7a8; background-color: rgba(134, 215, 168, 0.12); }
+  // Generic
+  .gh, .gu { color: #9fd0f5; font-weight: 600; }
+  .ge { font-style: italic; }
+  .gs { font-weight: 600; }
+  .gp { color: #7288a3; }
+  .err { color: #f2938c; }
+  .w { color: inherit; }
+  // Highlighted lines
+  .hl { display: block; background-color: rgba(23, 121, 197, 0.16); }
+  // Line numbers
+  .ln, .lnt { color: #566b85; margin-right: 0.75rem; }
 }
 
-// --- Sidebar Details/Summary Chevron Indicators ---
+// ============================================================
+// TOC ("On this page"), breadcrumbs, prev/next
+// ============================================================
 
-.section-nav details > summary {
-  position: relative;
-  cursor: pointer;
-  padding-right: 1.5rem;
-  list-style: none;
-}
+.page-links {
+  h3 {
+    font-size: 0.75rem;
+    font-weight: 600;
+    letter-spacing: 0.09em;
+    text-transform: uppercase;
+    color: var(--dd-muted);
+  }
 
-.section-nav details > summary::-webkit-details-marker {
-  display: none;
-}
+  li:not(:first-child) {
+    border-top: 0;
+  }
 
-.section-nav details > summary::after {
-  content: '';
-  position: absolute;
-  right: 0.25rem;
-  top: 50%;
-  transform: translateY(-50%);
-  width: 0;
-  height: 0;
-  border-left: 5px solid #666666;
-  border-top: 4px solid transparent;
-  border-bottom: 4px solid transparent;
-  transition: transform 0.2s ease;
-}
+  li {
+    margin-top: 0;
+    padding-top: 0;
+  }
 
-.section-nav details[open] > summary::after {
-  transform: translateY(-50%) rotate(90deg);
-}
+  #toc ul,
+  nav > ul {
+    border-left: 1px solid var(--dd-border);
+  }
 
-[data-bs-theme="dark"] .section-nav details > summary::after {
-  border-left-color: #B3B3B3;
-}
+  a {
+    color: var(--dd-muted);
+    font-size: 0.875rem;
+    padding: 0.25rem 0 0.25rem 0.875rem;
+    margin-left: -1px;
+    border-left: 2px solid transparent;
+    transition: color 0.13s ease, border-color 0.13s ease;
 
-// --- Site Footer ---
+    &:hover {
+      color: var(--dd-ink);
+    }
 
-.site-footer {
-  border-top: 1px solid #DCDCDC;
-  background-color: #fafafa;
-  margin-top: 3rem;
-  padding-top: 2rem;
-  padding-bottom: 0;
+    &.active {
+      color: var(--dd-link);
+      font-weight: 500;
+      border-left-color: var(--dd-blue);
+      position: static;
+    }
+  }
+
+  a.active::before {
+    content: none;
+  }
+
+  li ul li {
+    padding-left: 0.5rem;
+  }
 }
 
-.footer-heading {
-  font-size: 0.75rem;
-  font-weight: 600;
-  text-transform: uppercase;
-  letter-spacing: 0.08em;
-  color: #666666;
+// Single-line breadcrumb: long crumbs ellipsize instead of wrapping, which
+// otherwise strands a leading "/" separator at the start of the next line.
+.breadcrumb {
+  font-size: 0.8125rem;
+  padding: 0;
+  margin-top: 1.5rem;
   margin-bottom: 0.75rem;
+  flex-wrap: nowrap;
+  min-width: 0;
 }
 
-.footer-links {
-  li {
-    margin-bottom: 0.375rem;
-  }
+.breadcrumb-item {
+  display: flex;
+  align-items: center;
+  min-width: 3rem; // every crumb keeps a readable stub + ellipsis
+  white-space: nowrap;
+
   a {
-    color: #333333;
-    font-size: 0.875rem;
-    text-decoration: none;
-    transition: color 0.15s ease;
-    &:hover {
-      color: #1779C5;
-      text-decoration: none;
-    }
+    overflow: hidden;
+    text-overflow: ellipsis;
   }
-}
 
-.footer-social {
-  display: flex;
-  gap: 0.75rem;
+  &:first-child {
+    flex-shrink: 0; // "Home" is the shortest crumb; never truncate it
+    min-width: 0;
+  }
+
+  &.active {
+    // Block, not flex: text-overflow only renders on block containers, and
+    // the current page is bare text (no inner anchor to ellipsize).
+    display: block;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    flex-shrink: 0.5; // current page keeps roughly twice the room of ancestors
+  }
 }
 
-.footer-social-link {
-  color: #666666;
-  transition: color 0.15s ease;
+.breadcrumb-item a {
+  color: var(--dd-muted);
+  text-decoration: none;
+
   &:hover {
-    color: #1779C5;
-    text-decoration: none;
-  }
-  svg {
-    width: 20px;
-    height: 20px;
+    color: var(--dd-link);
   }
 }
 
-.footer-bottom {
-  border-top: 1px solid #DCDCDC;
-  padding: 1rem 0;
-  margin-top: 1.5rem;
+.breadcrumb-item.active {
+  color: var(--dd-ink);
+  font-weight: 500;
 }
 
-[data-bs-theme="dark"] {
-  .site-footer {
-    background-color: #111111;
-    border-top-color: #333333;
-  }
-  .footer-heading {
-    color: #B3B3B3;
-  }
-  .footer-links a {
-    color: #B3B3B3;
+.breadcrumb-item + .breadcrumb-item::before {
+  content: "/";
+  color: var(--dd-border-strong);
+}
+
+// Prev / next cards
+.page-nav {
+  margin-top: 2.5rem;
+
+  .card {
+    background: var(--dd-surface);
+    border: 1px solid var(--dd-border);
+    border-radius: 0.75rem;
+    transition: border-color 0.15s ease, box-shadow 0.15s ease, transform 0.15s ease;
+
     &:hover {
-      color: #82B0D9;
+      border-color: var(--dd-border-strong);
+      box-shadow: var(--dd-shadow-card-hover);
+      transform: translateY(-2px);
     }
-  }
-  .footer-social-link {
-    color: #B3B3B3;
-    &:hover {
-      color: #82B0D9;
+
+    .text-body-secondary {
+      font-size: 0.75rem;
+      font-weight: 600;
+      letter-spacing: 0.08em;
+      text-transform: uppercase;
+      color: var(--dd-muted) !important;
+      margin-bottom: 0.125rem;
+    }
+
+    a.stretched-link {
+      color: var(--dd-link);
+      font-weight: 600;
+      font-size: 0.9688rem;
+    }
+
+    svg {
+      color: var(--dd-muted);
+      margin: 0 0.5rem;
     }
   }
-  .footer-bottom {
-    border-top-color: #333333;
-  }
 }
 
-// --- Homepage Hero ---
+// ============================================================
+// Cards (generic) — used by list pages and search results
+// ============================================================
+
+.card {
+  background: var(--dd-surface);
+  border-color: var(--dd-border);
+  transition: border-color 0.15s ease, box-shadow 0.15s ease;
+}
+
+.card:hover {
+  border-color: var(--dd-border-strong);
+  box-shadow: var(--dd-shadow-card-hover);
+}
+
+.card a.stretched-link {
+  color: var(--dd-link);
+  font-weight: 500;
+}
+
+// ============================================================
+// Buttons
+// ============================================================
+
+.btn-primary {
+  --bs-btn-bg: #{$dd-fuji-blue};
+  --bs-btn-border-color: #{$dd-fuji-blue};
+  --bs-btn-hover-bg: #{$dd-fuji-hue-03};
+  --bs-btn-hover-border-color: #{$dd-fuji-hue-03};
+  --bs-btn-active-bg: #{$dd-fuji-hue-04};
+  --bs-btn-active-border-color: #{$dd-fuji-hue-04};
+  font-weight: 500;
+}
+
+.btn-cta {
+  --bs-btn-bg: #{$dd-torii-orange};
+  --bs-btn-border-color: #{$dd-torii-orange};
+  --bs-btn-hover-bg: #{$dd-torii-hue-02};
+  --bs-btn-hover-border-color: #{$dd-torii-hue-02};
+  --bs-btn-active-bg: #{$dd-torii-hue-03};
+  --bs-btn-active-border-color: #{$dd-torii-hue-03};
+  --bs-btn-color: #fff;
+  --bs-btn-hover-color: #fff;
+  --bs-btn-active-color: #fff;
+  font-weight: 500;
+}
+
+// ============================================================
+// Homepage
+// ============================================================
+
+body.home .wrap.container-lg {
+  padding: 0;
+}
 
 .hero-section {
-  padding: 4rem 0 3rem;
+  position: relative;
+  overflow: hidden;
+  background:
+    radial-gradient(1000px 420px at 80% -20%, rgba(23, 121, 197, 0.26), transparent 62%),
+    radial-gradient(640px 380px at 10% 115%, rgba(23, 121, 197, 0.12), transparent 60%),
+    linear-gradient(180deg, var(--dd-navy) 0%, var(--dd-navy-2) 100%);
+  color: var(--dd-hero-ink);
+  padding: 4.25rem 1.5rem 4.5rem;
   text-align: center;
+
+  // Fine blueprint grid
+  &::before {
+    content: '';
+    position: absolute;
+    inset: 0;
+    background-image:
+      linear-gradient(var(--dd-hero-line) 1px, transparent 1px),
+      linear-gradient(90deg, var(--dd-hero-line) 1px, transparent 1px);
+    background-size: 84px 84px;
+    mask-image: radial-gradient(1100px 640px at 50% 0%, rgba(0, 0, 0, 0.9), transparent 76%);
+    -webkit-mask-image: radial-gradient(1100px 640px at 50% 0%, rgba(0, 0, 0, 0.9), transparent 76%);
+    pointer-events: none;
+  }
+
+  > .container {
+    position: relative;
+    z-index: 1;
+  }
 }
 
 .hero-title {
-  font-size: calc(2rem + 1.5vw);
-  font-weight: 600;
+  font-size: clamp(2.125rem, 4.6vw, 3.125rem);
+  font-weight: 700;
+  letter-spacing: -0.022em;
+  line-height: 1.08;
+  color: #ffffff;
   margin-bottom: 1rem;
 }
 
 .hero-subtitle {
-  font-size: 1.125rem;
-  color: #666666;
-  line-height: 1.6;
+  font-size: 1.0625rem;
+  color: var(--dd-hero-muted);
+  line-height: 1.65;
   margin-bottom: 1.5rem;
 }
 
+.hero-section .lead,
+.hero-section .text-muted {
+  color: var(--dd-hero-muted) !important;
+}
+
+.hero-section a.text-muted:hover {
+  color: #ffffff !important;
+}
+
 .hero-actions {
   margin-bottom: 1rem;
-}
 
-.hero-actions .btn {
-  min-width: 160px;
+  .btn {
+    min-width: 160px;
+  }
+
+  .btn-outline-secondary {
+    --bs-btn-color: var(--dd-hero-ink);
+    --bs-btn-border-color: rgba(151, 180, 216, 0.5);
+    --bs-btn-hover-bg: rgba(151, 180, 216, 0.14);
+    --bs-btn-hover-border-color: rgba(151, 180, 216, 0.8);
+    --bs-btn-hover-color: #ffffff;
+    --bs-btn-active-bg: rgba(151, 180, 216, 0.2);
+    --bs-btn-active-border-color: rgba(151, 180, 216, 0.8);
+    --bs-btn-active-color: #ffffff;
+  }
 }
 
-[data-bs-theme="dark"] .hero-subtitle {
-  color: #B3B3B3;
+// Big search field in the hero (opens DocSearch)
+.dd-hero-search {
+  display: flex;
+  align-items: center;
+  gap: 0.875rem;
+  width: 100%;
+  max-width: 520px;
+  margin: 0 auto 1.75rem;
+  padding: 0.875rem 1.125rem;
+  border: 1px solid rgba(151, 180, 216, 0.34);
+  border-radius: 0.75rem;
+  background: rgba(10, 22, 40, 0.55);
+  color: var(--dd-hero-muted);
+  font-size: 0.9688rem;
+  text-align: left;
+  transition: border-color 0.16s ease, background 0.16s ease, transform 0.16s ease;
+
+  svg {
+    width: 1.125rem;
+    height: 1.125rem;
+    flex: none;
+    color: var(--dd-blue-bright);
+  }
+
+  .dd-hero-search-label {
+    flex: 1;
+  }
+
+  .dd-kbd {
+    flex: none;
+    font-size: 0.6875rem;
+    font-weight: 600;
+    letter-spacing: 0.04em;
+    color: var(--dd-hero-muted);
+    border: 1px solid rgba(151, 180, 216, 0.34);
+    border-radius: 0.3125rem;
+    padding: 0.15rem 0.45rem;
+    background: rgba(151, 180, 216, 0.08);
+  }
+
+  &:hover,
+  &:focus-visible {
+    border-color: var(--dd-blue-bright);
+    background: rgba(14, 36, 64, 0.75);
+    color: #ffffff;
+    transform: translateY(-1px);
+  }
 }
 
-// --- Home Navigation Cards ---
+// Quick-nav cards — overlap the hero edge
+.home-cards-band {
+  position: relative;
+  z-index: 2;
+  margin-top: -3.25rem;
+  padding: 0 1.5rem;
+}
 
 .home-card {
   display: block;
-  padding: 1.5rem;
-  border: 1px solid #DCDCDC;
-  border-radius: 0.5rem;
+  padding: 1.375rem 1.25rem;
+  background: var(--dd-surface);
+  border: 1px solid var(--dd-border);
+  border-radius: 0.875rem;
+  box-shadow: var(--dd-shadow-card);
   text-decoration: none;
   color: inherit;
   transition: border-color 0.15s ease, box-shadow 0.15s ease, transform 0.15s ease;
   height: 100%;
 
   &:hover {
-    border-color: #82B0D9;
-    box-shadow: 0 4px 12px rgba(23, 121, 197, 0.1);
-    transform: translateY(-2px);
+    border-color: var(--dd-border-strong);
+    box-shadow: var(--dd-shadow-card-hover);
+    transform: translateY(-3px);
     text-decoration: none;
     color: inherit;
   }
@@ -681,264 +1291,235 @@ h1, h2, h3, h4, h5, h6,
   h3 {
     font-size: 1rem;
     font-weight: 600;
-    margin: 0.75rem 0 0.375rem;
-    color: #191919;
+    letter-spacing: -0.005em;
+    margin: 0.875rem 0 0.375rem;
+    color: var(--dd-ink);
   }
 
   p {
     font-size: 0.875rem;
-    color: #666666;
+    color: var(--dd-muted);
     margin-bottom: 0;
-    line-height: 1.5;
+    line-height: 1.55;
   }
 }
 
 .home-card-icon {
-  color: #1779C5;
+  display: inline-flex;
+  align-items: center;
+  justify-content: center;
+  width: 2.75rem;
+  height: 2.75rem;
+  border-radius: 0.75rem;
+  background: var(--dd-icon-tile);
+  color: var(--dd-icon-ink);
+
   svg {
-    width: 32px;
-    height: 32px;
+    width: 1.375rem;
+    height: 1.375rem;
   }
 }
 
-[data-bs-theme="dark"] {
-  .home-card {
-    border-color: #333333;
+// Community strip
+.section-features {
+  padding-top: 2rem;
+
+  h2 {
+    font-size: 1.0625rem;
+    font-weight: 600;
+    color: var(--dd-ink);
+  }
+
+  p {
+    color: var(--dd-muted);
+    font-size: 0.9375rem;
+  }
+
+  a {
+    color: var(--dd-link);
+    font-weight: 500;
+
     &:hover {
-      border-color: #82B0D9;
-      box-shadow: 0 4px 12px rgba(23, 121, 197, 0.15);
+      color: var(--dd-link-hover);
     }
-    h3 { color: #f0f0f0; }
-    p { color: #B3B3B3; }
-  }
-  .home-card-icon {
-    color: #82B0D9;
   }
 }
 
-// --- 404 Page ---
+// ============================================================
+// 404
+// ============================================================
 
 .error-code {
-  font-size: 8rem;
-  font-weight: 600;
-  color: #DCDCDC;
+  font-size: 7rem;
+  font-weight: 700;
+  letter-spacing: -0.03em;
+  color: var(--dd-border-strong);
   line-height: 1;
   margin-bottom: 0.5rem;
 }
 
-[data-bs-theme="dark"] .error-code {
-  color: #333333;
-}
+// ============================================================
+// Footer — navy brand band (matches the header bookend)
+// ============================================================
 
-// --- Back-to-Top Button Branding ---
+.site-footer {
+  background: var(--dd-navy);
+  border-top: 1px solid rgba(151, 180, 216, 0.14);
+  color: var(--dd-hero-muted);
+  margin-top: 3.5rem;
+  padding-top: 2.25rem;
+  padding-bottom: 0;
 
-#toTop {
-  background-color: #1779C5;
-  border-color: #1779C5;
-  &:hover {
-    background-color: #204D87;
-    border-color: #204D87;
+  // Always the light-on-dark logo inside the navy band
+  .logo-lightmode {
+    display: none;
   }
-}
 
-// --- Breadcrumb Refinements ---
+  .logo-darkmode {
+    display: inline-block;
+  }
 
-.breadcrumb {
-  font-size: 0.8125rem;
-  padding: 0;
-  margin-top: 1.5rem;
-  margin-bottom: 0.5rem;
-}
+  .text-muted,
+  small.text-muted {
+    color: rgba(183, 197, 217, 0.75) !important;
+  }
 
-.breadcrumb-item + .breadcrumb-item::before {
-  content: "/";
-  color: #B3B3B3;
+  a.text-muted:hover,
+  .footer-bottom a:hover {
+    color: #ffffff !important;
+  }
 }
 
-// --- Scroll Progress Indicator ---
-
-.scroll-progress {
-  position: fixed;
-  top: 0;
-  left: 0;
-  height: 3px;
-  background: linear-gradient(90deg, #1779C5, #F2561D);
-  z-index: 9999;
-  transition: width 0.1s linear;
+body.home .site-footer {
+  margin-top: 3rem;
 }
 
-// --- Typography Refinements ---
-
-.docs-content {
-  line-height: 1.7;
-
-  h2 {
-    margin-top: 2.5rem;
-    padding-top: 1rem;
-    border-top: 1px solid #DCDCDC;
-  }
-
-  h2:first-of-type {
-    border-top: none;
-    padding-top: 0;
-  }
+.footer-heading {
+  font-size: 0.75rem;
+  font-weight: 600;
+  text-transform: uppercase;
+  letter-spacing: 0.09em;
+  color: var(--dd-hero-muted);
+  margin-bottom: 0.75rem;
+}
 
-  h3 {
-    margin-top: 2rem;
+.footer-links {
+  li {
+    margin-bottom: 0.375rem;
   }
 
-  // Better table styling
-  table {
+  a {
+    color: rgba(183, 197, 217, 0.9);
     font-size: 0.875rem;
-    margin-bottom: 1.5rem;
-  }
+    text-decoration: none;
+    transition: color 0.15s ease;
 
-  // Blockquote styling
-  blockquote {
-    border-left: 3px solid #1779C5;
-    padding: 0.5rem 1rem;
-    margin: 1.5rem 0;
-    color: #666666;
-    background: rgba(#C6DDF2, 0.1);
-    border-radius: 0 0.25rem 0.25rem 0;
+    &:hover {
+      color: #ffffff;
+      text-decoration: none;
+    }
   }
 }
 
-[data-bs-theme="dark"] .docs-content {
-  h2 {
-    border-top-color: #333333;
-  }
-  blockquote {
-    border-left-color: #82B0D9;
-    color: #B3B3B3;
-    background: rgba(#1779C5, 0.08);
-  }
+.footer-social {
+  display: flex;
+  gap: 0.5rem;
 }
 
-// --- TOC Active State Enhancement ---
+.footer-social-link {
+  display: inline-flex;
+  padding: 0.375rem;
+  border-radius: 0.5rem;
+  color: var(--dd-hero-muted);
+  transition: color 0.15s ease, background 0.15s ease;
 
-.page-links a.active {
-  color: #1779C5;
-  font-weight: 500;
-  position: relative;
-}
+  &:hover {
+    color: #ffffff;
+    background: rgba(151, 180, 216, 0.12);
+    text-decoration: none;
+  }
 
-.page-links a.active::before {
-  content: '';
-  position: absolute;
-  left: -0.75rem;
-  top: 0.25rem;
-  bottom: 0.25rem;
-  width: 2px;
-  background: #1779C5;
-  border-radius: 1px;
+  svg {
+    width: 20px;
+    height: 20px;
+  }
 }
 
-[data-bs-theme="dark"] .page-links a.active {
-  color: #82B0D9;
-}
+.footer-bottom {
+  border-top: 1px solid rgba(151, 180, 216, 0.14);
+  padding: 1rem 0;
+  margin-top: 1.5rem;
 
-[data-bs-theme="dark"] .page-links a.active::before {
-  background: #82B0D9;
+  a {
+    color: rgba(183, 197, 217, 0.9);
+  }
 }
 
-// --- Header Nav Refinements ---
+// ============================================================
+// DocSearch — modal matches the design system
+// ============================================================
 
-.navbar-nav.flex-grow-1 {
-  gap: 0;
-  flex-wrap: wrap;
+.DocSearch-Container {
+  z-index: 2000 !important;
 }
 
-.navbar-nav.flex-grow-1 .nav-link {
-  font-size: 0.9rem;
-  padding: 0.375rem 0.75rem;
-  border-radius: 0.25rem;
-  white-space: nowrap;
+.DocSearch-Hit-icon {
+  display: flex;
+  align-items: center;
+}
 
-  &:hover {
-    background-color: rgba(#C6DDF2, 0.2);
-  }
+.DocSearch-Hits mark {
+  padding: 0;
+}
 
-  &.active {
-    background-color: rgba(#C6DDF2, 0.3);
-  }
+.DocSearch-Logo {
+  display: none !important;
 }
 
-[data-bs-theme="dark"] .navbar-nav.flex-grow-1 .nav-link {
-  &:hover {
-    background-color: rgba(#1779C5, 0.15);
-  }
-  &.active {
-    background-color: rgba(#1779C5, 0.2);
+@media (max-width: 768px) {
+  .DocSearch-Modal {
+    position: fixed !important;
   }
 }
 
-// --- Search Button Refinement ---
-
-#searchToggleDesktop {
-  border: 1px solid #CDCDCD;
-  border-radius: 0.5rem;
-  padding: 0.4rem 0.875rem;
-  font-size: 0.875rem;
-  color: #555555;
-  background: #f5f5f5;
-  gap: 0.25rem;
-  min-width: 13rem;
-
-  &:hover {
-    border-color: #1779C5;
-    color: #1779C5;
-    background: #eef5fb;
-  }
+// ============================================================
+// Misc chrome
+// ============================================================
 
-  .search-kbd {
-    font-family: inherit;
-    font-size: 0.6875rem;
-    font-weight: 600;
-    border: 1px solid #CDCDCD;
-    border-radius: 0.25rem;
-    padding: 0.05rem 0.4rem;
-    line-height: 1.4;
-    color: #888888;
-    background: #ffffff;
-  }
+// Scroll progress indicator
+.scroll-progress {
+  position: fixed;
+  top: 0;
+  left: 0;
+  height: 2px;
+  background: linear-gradient(90deg, var(--dd-blue), var(--dd-orange));
+  z-index: 9999;
+  transition: width 0.1s linear;
 }
 
-[data-bs-theme="dark"] #searchToggleDesktop {
-  border-color: #444444;
-  color: #B3B3B3;
-  background: #2a2a2a;
+// Back-to-top button
+#toTop {
+  background-color: var(--dd-surface);
+  border: 1px solid var(--dd-border);
+  color: var(--dd-ink);
+  box-shadow: var(--dd-shadow-card);
 
   &:hover {
-    border-color: #82B0D9;
-    color: #82B0D9;
-    background: rgba(#1779C5, 0.15);
-  }
-
-  .search-kbd {
-    border-color: #555555;
-    color: #888888;
-    background: #333333;
+    border-color: var(--dd-blue);
+    color: var(--dd-blue);
+    background-color: var(--dd-surface);
   }
 }
 
-// --- Header Social Links ---
-
-.header-social-links {
-  gap: 0.125rem;
-
-  .social-link {
-    padding: 0.25rem;
-    opacity: 0.6;
-    transition: opacity 0.15s ease;
-
-    &:hover {
-      opacity: 1;
-    }
-  }
+// Page footer meta (last modified / edit page)
+.page-footer-meta {
+  color: var(--dd-muted);
+  font-size: 0.8438rem;
 }
 
-// --- Print Styles ---
+// ============================================================
+// Print
+// ============================================================
 
 @media print {
   .navbar,
@@ -1012,21 +1593,21 @@ h1, h2, h3, h4, h5, h6,
   }
 }
 
-// --- Accessibility ---
+// ============================================================
+// Accessibility
+// ============================================================
 
-// Focus visible states
 *:focus-visible {
-  outline: 2px solid #1779C5;
+  outline: 2px solid var(--dd-blue-bright);
   outline-offset: 2px;
 }
 
 .btn:focus-visible {
-  outline: 2px solid #1779C5;
+  outline: 2px solid var(--dd-blue-bright);
   outline-offset: 2px;
   box-shadow: none;
 }
 
-// Reduced motion preferences
 @media (prefers-reduced-motion: reduce) {
   *,
   *::before,
@@ -1037,7 +1618,9 @@ h1, h2, h3, h4, h5, h6,
     scroll-behavior: auto !important;
   }
 
-  .home-card:hover {
+  .home-card:hover,
+  .page-nav .card:hover,
+  .dd-hero-search:hover {
     transform: none;
   }
 
@@ -1053,9 +1636,9 @@ h1, h2, h3, h4, h5, h6,
   left: 1rem;
   z-index: 10000;
   padding: 0.5rem 1rem;
-  background: #1779C5;
+  background: var(--dd-blue);
   color: #fff;
-  border-radius: 0 0 0.25rem 0.25rem;
+  border-radius: 0 0 0.375rem 0.375rem;
   text-decoration: none;
   font-weight: 500;
 
diff --git a/docs/assets/scss/common/_variables-custom.scss b/docs/assets/scss/common/_variables-custom.scss
index 4fcc81fffe7..a719a7073d2 100644
--- a/docs/assets/scss/common/_variables-custom.scss
+++ b/docs/assets/scss/common/_variables-custom.scss
@@ -17,10 +17,24 @@ $dd-dojo-hue-02:  #B3B3B3;
 $dd-dojo-hue-03:  #666666;
 $dd-dojo-hue-04:  #333333;
 
+// Navy surfaces shared with trust.defectdojo.com (brand bookends)
+$dd-navy:    #0a1628;
+$dd-navy-2:  #0e2440;
+
+// Cool neutrals for the reading canvas
+$dd-ink:     #17222f;
+$dd-muted:   #5a6b80;
+$dd-border:  #e3e9f1;
+
 // Bootstrap variable overrides
 $primary:   $dd-fuji-blue;
 $secondary: $dd-fuji-hue-04;
 
+$border-radius:     0.5rem;
+$border-radius-sm:  0.375rem;
+$border-radius-lg:  0.75rem;
+$border-radius-xl:  1rem;
+
 // Typography
 $font-family-sans-serif:
     "Worksans",
@@ -44,12 +58,12 @@ $font-weight-medium:   500;
 $font-weight-semibold: 600;
 
 // Body
-$body-color: $dd-dojo-black;
+$body-color: $dd-ink;
 
 // Links
-$link-color:       $dd-fuji-blue;
-$link-hover-color: $dd-fuji-hue-03;
+$link-color:       #0f5e9e;
+$link-hover-color: $dd-fuji-blue;
 
 // Headings
 $headings-font-weight: 600;
-$headings-color:       $dd-dojo-black;
+$headings-color:       null; // resolved per-theme via CSS custom properties
diff --git a/docs/config/_default/hugo.toml b/docs/config/_default/hugo.toml
index e49c3668ca9..a9115bdd396 100644
--- a/docs/config/_default/hugo.toml
+++ b/docs/config/_default/hugo.toml
@@ -16,7 +16,7 @@ defaultContentLanguage = "en"
 disableLanguages = ["de", "nl"]
 defaultContentLanguageInSubdir = false
 
-copyRight = "Copyright (c) 2020-2025 DefectDojo Inc."
+copyRight = "Copyright (c) 2020-2025 DefectDojo, Inc."
 
 [build.buildStats]
   enable = true
diff --git a/docs/content/asset_modelling/PRO_hierarchy/priority_sla.md b/docs/content/asset_modelling/PRO_hierarchy/priority_sla.md
index f6936bd5960..20196fe9ee0 100644
--- a/docs/content/asset_modelling/PRO_hierarchy/priority_sla.md
+++ b/docs/content/asset_modelling/PRO_hierarchy/priority_sla.md
@@ -35,7 +35,7 @@ vulnerabilities in your organization, and also provides a framework to assist in
 compliance with regulatory standards.
 
 
-Learn more about Priority and Risk with DefectDojo Inc's May 2025 Office Hours:
+Learn more about Priority and Risk with DefectDojo, Inc.'s May 2025 Office Hours:
 
 
 
diff --git a/docs/content/asset_modelling/engagements_tests/OS__engagements.md b/docs/content/asset_modelling/engagements_tests/OS__engagements.md
index 824644d611d..2d6c6da81fb 100644
--- a/docs/content/asset_modelling/engagements_tests/OS__engagements.md
+++ b/docs/content/asset_modelling/engagements_tests/OS__engagements.md
@@ -4,7 +4,7 @@ description: "Understanding Engagements in DefectDojo OS"
 audience: opensource
 weight: 3
 ---
-Product Types → Products → **ENGAGEMENTS** → Tests → Findings 
+Organizations → Assets → **ENGAGEMENTS** → Tests → Findings 
 
 ## Overview 
 
diff --git a/docs/content/asset_modelling/engagements_tests/OS__findings.md b/docs/content/asset_modelling/engagements_tests/OS__findings.md
new file mode 100644
index 00000000000..bad4e73365e
--- /dev/null
+++ b/docs/content/asset_modelling/engagements_tests/OS__findings.md
@@ -0,0 +1,299 @@
+---
+title: "Findings"
+description: "Understanding Findings in DefectDojo OS"
+audience: opensource
+weight: 5
+---
+Organizations	→ Assets → Engagements → Tests → **FINDINGS**
+
+## Overview
+
+**Findings** represent the lowest level of the Product Hierarchy where individual vulnerabilities are tracked and managed, and are the main way that DefectDojo standardizes and guides the reporting and remediation process of your security tools. Regardless of whether a vulnerability was reported in SonarQube, Acunetix, or your team’s custom tool, Findings give you the ability to manage each vulnerability in the same way.
+
+Examples of Findings include: 
+- Cookie Not Marked as HttpOnly
+- Out-of-Date Version (PHP)
+- Out-of-Band Code Evaluation (PHP)
+- Out-of-Date Version (MySQL)
+- Backup Source Code Detected
+- Blind Cross-Site Scripting
+
+In addition to storing the vulnerability data and providing a remediation framework, DefectDojo also enhances your Findings in the following ways:
+- Automatically adding related EPSS scores to a Finding to describe exploitability
+- Automatically translating a security tool’s severity metric into a Severity score for each Finding, which confers an SLA onto the Finding according to your Asset’s SLA configuration. For more information on SLA configuration, click [here](/asset_modelling/os_hierarchy/os__sla_configuration/#main-content).
+
+Overall, Findings are designed to work with the Product Hierarchy to standardize your efforts, and apply a consistent method to each Asset.
+
+## Accessing Findings
+
+Findings are accessible via the sidebar. The submenu provides access to Open and Closed Findings, All Findings (regardless of Open or Closed status), [Risk Accepted Findings](/triage_findings/findings_workflows/os__risk_acceptance/), as well as Findings Templates. Individual Findings are also accessible from within the Test that contains them. 
+
+![image](images/osfindings_ss1.png)
+
+### Permissions
+
+Every Finding belongs to a Test, allowing DefectDojo to preserve which scan or assessment originally identified the vulnerability.
+
+As Findings belong to Tests, access to Findings is determined by a User’s access to the Asset that contains the Test. Tests do not have independent access control lists.
+
+## Findings View
+Finding views contain a variety of tables to help interpret a Finding’s status at a glance. This includes:
+- **Overview**
+    - **ID**: The unique ID number for that Finding. 
+    - **Severity**: The severity rating of that Finding, which is applied automatically. 
+        - As mentioned above, DefectDojo automatically translates a security tool’s severity metric into a Severity score for each Finding, which confers an SLA onto the Finding according to your Asset’s SLA configuration.
+    - **SLA**: The intended due date by which the Finding is intended to be resolved. 
+    - **Status**: The status of the Finding (e.g., Active, Verified, False Positive, Duplicate, Out of SCope, and Under Defect Review).
+    - **Finding type**: Whether the Finding is Static (SAST) or Dynamic (DAST).
+    - **Date discovered**: The date on which the Finding was discovered. 
+    - **CWE**: The CWE classification of the Finding. 
+    - **Vulnerability ID**: IDs of vulnerabilities in security advisories associated with the Finding (e.g., CVE or other sources).  
+    - **Found by**: The tool that revealed the Finding. 
+- **Similar Findings**: Other Findings within the same Asset that are not exact duplicates but have similar values for vulnerability ID, CWE, file_path, line number, etc.
+- **Import history**: List of imports/reimports that created/closed/reactivated this Finding in any Test. 
+- **Vulnerable endpoints/systems**: Endpoints/Systems that the Finding reveals are vulnerable. 
+- **Description**: The description of the Finding (added automatically depending on the type of Finding, or created manually). 
+- **Mitigation**: Suggested steps to mitigate.
+- **Impact**: Potential impact of leaving the Finding unresolved. 
+- **Steps to reproduce**: Steps for reproducing the Finding. 
+- **Severity justification**: Written description of why a certain Severity rating was associated with the Finding. 
+- **References**: URL to cross-reference the third-party scan tool’s specific description of the Finding. For example, References could be links to a relevant entry in a Finding catalog, or a single advisory URL. 
+- **Notes**: Notes left by Users related to the Finding. Marking a note as Private will mean it will not be included in any generated reports that include the selected Finding. 
+
+## Findings Data
+
+Findings require the following metadata:
+**Title**
+**Date**
+**Severity**
+**Description**
+
+In addition to metadata corresponding to the tables in a Finding’s view, optional metadata fields include: 
+- **Group**: Finding Groups that include the selected Finding. 
+- **CVSS3/CVSS4 vector and score**: The CVSS3 and CVSS4 vector and score of the selected Finding. 
+- **Request and response pairs**: A copy of the message sent by the client and the server's reply to the request.
+- **Endpoints to add**: Vulnerable endpoints that may be affected by the selected Finding that are not reflected in the preceding list of systems/endpoints. 
+- **EPSS score and percentile**: ESS score and percentile for the CVE. 
+- **KEV date added**: The date the Finding was added to the KEV catalog. 
+- **Fix availability and version**: Defines if there is a fix available for the vulnerability, and the version of the affected component in which the fix was implemented. 
+- **User who requested a defect review**: Records who requested a defect review for the flaw in question. 
+- **Line number**: Source line number of the attack vector. 
+- **File path**: Identified files that contain the flaw. 
+- **Component name and version**: Name and version of the affected component. 
+- **Unique ID from tool**: Vulnerability technical ID from the source tool. 
+- **Vulnerability ID from tool**: Non-unique technical ID from the source tool. 
+- **SAST source object, line number, and file path**: Source object, line number, and file path of the attack vector. 
+- **SAST sink object**: Sink object of the attack vector. 
+- **Number of occurrences**: Number of occurrences in the source tool when several vulnerabilities were found and aggregated by the scanner. 
+- **Publish date**: Date on which the Finding was published. 
+- **Service**: Connected Services (self-contained pieces of functionality within an Asset) that are affected by the selected Finding. When populated, this field is included in deduplication matching (i.e., Findings with identical Service fields will deduplicate). 
+- **Planned remediation date and version**: The date on which the Finding is planned to be remediated, and the version of the affected component in which the fix will be implemented.
+- **Effort for fixing**: The level of effort involved in fixing the Finding (e.g., Low, Medium, or High). 
+- **Tags**: Any tags that have been added to the Finding. 
+
+The exact metadata available will depend on the parser/scanner that revealed the Finding. Some provide only basic information such as title and severity, while others include CVSS vectors, vulnerable components, endpoints, request/response pairs, and other scanner-specific metadata.
+ 
+This metadata improves filtering, reporting, and prioritization across your security program, enabling long-term tracking and trend analysis. Additional details and metadata descriptions can be found [here](/triage_findings/findings_workflows/intro_to_findings/#a-finding-page). 
+
+### Deduplication
+
+DefectDojo includes deduplication capabilities that help identify and manage Findings representing the same underlying vulnerability. As scan results are imported from one or more tools, DefectDojo uses configurable matching logic to identify Findings that represent the same vulnerability.
+
+Deduplication prevents the same vulnerability from appearing multiple times when discovered repeatedly by the same or different scanners, allowing remediation history to remain attached to a single Finding.
+
+More information about deduplication can be found [here](/triage_findings/finding_deduplication/about_deduplication/).
+
+### Reimport
+
+DefectDojo's Reimport function allows Findings to be updated as new scan results are imported. When a scan is reimported, DefectDojo compares the incoming results against existing Findings and updates matching records instead of creating entirely new ones. This preserves valuable context such as status changes, remediation history, comments, and ownership information, providing a continuous record of a Finding's lifecycle across multiple testing cycles.
+
+More information about the Reimport function can be found [here](/import_data/import_intro/reimport/#main-content).
+
+### Risk Acceptances 
+
+Risk Acceptances are a special status that can be applied to Findings to formally document and operationalize the decision to acknowledge them without immediately remediating them. 
+
+More information about Risk Acceptances can be found [here](/triage_findings/findings_workflows/os__risk_acceptance/).
+
+### Statuses 
+
+Each Finding created in DefectDojo has a Status that communicates relevant information and helps your team keep track of their progress in resolving issues.
+
+More information about Statuses can be found [here](/triage_findings/findings_workflows/finding_status_definitions/).
+
+## Working with Findings 
+
+### Creating Findings 
+
+While most Findings are generated automatically through scan imports and integrations, DefectDojo also supports the manual creation of Findings. Manual Findings are useful for tracking vulnerabilities and security concerns identified through penetration testing, architecture reviews, compliance assessments, bug bounty programs, consultant engagements, or other activities that do not produce scanner output. 
+
+To create a Finding manually:
+1. Navigate to the Test in which you wish to manually add the Finding, click the + Plus sign, and then click **New Finding**.
+
+![image](images/osfindings_ss2.png)
+
+2. This opens the New Finding form, which you can fill out with any relevant information about your Finding.
+
+3. Select either **Add Another Finding** to manually add another Finding, or **Finished** to finish the manual Finding creation process.
+
+The Finding will now appear within the list of Findings contained in the original Test. 
+
+Importantly, manually adding a Finding from the top bar will automatically create an ad hoc Engagement and Test to contain the new Finding, rather than adding it to the Test that is currently being viewed (see image below). This is because the top bar pertains to the Asset as a whole. If you wish to manually add a Finding to a specific, pre-existing Test, it is best to do so from within the Test itself, as outlined in steps 1-3 above. 
+
+![image](images/osfindings_ss3.png)
+
+### Editing Findings
+
+#### ⋮ Kebab Menu
+
+The ⋮ kebab menu next to Findings contains the following functions: 
+- **View**: Open and view the Finding. 
+- **Edit**: Edit the Finding. 
+- **Copy**: Create a copy of the Finding. The Copy can be saved to any of the Tests contained within the corresponding Engagement. 
+- **Request Peer Review**: Initiates the Peer Review process and changes the Finding’s status to “Under Review.” More information about Peer Reviews can be found [here](/triage_findings/findings_workflows/finding_status_definitions/#under-review).
+- **Touch Finding**: Will log interactivity with the Finding in the Finding’s history. 
+- **Make Finding a Template**: Will automatically create a Finding Template based on the selected Finding. 
+- **Apply Template to Finding**: Will allow a pre-existing Finding Template to be applied to a Finding. 
+- **Close Finding**: Will initiate the process of closing the Finding. 
+- **Add Risk Acceptance**: Will initiate the Risk Acceptance process. More information can be found [here](/triage_findings/findings_workflows/os__risk_acceptance/#main-content).
+- **View History**: Reveals the history of the selected Finding. 
+- **Delete**: Deletes the selected Finding. 
+
+#### Attaching Files to Findings 
+You can attach image files to any Finding to provide visual context — for example, a screenshot of a vulnerability in action or a proof-of-concept image.
+
+Supported file types include: 
+
+```
+.txt  .pdf  .json  .xml  .csv  .yml  .png  .jpeg
+.sarif  .xlsx  .doc  .html  .js  .nessus  .zip  .fpr
+```
+
+To attach a file to a Finding:
+1. Open the Finding you want to attach a file to.
+2. Open the actions menu (the ☰ button in the top-right of the Finding) and click Manage Files.
+
+![image](images/OS_manage_files_menu.png)
+
+3. On the Add files page, enter a Title for the file and choose the file from your computer. You can add up to three files at a time; save and return to add more if needed.
+
+![image](images/OS_manage_files_form.png)
+
+4. Click **Save**.
+
+The file is then listed in the **Files** panel of the Finding. Image files appear as thumbnails:
+
+![image](images/OS_finding_files_panel.png)
+
+#### Bulk Edit Findings 
+
+Findings can be edited in bulk from a Finding List, such as the table of All Findings accessible from the sidebar, or from the table of Findings within a specific Test.
+
+More information about how to bulk edit Findings can be found [here](/triage_findings/findings_workflows/editing_findings/#bulk-edit-findings). 
+
+### Closing Findings 
+
+Once the work on a Finding is complete, you can manually close it by clicking **Close Finding** within the Finding’s ⋮ kebab menu or ☰ action menu. Alternatively, if a scan is re-imported into DefectDojo which does not contain a previously-recorded Finding, the previously-recorded Finding will automatically close.
+
+If you don’t want any Findings to be closed, you can disable this behavior on Reimport:
+
+- Uncheck the Close Old Findings checkbox if using the UI
+- Set close_old_findings to False if using the API ​
+
+### Deleting Findings 
+
+Deleting a Finding can be done from the Finding’s ⋮ kebab menu or ☰ action menu. This action can’t be undone. 
+
+For auditing purposes, it is recommended to close any remediated Findings, rather than deleting them. 
+
+## Finding Groups 
+
+**Finding Groups** allow you to treat multiple related Findings as a single logical unit for triage, reporting, and remediation coordination.
+
+For example, a scan might produce 10 SQL injection Findings across different endpoints. Instead of managing each one independently, you can group them into a single Finding Group representing the broader SQL injection issue.
+
+A Finding Group does not replace the individual Findings. Each Finding still exists with its own severity, status, metadata, comments, and remediation history. A Finding Group simply provides an additional organizational layer above the Findings it contains.
+
+### Accessing Finding Groups 
+
+Finding Groups can be accessed via the sidebar. The submenu provides access to Open and Closed Finding Groups as well as All Finding Groups (regardless of Open status).
+
+![image](images/osfindings_ss1.png)
+
+### Creating Finding Groups 
+
+
+Finding Groups can be created either manually or automatically. 
+
+Notably, Finding Groups can only be created from the Findings contained within a single Test. Findings from different Tests, Engagements, or Products cannot be added to the same Finding Group.
+
+#### Manual Finding Groups 
+
+To manually perform Finding Group actions:
+1. Navigate to a list of Findings within a Test. 
+2. Select the Finding(s) you wish to add to a Finding Group by clicking the corresponding checkbox. 
+3. Click the **Group** checkbox. 
+4. Click the corresponding action you wish to complete
+    - **Create**: Creates a Finding Group that includes the selected Findings.
+    - **Add to**: Adds the selected Findings to a pre-existing Finding Group.
+    - **Remove from any group**: Removes the selected Findings from any Finding Groups they were previously a part of. 
+    - **Group by**: Groups the selected Findings based on the chosen option (e.g., Component name, File path, Finding title, etc.) 
+5. Click **Submit**.
+
+![image](images/osfindings_ss4.png)
+
+Note that the only possible action when selecting Findings from the All Findings list is to remove the selected Findings from any Finding Group. This is because, as mentioned, Finding Groups can only be created from the Findings contained within a single Test.
+
+#### Automatic Finding Groups 
+
+When importing a scan, the “Group By” feature can automatically create Finding Groups based on a chosen grouping method. This is useful when a scanner produces many related Findings that should be managed together.
+
+The adjoining **Create Finding Groups for all Findings** checkbox performs two functions: 
+- **Checked**: Creates a Finding Group for every imported Finding, even if that Finding is the only member of the group.
+- **Unchecked**: Creates Finding Groups only when there are actually multiple Findings to group together.
+
+![image](images/osfindings_ss5.png)
+
+If the grouping criteria (e.g., component name, vulnerability ID, etc.) isn’t populated in the Finding, it will not have a group created or be added to a pre-existing Finding Group. 
+
+If a scan is imported that reveals 10 Findings that are not grouped, and the same scan is reimported and the Findings are grouped, the first 10 Findings will not be added to that Finding Group (i.e., the Finding Group will only include the 10 Findings from the reimport, not the 10 Findings from the initial and subsequent import). 
+
+## Finding Templates 
+
+**Findings Templates** allow Users to create reusable templates for commonly reported vulnerabilities and security issues. A template can include standardized information such as a title, description, impact, steps to reproduce, mitigation, references, and other Finding metadata.
+
+Finding Templates are most useful in situations where Users need to create manual Findings repeatedly and want to avoid re-entering the same supporting information each time.
+
+### Accessing Finding Templates 
+
+Finding Templates are found within the Findings submenu in the sidebar. 
+
+![image](images/osfindings_ss6.png) 
+
+### Creating Finding Templates 
+
+Finding Templates can be created by clicking the + Plus button at the top right of the Finding Templates view. 
+
+The ensuing page provides an overview of the metadata that will be applied to a Finding when a Finding Template is used.
+
+You can also use a pre-existing Finding as the basis for a new Finding Template by clicking **Make Finding a Template** within the Finding’s ⋮ kebab menu. 
+
+### Applying Finding Templates 
+
+Finding Templates can be applied to Findings by clicking the **Apply Template to Finding** button within the ⋮ kebab menu of the selected Finding.
+
+![image](images/osfindings_ss7.png)
+
+The ensuing page will allow you to select the template to be applied to the Finding in question, and then whether to keep, replace, or combine the metadata from the Finding with the template. 
+
+### Reporting 
+
+DefectDojo’s report builder lets you assemble a custom report from a set of content widgets, run it, and export the result (for example, by printing it to PDF). Custom reports can summarize the Findings or Endpoints you want to share with an external audience, and can include branding and boilerplate text.
+
+More information about DefectDojo’s Report Builder can be found [here](/metrics_reports/reports/using-the-report-builder/).
+
+#### Export Findings 
+
+Pages that show a list of Findings or a list of engagements have a CSV and Excel export option in the top-right dropdown menu.
+
+From any Findings list page, open the dropdown menu in the top-right corner to export the visible Findings as a CSV or Excel file. The list of engagements can also be exported as CSV or Excel using the same dropdown menu on the engagements list page.
\ No newline at end of file
diff --git a/docs/content/get_started/about/about_defectdojo.md b/docs/content/get_started/about/about_defectdojo.md
index adecfb0dcdc..d62aff7529c 100644
--- a/docs/content/get_started/about/about_defectdojo.md
+++ b/docs/content/get_started/about/about_defectdojo.md
@@ -19,7 +19,7 @@ aliases:
 
 
 
-DefectDojo Inc. and open-source contributors maintain this documentation to support both the Community and Pro editions of DefectDojo.
+DefectDojo, Inc. and open-source contributors maintain this documentation to support both the Community and Pro editions of DefectDojo.
 
 ## What is DefectDojo?
 
@@ -79,7 +79,7 @@ If you run into trouble with an Open-Source install, we highly recommend asking
 
 
 
-DefectDojo Inc. hosts a Pro edition of this software for commercial purposes.  Along with a sleek, modern UI, DefectDojo Pro includes:
+DefectDojo, Inc. hosts a Pro edition of this software for commercial purposes.  Along with a sleek, modern UI, DefectDojo Pro includes:
 
 * [Connectors](/import_data/pro/connectors/about_connectors/): out-of-the-box API integrations with enterprise-level scanners (such as Checkmarx One, BurpSuite, Semgrep and more)
 * **Configurable Import Methods**: [Universal Parser](/supported_tools/parsers/universal_parser/), [Smart Upload](/import_data/pro/specialized_import/smart_upload/)
@@ -120,7 +120,7 @@ Whether you’re a Pro or an Open-Source user, we have many resources to help yo
 
 ## Connect With Us
 
-To get in touch with the DefectDojo Inc team, you can always reach out to [hello@defectdojo.com](mailto:hello@defectdojo.com).
+To get in touch with the DefectDojo, Inc. team, you can always reach out to [hello@defectdojo.com](mailto:hello@defectdojo.com).
 
 We regularly on [LinkedIn](https://www.linkedin.com/company/33245534) and also host online presentations for AppSec professionals that can be accessed live or on demand. You can learn about upcoming events on our [Events page](https://defectdojo.com/events) or watch past presentations on our [YouTube Channel](https://www.youtube.com/@defectdojo).
 
diff --git a/docs/content/get_started/about/ui_pro_vs_os.md b/docs/content/get_started/about/ui_pro_vs_os.md
index 893cc0c4ea1..73f2c31eefa 100644
--- a/docs/content/get_started/about/ui_pro_vs_os.md
+++ b/docs/content/get_started/about/ui_pro_vs_os.md
@@ -7,7 +7,7 @@ audience: pro
 aliases:
   - /en/about_defectdojo/ui_pro_vs_os
 ---
-In late 2023, DefectDojo Inc. released a new UI for DefectDojo Pro, which is now the default UI for this edition.
+In late 2023, DefectDojo, Inc. released a new UI for DefectDojo Pro, which is now the default UI for this edition.
 
 The Pro UI brings the following enhancements to DefectDojo:
 
diff --git a/docs/content/get_started/common_use_cases/common_use_cases.md b/docs/content/get_started/common_use_cases/common_use_cases.md
index 6177924dda5..76c9ab32e57 100644
--- a/docs/content/get_started/common_use_cases/common_use_cases.md
+++ b/docs/content/get_started/common_use_cases/common_use_cases.md
@@ -7,7 +7,7 @@ chapter: true
 aliases:
   - /en/about_defectdojo/examples_of_use
 ---
-This article is based on DefectDojo Inc's February 2025 Office Hours: "Tackling Common Use Cases".
+This article is based on DefectDojo, Inc.'s February 2025 Office Hours: "Tackling Common Use Cases".
 
 
 ## Examples of Use Cases
diff --git a/docs/content/help/contact_support.md b/docs/content/help/contact_support.md
index 89af196c0c4..b7a48a27a0a 100644
--- a/docs/content/help/contact_support.md
+++ b/docs/content/help/contact_support.md
@@ -21,7 +21,7 @@ See our [Community Site](https://defectdojo.com/open-source) for more informatio
 
 ## DefectDojo Pro Support
 
-DefectDojo Pro subscriptions come with full support from the DefectDojo Inc. team during the initial trial period and beyond.
+DefectDojo Pro subscriptions come with full support from the DefectDojo, Inc. team during the initial trial period and beyond.
 
 ### Email
 
diff --git a/docs/content/issue_tracking/pro_integration/integrations.md b/docs/content/issue_tracking/pro_integration/integrations.md
index 76ee8b3f090..9dd63f27474 100644
--- a/docs/content/issue_tracking/pro_integration/integrations.md
+++ b/docs/content/issue_tracking/pro_integration/integrations.md
@@ -16,8 +16,11 @@ Supported Integrations:
 - GitHub
 - GitLab Boards
 - Jira
+- PagerDuty
+- ServiceDesk Plus
 - ServiceNow
 - Shortcut
+- Zendesk
 
 ## Opening the Integrations page
 
@@ -78,8 +81,11 @@ For the complete list of requirements, please open the vendor specific pages bel
 - [GitHub](/issue_tracking/pro_integration/integrations_toolreference/#github)
 - [GitLab Boards](/issue_tracking/pro_integration/integrations_toolreference/#gitlab)
 - [Jira](/issue_tracking/pro_integration/integrations_toolreference/#jira)
+- [PagerDuty](/issue_tracking/pro_integration/integrations_toolreference/#pagerduty)
+- [ServiceDesk Plus](/issue_tracking/pro_integration/integrations_toolreference/#servicedesk-plus)
 - [ServiceNow](/issue_tracking/pro_integration/integrations_toolreference/#servicenow)
 - [Shortcut](/issue_tracking/pro_integration/integrations_toolreference/#shortcut)
+- [Zendesk](/issue_tracking/pro_integration/integrations_toolreference/#zendesk)
 
 ## Error Handling and Debugging
 
diff --git a/docs/content/issue_tracking/pro_integration/integrations_toolreference.md b/docs/content/issue_tracking/pro_integration/integrations_toolreference.md
index 0f03e1650d3..d501f6c2eca 100644
--- a/docs/content/issue_tracking/pro_integration/integrations_toolreference.md
+++ b/docs/content/issue_tracking/pro_integration/integrations_toolreference.md
@@ -286,6 +286,46 @@ By default Jira issues use DefectDojo's built-in title and body. To customize th
 - **Token lifecycle (OAuth):** DefectDojo owns the whole flow — it performs the authorization-code exchange, stores the access and refresh tokens, and refreshes on demand before a push, persisting the new refresh token each time (Atlassian rotates it on every refresh).
 - **Credential storage:** all connection credentials (passwords, tokens, client secrets, OAuth tokens) are encrypted at rest and are never returned through the API — editing a connection shows a "leave blank to keep" placeholder for stored secrets.
 
+## PagerDuty
+
+The PagerDuty Integration allows you to push DefectDojo Findings and Finding Groups as PagerDuty Incidents, opened on a PagerDuty Service of your choice.
+
+### Instance Setup
+
+- **Label** should be the label that you want to use to identify this integration.
+- **Location** should be set to `https://api.pagerduty.com`.  If your PagerDuty account is hosted in the EU service region, use `https://api.eu.pagerduty.com` instead.
+- **API Token** should be set to a PagerDuty REST API key.  An account administrator can create one in the PagerDuty web app under **Integrations > API Access Keys > Create New API Key**.  Leave "Read-only" unchecked - DefectDojo needs to create and update incidents.
+- **From Email** should be the email address of a valid user on your PagerDuty account.  PagerDuty requires this address when creating or updating incidents, and it will be shown as the incident requester.
+
+### Issue Tracker Mapping
+
+- **Service ID** should be the ID of the PagerDuty Service that incidents will be opened on.  You can find it at the end of the URL while looking at the Service in PagerDuty, for example `https://{your-subdomain}.pagerduty.com/service-directory/{service id}`.
+
+### Severity Mapping Details
+
+By default this maps to the PagerDuty incident **Urgency** field, which only accepts `high` or `low`:
+
+- **Severity Field Name**: `Urgency`
+- **Info Mapping**: `low`
+- **Low Mapping**: `low`
+- **Medium Mapping**: `low`
+- **High Mapping**: `high`
+- **Critical Mapping**: `high`
+
+Alternatively, if your PagerDuty account has [Priorities](https://support.pagerduty.com/main/docs/incident-priority) enabled, you can map severities to Priority names instead.  Set the **Severity Field Name** to `Priority` and use your account's Priority names (for example `P1` through `P5`) as the mapping values.  When mapping to Priority, the incident's Urgency is left to your Service's own urgency rules.
+
+### Status Mapping Details
+
+PagerDuty incidents have three statuses: `triggered`, `acknowledged`, and `resolved`.
+
+- **Status Field Name**: `Status`
+- **Active Mapping**: `triggered`
+- **Closed Mapping**: `resolved`
+- **False Positive Mapping**: `resolved`
+- **Risk Accepted Mapping**: `acknowledged`
+
+Note that `resolved` is a final status in PagerDuty - a resolved incident cannot be reopened.  Also note that PagerDuty does not allow an incident's title or description to be edited after creation, so pushing an updated Finding will sync its status, urgency, and priority, but not content changes.
+
 ## ServiceNow
 
 The ServiceNow Integration allows you to push DefectDojo Findings as ServiceNow Incidents.
@@ -430,3 +470,111 @@ A few Freshservice-specific behaviors to be aware of:
 - Updates sync the full ticket content - Freshservice allows the subject and description to be edited after creation.
 - Tickets are closed rather than deleted when a Finding is removed; tickets already Resolved or Closed are left untouched.  A resolution note is attached automatically on closure, so accounts that require one (a common business rule) accept the close.
 - Some accounts compute a ticket's priority from an Impact/Urgency matrix or a business rule and ignore the priority sent at creation.  DefectDojo detects this and re-applies the mapped priority with a follow-up update, so the mapping still takes effect.
+
+## ServiceDesk Plus
+
+The ManageEngine ServiceDesk Plus Integration allows you to push DefectDojo Findings and Finding Groups as ServiceDesk Plus requests, assigned to a support Group of your choice.  Both the **cloud** (ServiceDesk Plus OnDemand) and **on-premises** editions are supported by the same integration - the credentials you provide determine which mode is used.
+
+### Instance Setup
+
+- **Label** should be the label that you want to use to identify this integration.
+- **Location** should be set to your ServiceDesk Plus URL: `https://sdpondemand.manageengine.com` for the cloud edition (or your regional equivalent), or your server's address for on-premises installs.
+
+Then provide **one** of the two credential sets:
+
+#### On-premises: Technician Key
+
+- **Technician Key** should be an API key generated for a technician on your server, under **Admin > General Settings > API**.  Leave the Zoho OAuth fields empty.
+
+#### Cloud: Zoho OAuth
+
+The cloud edition authenticates through Zoho Accounts OAuth:
+
+1. Open the [Zoho API Console](https://api-console.zoho.com/) and create a **Self Client**.
+2. Note the **Client ID** and **Client Secret**.
+3. In the Self Client's "Generate Code" tab, enter the scope `SDPOnDemand.requests.ALL`, choose a duration, and generate the code.
+4. Exchange the code for a refresh token:
+
+```
+curl --request POST \
+ --url 'https://accounts.zoho.com/oauth/v2/token' \
+ --data 'grant_type=authorization_code' \
+ --data 'client_id={{CLIENT_ID}}' \
+ --data 'client_secret={{CLIENT_SECRET}}' \
+ --data 'code={{GENERATED_CODE}}'
+```
+
+5. Enter the **Client ID**, **Client Secret**, and the returned **Refresh Token** in the instance form.  If your account is hosted outside the US data center, set **Token URL** to your regional Zoho Accounts endpoint (for example `https://accounts.zoho.eu/oauth/v2/token`).
+
+### Issue Tracker Mapping
+
+- **Group Name** should be the name of the ServiceDesk Plus support group requests will be assigned to, exactly as it appears under **Admin > Users > Support Groups**.
+
+### Severity Mapping Details
+
+This maps to the ServiceDesk Plus request **Priority** field by name, using your account's priority names:
+
+- **Severity Field Name**: `Priority`
+- **Info Mapping**: `Low`
+- **Low Mapping**: `Normal`
+- **Medium Mapping**: `Medium`
+- **High Mapping**: `High`
+- **Critical Mapping**: `High`
+
+### Status Mapping Details
+
+This maps to the request **Status** field by name.  The defaults use the built-in statuses:
+
+- **Status Field Name**: `Status`
+- **Active Mapping**: `Open`
+- **Closed Mapping**: `Closed`
+- **False Positive Mapping**: `Closed`
+- **Risk Accepted Mapping**: `On Hold`
+
+A few ServiceDesk Plus-specific behaviors to be aware of:
+
+- Updates sync the full request content - unlike most trackers, ServiceDesk Plus allows the subject and description to be edited after creation.
+- Requests are closed rather than deleted when a Finding is removed; requests already Closed or Resolved are left untouched.
+- If your account makes fields mandatory on closure (for example a resolution), a close pushed from DefectDojo may be rejected by those rules and will appear in the Integration errors table.
+
+## Zendesk
+
+The Zendesk Integration allows you to push DefectDojo Findings and Finding Groups as Zendesk tickets, assigned to a Zendesk Group of your choice.
+
+### Instance Setup
+
+- **Label** should be the label that you want to use to identify this integration.
+- **Location** should be set to your Zendesk account URL, for example `https://your-subdomain.zendesk.com`.
+- **Email** should be the email address of the Zendesk agent the API token belongs to.
+- **API Token** should be set to a Zendesk API token.  An administrator can create one in the Zendesk Admin Center under **Apps and integrations > APIs > Zendesk API** (token access must be enabled).
+
+### Issue Tracker Mapping
+
+- **Group ID** should be the numeric ID of the Zendesk Group that tickets will be assigned to.  You can find it in the Admin Center under **People > Team > Groups**, or in the URL while viewing the group.
+
+### Severity Mapping Details
+
+This maps to the Zendesk ticket **Priority** field, which accepts `low`, `normal`, `high`, and `urgent`:
+
+- **Severity Field Name**: `Priority`
+- **Info Mapping**: `low`
+- **Low Mapping**: `low`
+- **Medium Mapping**: `normal`
+- **High Mapping**: `high`
+- **Critical Mapping**: `urgent`
+
+### Status Mapping Details
+
+Zendesk tickets support the statuses `new`, `open`, `pending`, `hold`, `solved`, and `closed`.  Note that `hold` must be enabled on your account before it can be used.
+
+- **Status Field Name**: `Status`
+- **Active Mapping**: `new`
+- **Closed Mapping**: `solved`
+- **False Positive Mapping**: `solved`
+- **Risk Accepted Mapping**: `pending`
+
+A few Zendesk-specific behaviors to be aware of:
+
+- The ticket description is the first comment in Zendesk and cannot be edited after creation, so pushing an updated Finding will sync the ticket's subject, priority, and status, but not description changes.
+- Tickets are marked `solved` rather than deleted when a Finding is removed; Zendesk closes solved tickets automatically after a period of time.
+- `closed` is a final status - closed tickets cannot be updated at all, and pushing a Finding whose ticket has closed will report an error.
diff --git a/docs/content/releases/pro/changelog.md b/docs/content/releases/pro/changelog.md
index d246b46311f..483c42a1a32 100644
--- a/docs/content/releases/pro/changelog.md
+++ b/docs/content/releases/pro/changelog.md
@@ -12,6 +12,22 @@ For Open Source release notes, please see the [Releases page on GitHub](https://
 
 ## July 2026: v3.1
 
+### July 13, 2026: v3.1.100
+
+* **(Connectors)** Added a large batch of new Connectors. New findings connectors: CrowdStrike Falcon, Microsoft Defender Vulnerability Management, Microsoft Defender for Cloud, Veracode, Qualys, Rapid7 InsightVM, GitHub Advanced Security, HackerOne, Contrast, Google Cloud Security Command Center, Shodan, Wazuh, Cloudflare, Censys, Docker Scout, and Have I Been Pwned. New asset connectors: GitLab, Atlassian JSM Assets, Bitbucket Cloud, Azure DevOps, Backstage, and Group-IB ASM. Added a GitGuardian secrets connector.
+* **(Integrations)** Added new outbound integrators for Jira (Cloud and Data Center, with per-transition custom fields, ticket templates, and a test-render path), PagerDuty, Shortcut, and Bitbucket Cloud. Jira integrations now support setting fields on close/reopen transitions and Jira Cloud OAuth.
+* **(Search)** Added cross-model global search backed by native Postgres full-text search and trigram indexes, so you can search across findings and related objects from one place.
+* **(Findings)** Added a public API endpoint for merging findings, and "Not X" negation options on the finding status filter.
+* **(Notes)** You can now @mention users in notes with autocomplete; mentioned users receive a notification.
+* **(Users)** Added bulk API-token and password resets from the users list.
+* **(Sensei)** Added candidate triage directly in the findings table
+* **(Pro UI)** Reworked the big-table toolbar menu. Long unbroken names now wrap instead of being clipped, table scrollbars stay visible on hover, and in-page navigation refreshes data in place instead of triggering a full-page reload. Added a classic-UI deprecation banner with one-click opt-in to the Pro UI. The test page now shows the effective deduplication matching policy.
+* **(Authorization)** Tightened authorization on product reassignment, V3 location routes, location-reference writes, and questionnaire relink routes.
+* **(Performance)** `close_old_findings` now fetches only the columns it needs, and uWSGI workers and Celery prefork children are recycled by memory to keep long-running instances healthy.
+* **(Import)** Fixed reimport so it dispatches post-processing with the correct per-finding `push_to_jira` value, stopped dynamic Test Type names from doubling the `(scan_type)` suffix, and made risk-acceptance findings reinstate correctly when the expiration date is updated via the API.
+* **(Tools)** Checkmarx One parser now handles explicit null scanner sections in filtered reports, and the CSV universal parser no longer strips backticks from imported values.
+* **(Bug Fixes)** After deleting the object you were viewing, the Pro UI now lands on its parent context instead of erroring; a background sub-fetch 404 no longer ejects authorized users to the 404 page; the global loader no longer gets stuck open in bulk menus; and audit-log history context is now JSON-safe before Celery dispatch.
+
 ### July 7, 2026: v3.1.0
 
 * **(Insights)** Added export functionality and per-metric descriptions to Insights charts.
diff --git a/docs/content/triage_findings/findings_workflows/intro_to_findings.md b/docs/content/triage_findings/findings_workflows/intro_to_findings.md
index 5f60358fed3..0464488b133 100644
--- a/docs/content/triage_findings/findings_workflows/intro_to_findings.md
+++ b/docs/content/triage_findings/findings_workflows/intro_to_findings.md
@@ -32,11 +32,11 @@ The Finding Page contains various components. Each will be populated by the Impo
 ​
 2. **Finding Overview:** This section contains five separate pages of relevant information for the Finding: Description, Mitigation, Impact, References and Notes. These fields can be populated automatically based on the incoming vulnerability data, or they can be edited by a DefectDojo user to provide additional context.  
 ​  
-​**\- Description** is a more detailed summary and explanation of the Finding in question.  
-​**\- Mitigation** is a suggested method for mitigating the Finding so that it is no longer present in your system.  
-​**\- Impact** describes the impact of the vulnerability on your security posture. This page might hold descriptive text, or it may include a [CVSS Vector String](https://qualysguard.qualys.com/qwebhelp/fo_portal/setup/cvss_vector_strings.htm), which is a shorthand way to communicate the vulnerability’s overall exploitability and with the consequences of an exploitation to your organization. Impact is closely related to a Finding’s Severity field.  
-​**\- References** will list any links or additional information relevant to this Finding if included.  
-​**\- Notes** is a page where you can record any other relevant information to this Finding. Notes are ‘DefectDojo\-only’ metadata, and they are not created at the time of import. Use this field to track your mitigation progress or to add more specific detail to the Finding.  
+- ​**Description** is a more detailed summary and explanation of the Finding in question.  
+- ​**Mitigation** is a suggested method for mitigating the Finding so that it is no longer present in your system.  
+- ​**Impact** describes the impact of the vulnerability on your security posture. This page might hold descriptive text, or it may include a [CVSS Vector String](https://qualysguard.qualys.com/qwebhelp/fo_portal/setup/cvss_vector_strings.htm), which is a shorthand way to communicate the vulnerability’s overall exploitability and with the consequences of an exploitation to your organization. Impact is closely related to a Finding’s Severity field.  
+- ​**References** will list any links or additional information relevant to this Finding if included.  
+- ​**Notes** is a page where you can record any other relevant information to this Finding. Notes are ‘DefectDojo\-only’ metadata, and they are not created at the time of import. Use this field to track your mitigation progress or to add more specific detail to the Finding.  
 ​
 3. **Additional Details:** This section lists other details related to this Finding, if relevant:
 
@@ -45,7 +45,7 @@ The Finding Page contains various components. Each will be populated by the Impo
 	* Steps To Reproduce the vulnerability
 	* Severity Justification where you can record a more detailed explanation of the severity or impact of the Finding.  
 	​  
-	​
+
 4. **Metadata: This section contains filterable metadata related to the Finding:**
 
 
diff --git a/docs/layouts/_partials/footer/footer.html b/docs/layouts/_partials/footer/footer.html
index 09ef6d1ac90..676cae91c75 100644
--- a/docs/layouts/_partials/footer/footer.html
+++ b/docs/layouts/_partials/footer/footer.html
@@ -69,7 +69,7 @@