RPP: toggle insights only when clicking the "top" area
This CL updates how we click on the insights to toggle them; when an
insight is expanded any clicks on the actual content should not cause
the insight to close.
Bug: 351758501
Change-Id: Ia1389c38af87bb0580e3aceda46833a2d2993d14
Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/5752823
Reviewed-by: Andres Olivares <andoli@chromium.org>
Commit-Queue: Andres Olivares <andoli@chromium.org>
Auto-Submit: Jack Franklin <jacktfranklin@chromium.org>
Commit-Queue: Jack Franklin <jacktfranklin@chromium.org>
diff --git a/front_end/panels/timeline/components/insights/LCPDiscovery.ts b/front_end/panels/timeline/components/insights/LCPDiscovery.ts
index cfb54d6..c14462e 100644
--- a/front_end/panels/timeline/components/insights/LCPDiscovery.ts
+++ b/front_end/panels/timeline/components/insights/LCPDiscovery.ts
@@ -133,40 +133,42 @@
}
#renderDiscovery(imageData: ImageData): LitHtml.TemplateResult {
+ // clang-format off
return LitHtml.html`
- <div class="insights" @click=${() => this.#sidebarClicked()}>
- <${SidebarInsight.SidebarInsight.litTagName} .data=${{
- title: this.#insightTitle,
- expanded: this.#isActive(),
- } as SidebarInsight.InsightDetails}>
- <div slot="insight-description" class="insight-description">
- The LCP image should be requested as early as possible.
- <div class="insight-results">
- <div class="insight-entry">
- ${this.#adviceIcon(imageData.shouldIncreasePriorityHint)}
- fetchpriority=high applied
- </div>
- <div class="insight-entry">
- ${this.#adviceIcon(imageData.shouldPreloadImage)}
- Request is discoverable in initial document
- </div>
- <div class="insight-entry">
- ${this.#adviceIcon(imageData.shouldRemoveLazyLoading)}
- lazyload not applied
- </div>
- </div>
+ <div class="insights">
+ <${SidebarInsight.SidebarInsight.litTagName} .data=${{
+ title: this.#insightTitle,
+ expanded: this.#isActive(),
+ } as SidebarInsight.InsightDetails}
+ @insighttoggleclick=${this.#sidebarClicked}
+ >
+ <div slot="insight-description" class="insight-description">
+ The LCP image should be requested as early as possible.
+ <div class="insight-results">
+ <div class="insight-entry">
+ ${this.#adviceIcon(imageData.shouldIncreasePriorityHint)}
+ fetchpriority=high applied
+ </div>
+ <div class="insight-entry">
+ ${this.#adviceIcon(imageData.shouldPreloadImage)}
+ Request is discoverable in initial document
+ </div>
+ <div class="insight-entry">
+ ${this.#adviceIcon(imageData.shouldRemoveLazyLoading)}
+ lazyload not applied
+ </div>
</div>
- <div slot="insight-content" class="insight-content">
- <img class="element-img" data-src=${imageData.resource.args.data.url} src=${
- imageData.resource.args.data.url}>
- <div class="element-img-details">
- ${Common.ParsedURL.ParsedURL.extractName(imageData.resource.args.data.url ?? '')}
- <div class="element-img-details-size">${
- Platform.NumberUtilities.bytesToString(imageData.resource.args.data.decodedBodyLength ?? 0)}</div>
- </div>
+ </div>
+ <div slot="insight-content" class="insight-content">
+ <img class="element-img" data-src=${imageData.resource.args.data.url} src=${imageData.resource.args.data.url}>
+ <div class="element-img-details">
+ ${Common.ParsedURL.ParsedURL.extractName(imageData.resource.args.data.url ?? '')}
+ <div class="element-img-details-size">${Platform.NumberUtilities.bytesToString(imageData.resource.args.data.decodedBodyLength ?? 0)}</div>
</div>
- </${SidebarInsight.SidebarInsight}>
- </div>`;
+ </div>
+ </${SidebarInsight.SidebarInsight}>
+ </div>`;
+ // clang-format on
}
connectedCallback(): void {
diff --git a/front_end/panels/timeline/components/insights/LCPPhases.ts b/front_end/panels/timeline/components/insights/LCPPhases.ts
index f254607..2050632 100644
--- a/front_end/panels/timeline/components/insights/LCPPhases.ts
+++ b/front_end/panels/timeline/components/insights/LCPPhases.ts
@@ -216,11 +216,13 @@
#renderLCPPhases(phaseData: PhaseData[]): LitHtml.LitTemplate {
// clang-format off
return LitHtml.html`
- <div class="insights" @click=${this.#sidebarClicked}>
+ <div class="insights">
<${SidebarInsight.SidebarInsight.litTagName} .data=${{
title: this.#insightTitle,
expanded: this.#isActive(),
- } as SidebarInsight.InsightDetails}>
+ } as SidebarInsight.InsightDetails}
+ @insighttoggleclick=${this.#sidebarClicked}
+ >
<div slot="insight-description" class="insight-description">
Each
<x-link class="link" href="https://web.dev/articles/optimize-lcp#lcp-breakdown">phase has specific recommendations to improve.</x-link>
diff --git a/front_end/panels/timeline/components/insights/SidebarInsight.ts b/front_end/panels/timeline/components/insights/SidebarInsight.ts
index 72b2f03..c770605 100644
--- a/front_end/panels/timeline/components/insights/SidebarInsight.ts
+++ b/front_end/panels/timeline/components/insights/SidebarInsight.ts
@@ -55,19 +55,29 @@
void ComponentHelpers.ScheduledRender.scheduleRender(this, this.#boundRender);
}
+ #dispatchInsightToggle(): void {
+ this.dispatchEvent(new CustomEvent('insighttoggleclick'));
+ }
+
#render(): void {
let output: LitHtml.TemplateResult;
if (!this.#expanded) {
output = LitHtml.html`
<div class="insight closed">
+ <header @click=${this.#dispatchInsightToggle}>
<h3 class="insight-title">${this.#insightTitle}</h3>
+ </header>
</div>`;
} else {
output = LitHtml.html`
<div class="insight">
+ <header @click=${this.#dispatchInsightToggle}>
<h3 class="insight-title">${this.#insightTitle}</h3>
+ </header>
+ <div class="insight-body">
<slot name="insight-description"></slot>
<slot name="insight-content"></slot>
+ </div>
</div>`;
}
LitHtml.render(output, this.#shadow, {host: this});
diff --git a/front_end/panels/timeline/components/insights/sidebarInsight.css b/front_end/panels/timeline/components/insights/sidebarInsight.css
index f3a258d..e3016c8 100644
--- a/front_end/panels/timeline/components/insights/sidebarInsight.css
+++ b/front_end/panels/timeline/components/insights/sidebarInsight.css
@@ -9,20 +9,31 @@
width: auto;
height: auto;
margin: 10px 0;
- padding: 10px;
- border-radius: 3px;
+ border-radius: var(--sys-shape-corner-extra-small);
overflow: hidden;
- border: 1px solid var(--sys-color-outline);
+ border: 1px solid var(--sys-color-divider);
background-color: var(--sys-color-base);
&.closed {
- background-color: var(--sys-color-neutral-container);
+ background-color: var(--sys-color-surface3);
border: none;
}
&.closed:hover {
background-color: var(--sys-color-state-disabled-container);
}
+
+ header {
+ padding: 10px;
+
+ h3 {
+ font: var(--sys-typescale-body4-medium);
+ }
+ }
+}
+
+.insight-body {
+ padding: 0 10px;
}
.insight-title {