(feat)rebrand: NTP - #2923
Conversation
Build Branch
Static preview entry points
QR codes (mobile preview)
Integration commandsnpm (Android / Extension): Swift Package Manager (Apple): .package(url: "https://github.com/duckduckgo/content-scope-scripts.git", branch: "pr-releases/matteo/rebrand/ntp-feature-branch")git submodule (Windows): git -C submodules/content-scope-scripts fetch origin pr-releases/matteo/rebrand/ntp-feature-branch
git -C submodules/content-scope-scripts checkout origin/pr-releases/matteo/rebrand/ntp-feature-branchPin to exact commitnpm (Android / Extension): Swift Package Manager (Apple): .package(url: "https://github.com/duckduckgo/content-scope-scripts.git", revision: "9665eebdf622365e077a719ab659bb07e07d1aa0")git submodule (Windows): git -C submodules/content-scope-scripts fetch origin pr-releases/matteo/rebrand/ntp-feature-branch
git -C submodules/content-scope-scripts checkout 9665eebdf622365e077a719ab659bb07e07d1aa0 |
[Beta] Generated file diffTime updated: Fri, 07 Aug 2026 17:19:02 GMT Apple
File has changed Removed Files
❌ File only exists in old changeset Integration
File has changed Windows
File has changed New Files
❌ File only exists in new changeset |
There was a problem hiding this comment.
Stale comment
Injected PR Evaluation: Web Compatibility & Security
SHA:
37876f4d5· Scope: 81 files, allspecial-pages/(NTP rebrand feature branch combining #2877, #2882, #2887). Noinjected/ormessaging/changes.
Web Compatibility Assessment
File Lines Sev Finding special-pages/pages/new-tab/app/protections/components/Protections.module.css29–40 info Base .switcherrules (DS raised-backdrop token +backdrop-filter: blur(48px)on non-default backgrounds) are not gated behindbody[data-rebrand="true"]. Pre-rebrand users on custom backgrounds will see the new blurred switcher chrome. Cosmetic only, but worth confirming intent.special-pages/pages/new-tab/app/protections/components/Protections.js103–125 info role="tablist"/role="tab"/aria-selectedadded, but the tab pattern is incomplete: noaria-controlslinking tabs to panels, norole="tabpanel"on feed content, no rovingtabindex. Keyboard/AT users may not get full tab semantics.special-pages/pages/new-tab/app/favorites/components/Tile.module.css59–71, 137–184 info Comment acknowledges pre-existing dark+ userImageborder/hover fallthrough (dead compound selector removed). Rebrand block correctly switches.draggableto--ntp-surface-background-color, fixing.plusicon legibility on dark+custom backgrounds.special-pages/pages/new-tab/app/styles/ntp-theme.css44–52, 67–77 info --ntp-card-shadow-restcorrectly scoped under[data-theme](shadow tokens only resolve there). Dark veil for custom backgrounds correctly gated behindbody[data-rebrand="true"]with compounded attribute selectors.special-pages/pages/new-tab/app/next-steps-list/components/NextStepsListCard.js172–186 info Rebrand empty peek shell correctly gated via useNewTabPageRebranding(); integration test guards against leaking to non-rebrand users.(entire PR) — info No browser API overrides, prototype patches, or DOM timing changes. Out of scope for injected compat categories.
Security Assessment
File Lines Sev Finding special-pages/pages/new-tab/app/remote-messaging-framework/components/RemoteMessagingFramework.js61–62 info Icon srcinterpolatesmessage.icon, but the value is typed asRMFIcon(closed enum in generated types). No path-traversal risk from page scripts — data is native-supplied and schema-validated.special-pages/pages/new-tab/app/freemium-pir-banner/components/FreemiumPIRBanner.js20 info Pre-existing convertMarkdownToHTMLForStrongTags→dangerouslySetInnerHTMLfor native message copy. Unchanged in this PR; trusted-boundary content only.special-pages/package.json31 info @duckduckgo/design-tokensbumped v0.30.0 → v0.34.0. Collateral: onboardingComparisonTable.module.cssstill references removed--ds-color-palette-red-50(see #2902/#2904). Not an injected risk, but verify onboarding build.(entire PR) — info No changes to captured-globals.js, message bridge, origin validation,postMessage, ornativeDatahandling.
Risk Level
Low Risk — Special-pages NTP UI/CSS rebrand only; all visual changes are gated behind
useNewTabPageRebranding()/body[data-rebrand="true"](with the noted exception of base Protections switcher chrome). No injected script surface area touched.
Recommendations
- (info) Confirm whether the ungated Protections switcher backdrop/blur change is intentional for pre-rebrand users; if not, move lines 33–40 under
:global(body[data-rebrand="true"]).- (info) Complete the tablist ARIA pattern (
aria-controls,role="tabpanel", roving tabindex) before shipping the rebrand tab switcher broadly.- (info) Verify onboarding
ComparisonTableagainst design-tokens v0.34.0 (companion fix #2904) since this branch bumps the shared dependency.- (info) Follow up on dark+
userImagefavorites tile border/hover fallthrough noted inTile.module.csscomments.- (positive) Good integration-test coverage added for rebrand icon gating, peek-shell behavior, and activity burn/remove icon swaps.
Sent by Cursor Automation: Web compat and sec
|
This PR requires a manual review and approval from a member of one of the following teams:
|
There was a problem hiding this comment.
Stale comment
Injected PR Evaluation: Web Compatibility & Security
Re-assessed on synchronize (
8331bda44, 2026-08-04). Delta since4ee53d575: merges Customize drawer rebrand (#2890) — 7 files, CSS-only.Scope note: 97 files total, all
special-pages/(NTP rebrand feature branch combining #2877, #2882, #2887, #2890, #2912). Noinjected/,messaging/,wrapper-utils.js, orcaptured-globals.jschanges.
Web Compatibility Assessment
File Severity Finding (none in injected/)— No browser API overrides, prototype patches, or content-script messaging in this PR. customizer/components/Customizer.module.css:46-47info Rebrand customize button drops backdrop-filterin favor of solid control-fill tokens — reduces GPU/compositing cost; correctly scoped to[data-rebrand="true"].customizer/components/CustomizerDrawerInner.module.css:265+info Drawer typography, background-panel selection rings, and close-button styling are all under [data-rebrand="true"]— no legacy-path impact.customizer/components/ThemeSection.module.css:87+info --theme-swatch-outer-radius: 10pxis a hardcoded Figma value (no matching DS token); rebrand-gated. macOS segmented-control inset shadow scoped to[data-rebrand][data-platform-name="macos"].styles/ntp-theme.css:44-47, 79-84info Rebrand drawer width (264px) and darker dark-mode veil ( black-at-50) are compound-gated onbody[data-rebrand]+ background-kind — correct selector pattern (no descendant combinator on body attrs).shared/components/Switch/Switch.module.css:100+info Windows medium switch sizing overrides gated on :global([data-rebrand="true"]).onboarding/.../ComparisonTable.module.css:119info Hardcoded #de5833replaces removed--ds-color-palette-red-50token — onboarding collateral from design-tokens bump, not NTP runtime.protections/components/Protections.js:102-127info Tablist adds role="tab"/aria-selected(improvement) but still lacksaria-controls+role="tabpanel"wiring — incomplete ARIA tab pattern.protections/components/Protections.module.css:1-3, 38-40info .rootand non-default-background.switcherretain ungatedbackdrop-filter: blur(48px)— pre-existing; rebrand blob indicator is gated in JS.favorites/components/Tile.module.css:59-60, 173-174info Dark+userImage tile border/hover still falls through to light rules when rebrand is off — acknowledged pre-existing. omnibar/components/useKeyboardFocusWithin.jsinfo Tab-only keyboard-focus detection; listeners skipped when enabled: false(rebrand off). Correctly lifted toOmnibar.jswithenabled: rebrand.Security Assessment
File Severity Finding (entire PR) — No injected script surface. NTP is a privileged embedded page, not arbitrary third-party DOM. remote-messaging-framework/.../RemoteMessagingFramework.jsinfo Icon paths use ./icons/rebrand/${message.icon}-96.svg—message.iconcomes from native RMF config (trusted), not page-controlled input.(none) — No nativeDataforwarding, message-bridge changes,postMessage,eval/Function, uncaptured globals, or origin-validation relaxations.Risk Level
Low Risk — CSS/visual rebrand work and NTP component styling gated behind
body[data-rebrand="true"]/useNewTabPageRebranding(); zero changes to injected privacy features or messaging security boundaries.Recommendations
- (info) Complete Protections tablist ARIA: add
aria-controlson tabs androle="tabpanel"on the feed container.- (info) Manual QA: rebrand customize drawer on macOS + Windows (theme swatches, background panels, visibility toggles, drawer width).
- (info) Optional: integration test with
rebrand: 'enabled'for customize drawer open/close and theme selection.- (info) Track dark+userImage favorites tile border fallthrough for a follow-up when rebrand ships broadly.
Sent by Cursor Automation: Web compat and sec
There was a problem hiding this comment.
Stale comment
Injected PR Evaluation: Web Compatibility & Security
Ready-for-review sign-off at
380dc6f66(2026-08-05).Scope note: This PR touches 97 files, all under
special-pages/pages/new-tab/and shared components. Noinjected/ormessaging/changes. The injected-script threat model (API overrides, captured globals, message-bridge trust boundaries) does not apply.Delta since last assessment (
d1e150351):380dc6f66— rebrand-only omnibarTabSwitcherCSS polish (disable hover pseudo on unselected tabs, label padding tweak, remove dark blob shadow). No new compat/security findings.
Web Compatibility Assessment
File Lines Severity Finding (entire PR) — info No injected-script changes. NTP is a privileged embedded page, not page-world injection. special-pages/.../useKeyboardFocusWithin.js42–45 info Keyboard-focus tracking is Tab-only; Shift+Tab and arrow-key navigation are not tracked. Acceptable for pill-ring affordance but differs from full :focus-visiblesemantics. Gated viaenabled: falsewhen rebrand is off.special-pages/.../Protections.js102–127 info Stats/Activity switcher uses role="tablist"+aria-selected, but tabs lackaria-controlspointing to tabpanels and feed content lacksrole="tabpanel". Pre-existing pattern extended with rebrand blob indicator.special-pages/.../Protections.module.css1–3, 39 info Legacy .root/.switcherretainbackdrop-filter: blur(48px)outside[data-rebrand]. Rebrand path removes blur on switcher; base rules unchanged for flag-off users.special-pages/.../Tile.module.css59–67 info Dark + userImagebackground tile border/hover still falls through to light rule (acknowledged in comment). Pre-existing, not introduced by rebrand.special-pages/.../onboarding/.../ComparisonTable.module.css— info Collateral from design-tokens v0.30→v0.34 bump: --ds-color-palette-red-50removed. Tracked separately in #2904.
Security Assessment
File Lines Severity Finding (entire PR) — info No changes to captured globals, API shims, messaging transports, or message-bridge trust boundaries. special-pages/.../RemoteMessagingFramework.js72–73 info Title/description rendered as text nodes (not innerHTML) — good. Icon paths switch between./icons/and./icons/rebrand/based on rebrand flag; both are static bundled assets.special-pages/.../FreemiumPIRBanner.js,SubscriptionWinBackBanner.js— info Pre-existing dangerouslySetInnerHTMLviaconvertMarkdownToHTMLForStrongTags()unchanged; PR only adds rebrand icon path switching. Native message content trust boundary unchanged.special-pages/.../useKeyboardFocusWithin.js52–61 info Document-level capture listeners ( keydown,pointerdown, etc.) are properly cleaned up on unmount and skipped whenenabled: false. No leak when rebrand is off.
Risk Level
Low Risk — Special-pages NTP UI/CSS rebrand gated behind
useNewTabPageRebranding()/body[data-rebrand="true"], with no injected-script, messaging, or browser API override changes.
Recommendations
- (info) Before rebrand GA: add
aria-controls/role="tabpanel"to the Protections stats/activity switcher for full tablist semantics.- (info) Coordinate native rollout so
newTabPageRebrandingflag andbody[data-rebrand]stay in sync.- (info) Land #2904 (
ComparisonTablepalette token) before or with the design-tokens bump if onboarding builds are in scope.- (info) Consider rebrand screenshot baselines for omnibar TabSwitcher dark-mode blob shadow removal (
380dc6f66).No blocking injected compat/security issues found. ✅
Sent by Cursor Automation: Web compat and sec
vkraucunas
left a comment
There was a problem hiding this comment.
Found a few things to update / and a few questions. Happy to come back n approve if that makes your life easier.
There was a problem hiding this comment.
Stale comment
Injected Web Compatibility & Security Review
Re-assessed on synchronize (
cb372d9b8, 2026-08-05). Delta sincee68f94550: subscription icon path correction (SubscriptionWinBackBannernow usesrebrand/Subscription-Clock-96.svg; new asset added). No other logic changes.Scope note: This PR touches 98 files, all under
special-pages/— there are zero changes toinjected/,messaging/,wrapper-utils.js,captured-globals.js, or message-bridge code. The injected compat/security threat model (API overrides on hostile third-party pages, captured globals, messaging trust boundaries) does not apply.
Web Compatibility Assessment
File Severity Finding (none in injected/)— No browser API overrides, prototype patches, or DOM injection into arbitrary web pages. special-pages/.../useKeyboardFocusWithin.jsinfo Document-level keydown/pointerdownlisteners gated viaenabled: rebrand; cleaned up on unmount. Tab-only modality (arrow keys won't trigger keyboard-focus ring) — matches static-pages pattern, acceptable for launch.special-pages/.../Protections.jsinfo role="tablist"/role="tab"/aria-selectedadded; missingaria-controls/tabindexfor full ARIA tabs pattern. NTP embedded surface only.special-pages/.../Protections.module.cssinfo backdrop-filter: blur(20px)on legacy.blockLegacypath — potential perf cost on low-end devices when rebrand off.special-pages/.../Tile.module.cssinfo Non-rebrand dark + userImageborder/hover may fall through to rebrand rules (acknowledged in #2887).
Security Assessment
File Severity Finding (none in injected/)— No captured-global bypass, messaging bridge, or postMessagechanges.special-pages/.../RemoteMessagingFramework.jsinfo Icon path ./icons/rebrand/${message.icon}-96.svg—message.iconfrom native RMF config (trusted source), same interpolation pattern as pre-PR legacy path.special-pages/.../SubscriptionWinBackBanner.js,FreemiumPIRBanner.jsinfo dangerouslySetInnerHTMLwithconvertMarkdownToHTMLForStrongTags()(escapes HTML before**→<strong>). Pre-existing pattern, not introduced here.special-pages/.../settings.provider.jsinfo Rebrand gated via settings.newTabPageRebranding.state === 'enabled'— remotely controllable by native, allows rollback without deploy.No warning, error, or critical security findings.
Risk Level
Low Risk — special-pages NTP UI/CSS rebrand behind a native feature flag; no injected script changes, no API shims, no messaging transport modifications.
Recommendations
- Resolved (
cb372d9b8): Subscription win-back banner now usesrebrand/Subscription-Clock-96.svgper design feedback.- Resolved (
ac99d7c27): LegacyProtectionsBodyLegacyblob pill when rebrand on.- Info (open): Complete ARIA tabs pattern (
aria-controls,tabindex) if keyboard nav between Stats/Activity tabs is prioritized.- Info (open): Consider rebrand screenshot baselines for omnibar, RMF, and customizer surfaces.
- Info (open): Bugbot-flagged ungated CSS changes in Activity/Protections base rules are visual-scope concerns outside injected compat/security — track separately if legacy NTP parity is required.
Sent by Cursor Automation: Web compat and sec
|
@BugBot run |
There was a problem hiding this comment.
Stale comment
Web Compatibility Assessment
Scope note: 98 files changed, all under
special-pages/pages/new-tab/(plus collateral onboarding screenshot rebaselines). Noinjected/changes — third-party web-page API fidelity categories do not apply.
File Severity Finding omnibar/components/useKeyboardFocusWithin.jsinfo Keyboard focus ring is Tab-only ( event.key === 'Tab'); Shift+Tab and arrow-key navigation won't setdata-keyboard-focus-within. Matches static-pages pattern; hook is gated viaenabled: rebrand.protections/components/Protections.jsinfo Rebrand adds role="tablist"/role="tab"/aria-selectedbut omitsaria-controlsand roving-tabindex arrow-key handling. Buttons still work via click; incomplete WAI-ARIA tabs pattern.favorites/components/Favorites.jsinfo ShowHideButtonPilldoes not passvariant="rebrand"while Privacy Stats does — minor visual inconsistency when rebrand is on.favorites/components/Tile.module.cssinfo Dark + userImagebackground still falls through to light border/hover rule (acknowledged in-file comment; pre-existing).next-steps-list/components/NextStepsListCard.module.cssinfo Resolved in e2ccdb4c0: Windows button longhand overrides now scoped tobody[data-rebrand="true"]— no longer leaks to legacy NTP on Windows.components/ShowHide.module.cssinfo Resolved in 43986f98e: Dark rebrand icon background uses nested[data-theme="dark"]underbody[data-rebrand](dead compound selector fixed).Security Assessment
File Severity Finding remote-messaging-framework/components/RemoteMessagingFramework.jsinfo Icon path ./icons/rebrand/${message.icon}-96.svginterpolates native RMF config; bounded to bundled static assets under known prefix.freemium-pir-banner/,subscription-winback-banner/info Pre-existing dangerouslySetInnerHTML; content sanitized viaconvertMarkdownToHTMLForStrongTags(HTML escaped before**→<strong>conversion).settings.provider.jsinfo All rebrand UI gated via useNewTabPageRebranding()reading nativenewTabPageRebrandingsetting — remotely toggleable without code deploy.— — No changes to captured globals, message bridge, origin validation, postMessage, orload()-time injection.Risk Level
Low Risk — Entirely special-pages NTP styling/components; zero
injected/diff; no browser API overrides, messaging boundary changes, or security-sensitive infrastructure touched.Recommendations
- (info) Consider passing
variant="rebrand"to Favorites'ShowHideButtonPillfor visual parity with Privacy Stats.- (info) Complete Protections tablist ARIA (
aria-controls+ keyboard nav) or document as intentional button-group.- (info) Add rebrand-specific Playwright screenshot baselines before ship (onboarding collateral rebaselines are unrelated).
- (info) Manual QA: omnibar keyboard focus ring (Tab vs click), Windows Next Steps buttons under rebrand, dark theme ShowHide pills.
Re-assessed at
e2ccdb4c0. Delta since43986f98e: Windows Next Steps button overrides scoped to rebrand; Protections spacing token (--ds-space-x06).Sent by Cursor Automation: Web compat and sec
There was a problem hiding this comment.
Stale comment
Injected PR Evaluation: Web Compatibility & Security
Re-assessed on synchronize (
18fc384d3, 2026-08-05). Delta since443151f37: removesuseKeyboardFocusWithinhook and its document-level listeners.Scope: 99 files changed; no
injected/changes. NTP rebrand CSS/JS inspecial-pages/only, gated viauseNewTabPageRebranding()/body[data-rebrand="true"].
Web Compatibility Assessment
File Lines Severity Finding special-pages/pages/new-tab/app/omnibar/components/Omnibar.js154 info Resolved: useKeyboardFocusWithinremoved. Focus chrome now relies on:has(input:focus:placeholder-shown)/:focus-visibleCSS inOmnibar.module.css— no document-level capture listeners.special-pages/pages/new-tab/app/protections/components/Protections.js102–123 info Tab buttons use role="tab"/aria-selectedbut lackaria-controlslinking to tabpanels. Pre-existing pattern; considerrole="tabpanel"+aria-labelledbyfor screen-reader navigation.special-pages/pages/new-tab/app/omnibar/components/TabSwitcher.js31–45 info Same tablist ARIA gap as Protections switcher. special-pages/pages/new-tab/app/omnibar/components/Omnibar.module.css78–91, 164–201 info Rebrand focus ring uses :has()pseudo-class. Supported in current DDG WebViews; no API-surface fidelity concerns.special-pages/pages/new-tab/app/favorites/components/Tile.module.css— info Non-rebrand dark + userImagebackground may fall through to legacy border/hover (acknowledged in prior reviews).special-pages/pages/new-tab/(screenshots)— info No rebrand-specific screenshot baselines added; onboarding rebaselines are collateral from design-tokens bump.
Security Assessment
File Lines Severity Finding special-pages/pages/new-tab/app/remote-messaging-framework/components/RemoteMessagingFramework.js62 info Icon path interpolates native message.iconinto./icons/rebrand/${message.icon}-96.svg. Pre-existing pattern; native should whitelist icon names (no XSS via<img>, but unexpected asset load if unvalidated).special-pages/pages/new-tab/app/freemium-pir-banner/components/FreemiumPIRBanner.js30 info dangerouslySetInnerHTMLfor description viaconvertMarkdownToHTMLForStrongTags— pre-existing, strong-tags only.— — — No changes to messaging transports, nativeDatahandling,postMessage, orcaptured-globals. Noinjected/code touched.special-pages/pages/new-tab/app/settings.provider.js42–44 info Rebrand styles correctly gated behind settings.newTabPageRebranding.state === 'enabled'— remotely disableable.
Risk Level
Low Risk — special-pages NTP UI/CSS rebrand with feature-flag gating; no injected script changes, API overrides, or messaging security surface touched.
Recommendations
- (info) Manual keyboard QA on rebrand omnibar: verify focus ring appearance for Tab vs click on search input and Duck.ai textarea (now CSS-only).
- (info) Add
aria-controls/role="tabpanel"to Protections and TabSwitcher tablists when convenient.- (info) Consider rebrand screenshot baselines before wide rollout.
- (info) Confirm native RMF icon name allowlist covers new
rebrand/asset set.Sent by Cursor Automation: Web compat and sec
Removing the rebrand background/backdrop-filter override lets the legacy custom-bg rules (rgba glass fills) apply on color/gradient/userImage backgrounds, matching the pre-rebrand behaviour in main.
Revert omnibar focus state to production behaviour: border + outline glow via --ds-color-theme-accent-primary / accent-glow-primary, removing the custom box-shadow focused override and keyboard-focus-ring mechanism. Fix dynamicPickerIconColor in rebrand dark mode: use --color-black-at-96 / --color-white-at-96 so the icon always contrasts against the swatch color, independent of the app theme.
Mirrors the same pattern used in PrivacyStats: pass variant='rebrand' when the rebrand flag is on, 'default' otherwise.
CSS consumers (--keyboard-focus-ring, popup[data-keyboard-focus-within]) were removed when reverting to the production focus ring. The hook is now dead code — removing to avoid pointless document listeners on every rebrand NTP load. Will be reintroduced in the follow-up omnibar project.
- TickPill: gate DS token color behind data-rebrand; fix light-mode icon color by setting it on .iconWrapper (not path fill) so currentColor works - Customizer CSS: align [data-rebrand] selectors to :global(body[data-rebrand]) for consistency and safe retirement-time grep - FreemiumPIRBanner: use var(--ntp-card-shadow-rest) instead of inline copy - ActivityItem: hoist useNewTabPageRebranding to memo'd parents, pass isRebrand as prop to Controls (removes N context subscriptions for a boot-time constant) - NextStepsGroup: add missing variant prop to ShowHideButtonPill (latent bug) - Omnibar: scope --omnibar-radius to .root; inline border token per theme directly on .popup instead of global custom properties on body
…-feed Aligns with the kebab-case convention used by all other multi-word params (next-steps, rmf-delay, update-notification, etc.).
…_feed Aligns with underscore convention as agreed with Valerie.
9720c6b to
9c237fd
Compare
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit a085878. Configure here.
There was a problem hiding this comment.
Injected PR Evaluation — Web Compatibility & Security
SHA: 4cf387c6d | Delta since last assessment: 1 commit (fix(privacy-stats): use body-md line-height token for rebrand count)
Web Compatibility Assessment
| File | Lines | Severity | Finding |
|---|---|---|---|
| (full PR) | — | info | No injected/ or messaging/ changes. All 91 files are special-pages/ UI, CSS, icons, tests, and design-token bumps. No browser API overrides, prototype patches, or DOM timing risks. |
PrivacyStats.module.css |
317 | info | Resolved: Rebrand .count line-height now uses var(--ds-font-body-md-line-height) instead of hardcoded 13px. Aligns with design-system typography after font-feature-settings removal. |
TabSwitcher.js |
31–45 | info | Tablist uses role="tablist" / role="tab" / aria-selected but lacks aria-controls and associated role="tabpanel" panels. Visual-only switcher; minor SR gap. |
Protections.js |
102–125 | info | Same tablist pattern for stats/activity feed switcher — no aria-controls/tabpanel pairing. |
Tile.module.css |
59–67 | info | Pre-existing: dark+userImage background falls through to light border/hover rule (documented in comment). Cosmetic only. |
RemoteMessagingFramework.js |
62 | info | Icon path ./icons/rebrand/${message.icon}-96.svg — message.icon is typed as RMFIcon union from native messaging; not page-controlled. |
Security Assessment
| File | Lines | Severity | Finding |
|---|---|---|---|
| (full PR) | — | info | No changes to captured-globals.js, message bridge, API shims, shouldExemptMethod(), or postMessage transports. |
RemoteMessagingFramework.js |
62 | info | Icon filename from native-controlled RMFIcon typed union — no path traversal from page scripts. |
| Rebrand gating | — | info | All rebrand styles gated via useNewTabPageRebranding() / body[data-rebrand="true"]. Remote-config rollback path preserved. |
Risk Level
Low Risk — Special-pages NTP rebrand UI/CSS only; zero injected-script surface. New commit is a single design-token substitution with no compat or security impact.
Recommendations
- (info) Consider adding
aria-controls+role="tabpanel"to TabSwitcher and Protections feed switchers for full ARIA tab pattern compliance. - (info) Add rebrand screenshot baselines for omnibar, favorites, protections, and RMF before ship.
- (info) Optional: address Tile dark+userImage border/hover fallthrough in a follow-up.
Sent by Cursor Automation: Web compat and sec



Feature branch consolidating NTP rebrand PRs for coordinated merge.
Includes
Test environment
https://mborgato.duckduckgo.com/ntp/preview-hub.html
Note
Medium Risk
Broad NTP UI and styling changes across many widgets, but gated on the rebrand flag with extensive integration coverage; no auth or data-handling changes.
Overview
Consolidates the NTP rebrand into one branch: new-tab visuals, icons, and behavior are updated when
body[data-rebrand="true"]/useNewTabPageRebranding()is on; legacy UI stays unchanged when the flag is off.Design system: Bumps
@duckduckgo/design-tokensto v0.34.0 and imports NTP desktop token CSS. Adds shared theme vars (--ntp-card-shadow-rest, dismiss/favicon tokens) and macOS accent/secondary button overrides under rebrand.Widgets (CSS + small JS hooks): Omnibar (radius, shadows, search/Duck.ai tab icons, suggestions accent-alt rows), favorites tiles, customizer drawer/theme sections, Protections (card chrome, sliding pill between Stats/Activity, tab ARIA), privacy stats, activity (favicon chrome; burn uses TrashIcon vs fire/cross), Next Steps / Next Steps List (rebrand illustrations, empty peek shell behind stacked cards), RMF, PIR/winback banners, shared dismiss and show-more pills.
Assets: New 96px step icons,
TrashIcon, rebrand omnibar glyphs (AiChat,SearchFind), andicons/rebrand/*paths for messaging banners.Tests & tooling: Integration tests for rebrand icons (activity burn/remove, dock vs taskbar, empty peek shell);
protections_feedquery param in mocks/specs; Next Steps List examples;.gitignorefor local agent files.Reviewed by Cursor Bugbot for commit 57dc562. Bugbot is set up for automated code reviews on this repo. Configure here.