Skip to content

fix(ui): dark mode for DQ & Observability component surfaces (#6459) - #33586

Open
shah-harshit wants to merge 9 commits into
mainfrom
6459-dq-observability-dark-batch
Open

shah-harshit wants to merge 9 commits into
mainfrom
6459-dq-observability-dark-batch

Conversation

@shah-harshit

@shah-harshit shah-harshit commented Sep 18, 2026

Copy link
Copy Markdown
Contributor

Describe your changes:

Refs open-metadata/openmetadata-collate#6459
Gate contract: open-metadata/openmetadata-collate#6564
Depends on #33597 (global legacy-var bridge + app background).

DQ/Observability component-level dark-mode fixes — swaps non-adapting Tailwind color classes to semantic ones on the .tsx surfaces (bg-whitetw:bg-primary, bg-gray-50tw:bg-secondary, text-gray-500tw:text-tertiary, border-gray-300tw:border-secondary, bg-gray-blue-25bg-secondary_subtle, bg-blue-50bg-utility-blue-50).

The .less-surface theming for these pages is delivered globally by the legacy-var bridge in #33597 (kept separate per review) — hence the dependency. Light mode unchanged.

Type of change:

  • Improvement

Checklist:

RetriggerConfidence Score: 5/5

The PR appears safe to merge; no actionable regressions remain in the reviewed changes.

Summary

This PR updates Data Quality and Observability surfaces to use theme-aware semantic colors and adds a dark-only border treatment for the Data Quality page.

  • Replaces fixed light backgrounds, text colors, and borders with semantic utility classes.
  • Updates dashboard tests to expect the new adaptive surface class.
  • Applies the subtle border token to Data Quality cards, tab navigation, and table containers in dark mode.

Reviews (6) · Last reviewed commit: "fix(ui): DQ page header/tab/table border..."

Combined dark-mode pass over the remaining Data Quality & Observability
AI-mode routes (workstream open-metadata/openmetadata-collate#6459). Swaps
compile-time fixed-hex LESS palette vars and raw Tailwind palette classes
for adaptive semantic / auto-inverting utility tokens; light-mode values
are preserved (exact for status colors) and only the resolved dark values
change.

Covers:
- #6533 Add/Edit Test Case: TestCaseFormV1.less, add-test-suite-pipeline
  (@grey-*/@Blue-22 surfaces), AddTestCaseList bg-white -> tw:bg-primary.
- #6531 Incident Manager: dimensionality heatmap legend + tooltip, failed
  sample-data diff rows, incident/result tab surfaces (@grey-*/status hex
  -> semantic + utility-{success,error,warning}).
- #6532 Table DQ + Profiler: ProfilerLatestValue, TestSummaryGraph,
  no-profiler-banner, table-profiler (neutral greys -> semantic roles).
- #6538 Pipeline Observability: data-observability-tab border.
- #6530 Alerts: AlertAiNotificationSection bg-white + text-gray-500.

Status hexes map to exact-match auto-inverting utility tokens
(@red-22=error-500, @warning-400=warning-400, @Green-9=success-50,
@Blue-22=blue-light-50, @alert-error-icon-bg-1=error-100). Neutral greys
map to --color-bg/border/text semantic roles.

Deferred (categorical, tracked for the token foundation): the 5-level
incident severity ramp and the heatmap data-viz white-fade gradients in
incident-manager.style.less / DimensionalityHeatmap.less need shared dark
palette values rather than per-page overrides.

Verify-only (no offenders found; AI routes already on semantic tokens):
#6540 Test Suites list, #6535 Test Case details/versions, #6537 Test
Library, #6536 Suite details/ingestion.

Refs open-metadata/openmetadata-collate#6533 open-metadata/openmetadata-collate#6531 open-metadata/openmetadata-collate#6532 open-metadata/openmetadata-collate#6538 open-metadata/openmetadata-collate#6530 open-metadata/openmetadata-collate#6459

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

❌ PR checklist incomplete

This PR cannot be merged until the following are addressed on its linked issue:

  • No GitHub issue is linked. Link an issue in the Development section of the PR (or add Fixes #12345 to the description). For a same-org cross-repo issue, add Fixes open-metadata/<repo>#123 to the description.

The fields live on the linked issue in the Shipping project (open the issue → right sidebar → Projects). After you set them, re-run this check (or push a commit) — issue/project changes do not re-trigger it automatically.

Maintainers can bypass this check by adding the skip-pr-checks label.

@github-actions

Copy link
Copy Markdown
Contributor

Hi there 👋 Thanks for your contribution!

The OpenMetadata team will review the PR shortly! Once it has been labeled as safe to test, the CI workflows
will start executing and we'll be able to make sure everything is working as expected.

Let us know if you need any help!

@github-actions

github-actions Bot commented Sep 18, 2026

Copy link
Copy Markdown
Contributor

✅ Playwright Results — workflow succeeded

Validated commit 47c028e35152b32479eca2d199129c3f96be35c9 in Playwright run 35390738216, attempt 1.

✅ 4492 passed · ❌ 0 failed · 🟡 7 flaky · ⏭️ 1 skipped · 🧰 0 lifecycle flaky

Performance

Blocking targets: ✅ met · Optimization targets: 🟡 in progress

Shard-job maxima below are not the full workflow wall time; the linked run includes build, fixture, planning, and reporting.

🕒 Full workflow signal wall (to summary) 54m 24s

⏱️ Max setup 4m 39s · max shard execution 23m 56s · max shard-job elapsed before upload 27m 0s · reporting 24s

🌐 220.81 requests/attempt · 2.23 app boots/UI scenario · 43.94% common-shard skew

Optimization targets still in progress:

  • Common shard skew was 43.94% (convergence target: at most 15%).
  • Browser traffic was 220.81 requests per attempt (convergence target: fewer than 200).
  • Application boot ratio was 2.23 per UI scenario (10691 boots / 4788 scenarios; convergence target: at most 1).
Shard Passed Failed Flaky Skipped Lifecycle failed Lifecycle flaky
✅ Shard advanced-search-01 130 0 0 0 0 0
✅ Shard chromium-01 159 0 0 0 0 0
✅ Shard chromium-02 176 0 0 0 0 0
✅ Shard chromium-03 163 0 0 0 0 0
✅ Shard chromium-04 202 0 0 0 0 0
🟡 Shard chromium-05 186 0 1 1 0 0
✅ Shard chromium-06 174 0 0 0 0 0
🟡 Shard chromium-07 169 0 2 0 0 0
✅ Shard chromium-08 157 0 0 0 0 0
✅ Shard chromium-09 174 0 0 0 0 0
🟡 Shard chromium-10 166 0 1 0 0 0
✅ Shard chromium-11 215 0 0 0 0 0
✅ Shard chromium-12 160 0 0 0 0 0
✅ Shard chromium-13 162 0 0 0 0 0
🟡 Shard chromium-14 200 0 1 0 0 0
✅ Shard chromium-15 248 0 0 0 0 0
🟡 Shard chromium-16 179 0 1 0 0 0
✅ Shard chromium-17 171 0 0 0 0 0
✅ Shard chromium-18 167 0 0 0 0 0
✅ Shard chromium-19 168 0 0 0 0 0
✅ Shard chromium-20 165 0 0 0 0 0
🟡 Shard chromium-21 164 0 1 0 0 0
✅ Shard chromium-22 205 0 0 0 0 0
✅ Shard data-asset-rules-01 65 0 0 0 0 0
✅ Shard domain-isolation-01 16 0 0 0 0 0
✅ Shard global-state-01 34 0 0 0 0 0
✅ Shard import-export-01 80 0 0 0 0 0
✅ Shard import-export-02 70 0 0 0 0 0
✅ Shard ingestion-01 43 0 0 0 0 0
✅ Shard ingestion-02 55 0 0 0 0 0
✅ Shard reindex-01 28 0 0 0 0 0
✅ Shard search-01 12 0 0 0 0 0
✅ Shard search-rbac-01 29 0 0 0 0 0
🟡 7 flaky test(s) (passed on retry)
  • Flow/CustomizeWidgets.spec.tsKPI Widget (shard chromium-05, 1 retry)
  • Features/SettingsNavigationPage.spec.tsshould save changes and navigate when "Save changes" is clicked in blocker (shard chromium-07, 1 retry)
  • Pages/UserDetails.spec.tsAdmin user can edit teams from the user profile (shard chromium-07, 1 retry)
  • Features/ContextCenterArticles.spec.tsArticle card metadata, widgets, and listing search update from UI edits (shard chromium-10, 1 retry)
  • Features/ColumnBulkOperations.spec.tsshould show no results when searching for nonexistent column (shard chromium-14, 1 retry)
  • Pages/ExplorePageRightPanel_KnowledgeCenter.spec.tsShould remove user owner for knowledgeCenter (shard chromium-16, 1 retry)
  • Pages/EntityDataConsumer.spec.tsTag Add, Update and Remove for child entities (shard chromium-21, 1 retry)

📦 Download artifacts

How to debug locally
# Download playwright-test-results-<shard> artifact and unzip
npx playwright show-trace path/to/trace.zip    # view trace

shah-harshit and others added 3 commits September 18, 2026 21:22
The AI-mode Data Quality summary shells already use adaptive semantic
tokens, but the shared widgets they embed (chart backgrounds, status
cards, statistic widgets, test-case status chart) baked compile-time
fixed-hex LESS palette vars (@grey-26/@grey-9/@grey-2/@grey-50, @Blue-13,
@GREEN-*, @RED-*, @yellow-10, @alert-*) that cannot follow the theme, so
those surfaces stayed light in dark mode.

Swap the fixed palette vars for adaptive tokens:
- neutral surfaces/borders -> semantic --color-bg-secondary_subtle /
  --color-bg-secondary / --color-border-secondary
- status colors -> --tw-color-utility-{error,success,warning,blue}-*,
  which auto-invert in dark (mirrors the merged StatusCardWidget
  precedent). Every status mapping is an exact light-value match, so
  light mode does not regress.
- AI dashboard section tint tw:bg-gray-blue-25 (fixed light) ->
  tw:bg-utility-gray-blue-50 (auto-inverting).

Already-adaptive utility-gray vars are left as-is. Categorical chart/
status data colors are intentionally unchanged.

Refs open-metadata/openmetadata-collate#6539 open-metadata/openmetadata-collate#6459

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Address review on the DQ summary dark-mode PR:

- The coverage/all-tests chart icon mapped @blue-500 (#0ba5ec, cyan) to
  utility-blue-500 (#2e90fa), a perceptible cyan->blue hue shift in light
  mode. #0ba5ec is exactly the blue-light-500 ramp, so switch the icon fg
  to utility-blue-light-500 and its background (@Blue-13 #e0f2fe) to
  utility-blue-light-100 (#e0f2fe) — both now exact light-value matches.
- DataQualityDashboard.test.tsx still asserted the removed bg-gray-blue-25
  classes; update both expectations to bg-utility-gray-blue-50 so the
  focused test matches the component. Suite passes (8/8).

Refs open-metadata/openmetadata-collate#6539 open-metadata/openmetadata-collate#6459

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The dimension-count chip in the AI-mode Test Cases list used the raw
palette class tw:bg-blue-50, which does not invert in dark mode, so its
light-blue background stayed fixed while tw:text-primary flipped to a
light foreground — light-on-light, unreadable in dark.

Swap to tw:bg-utility-blue-50, which auto-inverts (light blue tint in
light, dark blue in dark) per colors.md §2.7, keeping text-primary
readable in both themes. Light mode is unchanged.

The rest of the Test Cases list (table header, filters, table shell) was
already on adaptive semantic tokens.

Refs open-metadata/openmetadata-collate#6534 open-metadata/openmetadata-collate#6459

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Hi there 👋 Thanks for your contribution!

The OpenMetadata team will review the PR shortly! Once it has been labeled as safe to test, the CI workflows
will start executing and we'll be able to make sure everything is working as expected.

Let us know if you need any help!

@shah-harshit shah-harshit changed the title fix(ui): theme DQ authoring, incidents, profiler & alerts for dark mode fix(ui): dark mode for Data Quality & Observability AI routes (#6459) Sep 18, 2026
Address greptile P2: bg-utility-gray-blue-50 resolved to #f8f9fc in light,
shifting the section-card surface from the original bg-gray-blue-25
(#fcfcfd). Use tw:bg-secondary_subtle instead — light #fdfdfd (effectively
unchanged) and a proper dark surface, matching the LESS card surfaces in
this PR. Focused test updated; suite passes 8/8.

Refs open-metadata/openmetadata-collate#6539 open-metadata/openmetadata-collate#6459

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@shah-harshit

Copy link
Copy Markdown
Contributor Author

Addressed the P2 light-drift comments (2d6dfd4):

  • Dashboard section cards: switched bg-utility-gray-blue-50tw:bg-secondary_subtle. Light resolves to #fdfdfd vs the original #fcfcfd (Δ1, imperceptible) and it now carries a proper dark surface, consistent with the LESS card surfaces in this PR. Test updated, suite 8/8.
  • Success green swaps: keeping utility-success-700/-100. The light deltas are sub-perceptual — #027a48#067647 is rgb(2,122,72)→(6,118,71), and #d1fadf#dcfae6 ≈ Δ6 — there is no exact-light token for #027a48, and only the success-* utility adapts to dark (the old fixed @green-* vars stayed light-on-dark). Semantic correctness + dark adaptation outweighs an invisible light shift here.

@github-actions

Copy link
Copy Markdown
Contributor

Hi there 👋 Thanks for your contribution!

The OpenMetadata team will review the PR shortly! Once it has been labeled as safe to test, the CI workflows
will start executing and we'll be able to make sure everything is working as expected.

Let us know if you need any help!

Replace the per-file dark-mode token swaps with a single global bridge so
the fixed-hex legacy LESS palette vars adapt to dark mode everywhere they
are used, with zero light-mode drift and no per-component edits.

- variables.less: the 27 fixed-hex vars this workstream touched
  (@grey-1/2/5/7/9/15/25/26/50, @green-9/10/12/100/500, @red-9/10/22,
  @yellow-10, @blue-13/22/500, @warning-100/400, @alert-*) become
  `@x: var(--legacy-x, #originalHex)`. Light resolves to the exact
  original hex (no drift — fixes the greptile light-shift comments); dark
  picks up the override.
- app.less: one `.dark-mode` block maps each `--legacy-*` to the semantic
  / auto-inverting utility token (neutrals -> --color-bg/border/text
  roles, status -> utility-{success,error,warning,blue-light}-*).
- Revert the individual DQ/Profiler/IncidentManager/Alerts LESS files back
  to origin/main — they now adapt automatically through the bridge.

Verified: variables.less and a consumer (.less) compile via lessc, emitting
`var(--legacy-*, #hex)`; no legacy var is used in a LESS color function or
operation (checked app-wide), so the var() substitution is safe. @black
left literal (mostly non-DQ, app-wide). Categorical severity/heatmap ramps
still deferred to the token foundation.

Raw Tailwind palette classes in TSX (bg-white, bg-gray-50, text-gray-500,
border-gray-300, bg-gray-blue-25) keep their per-file semantic swaps — they
are not LESS vars and have no global bridge.

Refs open-metadata/openmetadata-collate#6459

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@shah-harshit shah-harshit changed the title fix(ui): dark mode for Data Quality & Observability AI routes (#6459) fix(ui): dark mode for DQ & Observability via global legacy-var bridge (#6459) Sep 18, 2026
@shah-harshit

Copy link
Copy Markdown
Contributor Author

Reworked into a global legacy-var bridge (06c0246) and reverted the per-file LESS swaps:

  • variables.less: 27 fixed-hex vars → var(--legacy-x, #origHex) (light byte-exact).
  • app.less .dark-mode: maps --legacy-* → semantic/utility tokens for dark.
  • Reverted all per-component DQ/Profiler/IncidentManager/Alerts .less edits — they adapt through the bridge now.

This also fully resolves the earlier P2 light-drift comments: light mode is the exact original hex via the var() fallback, so there is no shift for the success greens or the dashboard cards. TSX raw palette classes keep their per-file semantic swaps (no global hook for Tailwind palette classes).

@github-actions

Copy link
Copy Markdown
Contributor

Hi there 👋 Thanks for your contribution!

The OpenMetadata team will review the PR shortly! Once it has been labeled as safe to test, the CI workflows
will start executing and we'll be able to make sure everything is working as expected.

Let us know if you need any help!

The variables.less/app.less global bridge and the dark app-background fix now
live in #33597 (core/global scope). This DQ PR keeps only its component (.tsx)
changes and depends on #33597 for the .less-surface dark theming.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@shah-harshit shah-harshit changed the title fix(ui): dark mode for DQ & Observability via global legacy-var bridge (#6459) fix(ui): dark mode for DQ & Observability component surfaces (#6459) Sep 18, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Hi there 👋 Thanks for your contribution!

The OpenMetadata team will review the PR shortly! Once it has been labeled as safe to test, the CI workflows
will start executing and we'll be able to make sure everything is working as expected.

Let us know if you need any help!

@shah-harshit

Copy link
Copy Markdown
Contributor Author

Both P2 light-drift comments are resolved after splitting the token bridge into #33597:

This PR now carries only the DQ consumer changes (TSX raw-class → semantic swaps); the global variables.less/app.less bridge lives in #33597.

@shah-harshit shah-harshit self-assigned this Sep 18, 2026
@shah-harshit shah-harshit added UI UI specific issues safe to test Add this label to run secure Github workflows on PRs labels Sep 18, 2026
The DQ page header card, tab-nav container, and table container draw their
border from @global-border (@Grey-15) — a solid gray that stands out in dark.
Scope a dark-only override to border-subtle (rgba(255,255,255,0.08)) to match
the subtle white-alpha border used across dark surfaces. Light unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@gitar-bot

gitar-bot Bot commented Sep 18, 2026

Copy link
Copy Markdown
Code Review ✅ Approved

🟢 Low risk

Replaces non-adaptive Tailwind color classes with semantic tokens across DQ and Observability component surfaces to enable dark mode support. Light mode remains unchanged, and no issues were found.

Review coverage

Rules No rules evaluated

Functional validation Not enabled · Set up

Auto-approval Not enabled · Set up

Options

Display: compact → Counting what did not apply, without listing it.

Comment with these commands to change the behavior for this request:

Compact
gitar display:verbose         

Was this helpful? React with 👍 / 👎 | Powered by Gitar — free for open source

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

safe to test Add this label to run secure Github workflows on PRs skip-pr-checks Bypass PR metadata validation check UI UI specific issues

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant