This is an automated email from the ASF dual-hosted git repository.

wu-sheng pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/skywalking-horizon-ui.git


The following commit(s) were added to refs/heads/main by this push:
     new ccb59b6  ui trace popout: sticky time-axis must cover scrolling rows 
cleanly
ccb59b6 is described below

commit ccb59b6224ab821343f47145e566488a293a0a56
Author: Wu Sheng <[email protected]>
AuthorDate: Sun May 17 17:41:39 2026 +0800

    ui trace popout: sticky time-axis must cover scrolling rows cleanly
    
    Symptom (ui-12.png): on the trace popup, scrolling the waterfall
    let the first span's bar bleed through the sticky time-axis row at
    the top — axis tick labels rendered on top of the green bar text.
    
    Cause: the row's bar is `position: absolute` inside a `position:
    relative` track. Sibling-render order under the parent scroll
    container can let absolute-positioned descendants paint above a
    sticky sibling with low z-index in some webkit stacking quirks. The
    axis was at z-index 2 with `background:` shorthand which can be
    overridden in some computed contexts.
    
    Fix on both TracePopout (SkyWalking native) and ZipkinTracePopout:
    - z-index 2 → 10 (well clear of any default-z absolute siblings).
    - `background:` shorthand → explicit `background-color`.
    - Extra `box-shadow: 0 2px 6px rgba(0,0,0,0.35)` so the axis reads
      as a floating header when scrolled, with a visual cut between it
      and the first row.
    
    Also bumped Zipkin's axis to `position: sticky; top: 0;` — it was
    non-sticky before, which meant the axis scrolled out of view
    entirely on long traces.
---
 apps/ui/src/layer/traces/TracePopout.vue       | 16 +++++++++++++---
 apps/ui/src/layer/traces/ZipkinTracePopout.vue |  8 ++++++++
 2 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/apps/ui/src/layer/traces/TracePopout.vue 
b/apps/ui/src/layer/traces/TracePopout.vue
index ae6c4c3..efa6bf9 100644
--- a/apps/ui/src/layer/traces/TracePopout.vue
+++ b/apps/ui/src/layer/traces/TracePopout.vue
@@ -528,12 +528,22 @@ function nativeSpanError(s: NativeSpan): boolean { return 
s.isError; }
 .tp-time-axis {
   position: sticky;
   top: 0;
-  z-index: 2;
+  /* High enough to clear the `.tp-bar` (position: absolute) inside
+   * scrolled rows; z-index 2 was being rendered behind the bars on
+   * scroll because absolute-positioned siblings can paint above
+   * sticky in some webkit stacking quirks. 10 is plenty. */
+  z-index: 10;
   display: flex;
   justify-content: space-between;
-  padding: 4px 12px;
-  background: var(--sw-bg-1);
+  padding: 6px 12px;
+  /* Solid color (not shorthand) so the row content underneath is
+   * fully obscured when the axis sticks during scroll. */
+  background-color: var(--sw-bg-1);
   border-bottom: 1px solid var(--sw-line);
+  /* Soft shadow under the axis once scrolled — gives the axis a
+   * "floating header" feel and visually separates it from the first
+   * row even on dense traces. */
+  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.35);
   font-family: var(--sw-mono);
   font-size: 10px;
   color: var(--sw-fg-3);
diff --git a/apps/ui/src/layer/traces/ZipkinTracePopout.vue 
b/apps/ui/src/layer/traces/ZipkinTracePopout.vue
index e601bf9..3697377 100644
--- a/apps/ui/src/layer/traces/ZipkinTracePopout.vue
+++ b/apps/ui/src/layer/traces/ZipkinTracePopout.vue
@@ -334,10 +334,18 @@ function copyTraceId(): void {
   padding: 0;
 }
 .zk-time-axis {
+  position: sticky;
+  top: 0;
+  z-index: 10;
   display: flex;
   justify-content: space-between;
   padding: 6px 12px;
+  /* Solid background + shadow so the axis cleanly overlays the
+   * scrolling rows underneath rather than letting the first row's
+   * bar bleed through (sibling rendering on scroll). */
+  background-color: var(--sw-bg-1);
   border-bottom: 1px solid var(--sw-line);
+  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.35);
   font-size: 10px;
   color: var(--sw-fg-3);
   font-family: var(--sw-mono);

Reply via email to