chrome-devtools-frontend 1.0.1602543 → 1.0.1603822

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/.agents/skills/version-control/SKILL.md +17 -2
  2. package/front_end/core/sdk/OverlayModel.ts +13 -13
  3. package/front_end/core/sdk/OverlayPersistentHighlighter.ts +13 -10
  4. package/front_end/core/sdk/RuntimeModel.ts +5 -5
  5. package/front_end/core/sdk/ServiceWorkerManager.ts +4 -2
  6. package/front_end/core/sdk/TargetManager.ts +5 -0
  7. package/front_end/core/sdk/WebMCPModel.ts +6 -0
  8. package/front_end/generated/InspectorBackendCommands.ts +3 -0
  9. package/front_end/generated/protocol-mapping.d.ts +8 -0
  10. package/front_end/generated/protocol-proxy-api.d.ts +10 -0
  11. package/front_end/generated/protocol.ts +57 -0
  12. package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +16 -5
  13. package/front_end/models/ai_assistance/data_formatters/LighthouseFormatter.snapshot.txt +60 -9
  14. package/front_end/models/ai_assistance/data_formatters/LighthouseFormatter.ts +71 -15
  15. package/front_end/models/javascript_metadata/NativeFunctions.js +6 -2
  16. package/front_end/models/lighthouse/LighthouseReporterTypes.ts +10 -8
  17. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +4 -3
  18. package/front_end/panels/ai_assistance/components/ChatMessage.ts +83 -19
  19. package/front_end/panels/ai_assistance/components/WalkthroughView.ts +30 -10
  20. package/front_end/panels/ai_assistance/components/chatMessage.css +33 -7
  21. package/front_end/panels/ai_assistance/components/walkthroughView.css +35 -5
  22. package/front_end/panels/common/ThrottlingUtils.ts +46 -0
  23. package/front_end/panels/common/common.ts +1 -0
  24. package/front_end/panels/elements/ComputedStyleWidget.ts +11 -1
  25. package/front_end/panels/elements/StandaloneStylesContainer.ts +0 -3
  26. package/front_end/panels/elements/StylePropertiesSection.ts +0 -49
  27. package/front_end/panels/elements/StylesContainer.ts +0 -1
  28. package/front_end/panels/elements/StylesSidebarPane.ts +32 -7
  29. package/front_end/panels/mobile_throttling/NetworkThrottlingSelector.ts +14 -0
  30. package/front_end/panels/profiler/ProfileView.ts +0 -9
  31. package/front_end/panels/settings/keybindsSettingsTab.css +25 -31
  32. package/front_end/panels/timeline/ThirdPartyTreeView.ts +8 -0
  33. package/front_end/panels/timeline/TimelinePanel.ts +14 -2
  34. package/front_end/panels/timeline/components/FieldSettingsDialog.ts +5 -9
  35. package/front_end/panels/timeline/components/LiveMetricsView.ts +1 -2
  36. package/front_end/panels/timeline/components/OriginMap.ts +176 -159
  37. package/front_end/panels/timeline/components/originMap.css +4 -51
  38. package/front_end/panels/timeline/thirdPartyTreeView.css +6 -0
  39. package/front_end/panels/timeline/timeline-meta.ts +11 -0
  40. package/front_end/panels/timeline/utils/Helpers.ts +5 -25
  41. package/front_end/third_party/acorn/README.chromium +1 -0
  42. package/front_end/third_party/chromium/README.chromium +1 -1
  43. package/front_end/ui/components/{list → lists}/List.ts +1 -1
  44. package/front_end/ui/components/{list → lists}/list.css +0 -1
  45. package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +3 -3
  46. package/package.json +1 -1
  47. /package/front_end/ui/components/{list → lists}/lists.ts +0 -0
@@ -1003,7 +1003,7 @@ export const NativeFunctions = [
1003
1003
  {
1004
1004
  name: "addEventListener",
1005
1005
  signatures: [["type","listener","?options"]],
1006
- receivers: ["AbortSignal","SharedWorker","Worker","ServiceWorker","Animation","AudioBufferSourceNode","AudioContext","AudioDecoder","AudioEncoder","AudioScheduledSourceNode","AudioWorkletNode","BaseAudioContext","BroadcastChannel","CSSAnimation","CSSTransition","CanvasCaptureMediaStreamTrack","ConstantSourceNode","CookieStore","Document","Element","EventSource","FileReader","FontFaceSet","Window","HTMLElement","MathMLElement","SVGElement","HTMLAnchorElement","HTMLAreaElement","HTMLAudioElement","HTMLBRElement","HTMLBaseElement","HTMLBodyElement","HTMLButtonElement","HTMLCanvasElement","HTMLDListElement","HTMLDataElement","HTMLDataListElement","HTMLDetailsElement","HTMLDialogElement","HTMLDirectoryElement","HTMLDivElement","HTMLDocument","HTMLEmbedElement","HTMLFieldSetElement","HTMLFontElement","HTMLFormElement","HTMLFrameElement","HTMLFrameSetElement","HTMLHRElement","HTMLHeadElement","HTMLHeadingElement","HTMLHtmlElement","HTMLIFrameElement","HTMLImageElement","HTMLInputElement","HTMLLIElement","HTMLLabelElement","HTMLLegendElement","HTMLLinkElement","HTMLMapElement","HTMLMarqueeElement","HTMLMediaElement","HTMLMenuElement","HTMLMetaElement","HTMLMeterElement","HTMLModElement","HTMLOListElement","HTMLObjectElement","HTMLOptGroupElement","HTMLOptionElement","HTMLOutputElement","HTMLParagraphElement","HTMLParamElement","HTMLPictureElement","HTMLPreElement","HTMLProgressElement","HTMLQuoteElement","HTMLScriptElement","HTMLSelectElement","HTMLSlotElement","HTMLSourceElement","HTMLSpanElement","HTMLStyleElement","HTMLTableCaptionElement","HTMLTableCellElement","HTMLTableColElement","HTMLTableDataCellElement","HTMLTableElement","HTMLTableHeaderCellElement","HTMLTableRowElement","HTMLTableSectionElement","HTMLTemplateElement","HTMLTextAreaElement","HTMLTimeElement","HTMLTitleElement","HTMLTrackElement","HTMLUListElement","HTMLUnknownElement","HTMLVideoElement","IDBDatabase","IDBOpenDBRequest","IDBRequest","IDBTransaction","MIDIAccess","MIDIInput","MIDIOutput","MIDIPort","MediaDevices","MediaKeySession","MediaQueryList","MediaRecorder","MediaSource","MediaStream","MediaStreamTrack","MessageEventTarget","MessagePort","NavigationHistoryEntry","Notification","OfflineAudioContext","OffscreenCanvas","OscillatorNode","PaymentRequest","PaymentResponse","Performance","PermissionStatus","PictureInPictureWindow","RTCDTMFSender","RTCDataChannel","RTCDtlsTransport","RTCIceTransport","RTCPeerConnection","RTCSctpTransport","RemotePlayback","SVGAElement","SVGAnimateElement","SVGAnimateMotionElement","SVGAnimateTransformElement","SVGAnimationElement","SVGCircleElement","SVGClipPathElement","SVGComponentTransferFunctionElement","SVGDefsElement","SVGDescElement","SVGEllipseElement","SVGFEBlendElement","SVGFEColorMatrixElement","SVGFEComponentTransferElement","SVGFECompositeElement","SVGFEConvolveMatrixElement","SVGFEDiffuseLightingElement","SVGFEDisplacementMapElement","SVGFEDistantLightElement","SVGFEDropShadowElement","SVGFEFloodElement","SVGFEFuncAElement","SVGFEFuncBElement","SVGFEFuncGElement","SVGFEFuncRElement","SVGFEGaussianBlurElement","SVGFEImageElement","SVGFEMergeElement","SVGFEMergeNodeElement","SVGFEMorphologyElement","SVGFEOffsetElement","SVGFEPointLightElement","SVGFESpecularLightingElement","SVGFESpotLightElement","SVGFETileElement","SVGFETurbulenceElement","SVGFilterElement","SVGForeignObjectElement","SVGGElement","SVGGeometryElement","SVGGradientElement","SVGGraphicsElement","SVGImageElement","SVGLineElement","SVGLinearGradientElement","SVGMPathElement","SVGMarkerElement","SVGMaskElement","SVGMetadataElement","SVGPathElement","SVGPatternElement","SVGPolygonElement","SVGPolylineElement","SVGRadialGradientElement","SVGRectElement","SVGSVGElement","SVGScriptElement","SVGSetElement","SVGStopElement","SVGStyleElement","SVGSwitchElement","SVGSymbolElement","SVGTSpanElement","SVGTextContentElement","SVGTextElement","SVGTextPathElement","SVGTextPositioningElement","SVGTitleElement","SVGUseElement","SVGViewElement","ScreenOrientation","ScriptProcessorNode","ServiceWorkerContainer","ServiceWorkerRegistration","ShadowRoot","SourceBuffer","SourceBufferList","SpeechSynthesis","SpeechSynthesisUtterance","TextTrack","TextTrackCue","TextTrackList","VTTCue","VideoDecoder","VideoEncoder","VisualViewport","WakeLockSentinel","WebSocket","XMLDocument","XMLHttpRequest","XMLHttpRequestEventTarget","XMLHttpRequestUpload","DedicatedWorkerGlobalScope","ServiceWorkerGlobalScope","SharedWorkerGlobalScope","WorkerGlobalScope","Highlight"]
1006
+ receivers: ["AbortSignal","SharedWorker","Worker","ServiceWorker","Animation","AudioBufferSourceNode","AudioContext","AudioDecoder","AudioEncoder","AudioScheduledSourceNode","AudioWorkletNode","BaseAudioContext","BroadcastChannel","CSSAnimation","CSSTransition","CanvasCaptureMediaStreamTrack","ConstantSourceNode","CookieStore","Document","Element","EventSource","FileReader","FontFaceSet","Window","HTMLElement","MathMLElement","SVGElement","HTMLAnchorElement","HTMLAreaElement","HTMLAudioElement","HTMLBRElement","HTMLBaseElement","HTMLBodyElement","HTMLButtonElement","HTMLCanvasElement","HTMLDListElement","HTMLDataElement","HTMLDataListElement","HTMLDetailsElement","HTMLDialogElement","HTMLDirectoryElement","HTMLDivElement","HTMLDocument","HTMLEmbedElement","HTMLFieldSetElement","HTMLFontElement","HTMLFormElement","HTMLFrameElement","HTMLFrameSetElement","HTMLHRElement","HTMLHeadElement","HTMLHeadingElement","HTMLHtmlElement","HTMLIFrameElement","HTMLImageElement","HTMLInputElement","HTMLLIElement","HTMLLabelElement","HTMLLegendElement","HTMLLinkElement","HTMLMapElement","HTMLMarqueeElement","HTMLMediaElement","HTMLMenuElement","HTMLMetaElement","HTMLMeterElement","HTMLModElement","HTMLOListElement","HTMLObjectElement","HTMLOptGroupElement","HTMLOptionElement","HTMLOutputElement","HTMLParagraphElement","HTMLParamElement","HTMLPictureElement","HTMLPreElement","HTMLProgressElement","HTMLQuoteElement","HTMLScriptElement","HTMLSelectElement","HTMLSlotElement","HTMLSourceElement","HTMLSpanElement","HTMLStyleElement","HTMLTableCaptionElement","HTMLTableCellElement","HTMLTableColElement","HTMLTableDataCellElement","HTMLTableElement","HTMLTableHeaderCellElement","HTMLTableRowElement","HTMLTableSectionElement","HTMLTemplateElement","HTMLTextAreaElement","HTMLTimeElement","HTMLTitleElement","HTMLTrackElement","HTMLUListElement","HTMLUnknownElement","HTMLVideoElement","IDBDatabase","IDBOpenDBRequest","IDBRequest","IDBTransaction","MIDIAccess","MIDIInput","MIDIOutput","MIDIPort","MediaDevices","MediaKeySession","MediaQueryList","MediaRecorder","MediaSource","MediaStream","MediaStreamTrack","MessageEventTarget","MessagePort","NavigationHistoryEntry","Notification","OfflineAudioContext","OffscreenCanvas","OscillatorNode","PaymentRequest","PaymentResponse","Performance","PermissionStatus","PictureInPictureWindow","RTCDTMFSender","RTCDataChannel","RTCDtlsTransport","RTCIceTransport","RTCPeerConnection","RTCSctpTransport","RemotePlayback","SVGAElement","SVGAnimateElement","SVGAnimateMotionElement","SVGAnimateTransformElement","SVGAnimationElement","SVGCircleElement","SVGClipPathElement","SVGComponentTransferFunctionElement","SVGDefsElement","SVGDescElement","SVGEllipseElement","SVGFEBlendElement","SVGFEColorMatrixElement","SVGFEComponentTransferElement","SVGFECompositeElement","SVGFEConvolveMatrixElement","SVGFEDiffuseLightingElement","SVGFEDisplacementMapElement","SVGFEDistantLightElement","SVGFEDropShadowElement","SVGFEFloodElement","SVGFEFuncAElement","SVGFEFuncBElement","SVGFEFuncGElement","SVGFEFuncRElement","SVGFEGaussianBlurElement","SVGFEImageElement","SVGFEMergeElement","SVGFEMergeNodeElement","SVGFEMorphologyElement","SVGFEOffsetElement","SVGFEPointLightElement","SVGFESpecularLightingElement","SVGFESpotLightElement","SVGFETileElement","SVGFETurbulenceElement","SVGFilterElement","SVGForeignObjectElement","SVGGElement","SVGGeometryElement","SVGGradientElement","SVGGraphicsElement","SVGImageElement","SVGLineElement","SVGLinearGradientElement","SVGMPathElement","SVGMarkerElement","SVGMaskElement","SVGMetadataElement","SVGPathElement","SVGPatternElement","SVGPolygonElement","SVGPolylineElement","SVGRadialGradientElement","SVGRectElement","SVGSVGElement","SVGScriptElement","SVGSetElement","SVGStopElement","SVGStyleElement","SVGSwitchElement","SVGSymbolElement","SVGTSpanElement","SVGTextContentElement","SVGTextElement","SVGTextPathElement","SVGTextPositioningElement","SVGTitleElement","SVGUseElement","SVGViewElement","ScreenOrientation","ScriptProcessorNode","ServiceWorkerContainer","ServiceWorkerRegistration","ShadowRoot","SourceBuffer","SourceBufferList","SpeechSynthesis","SpeechSynthesisUtterance","TextTrack","TextTrackCue","TextTrackList","VTTCue","VideoDecoder","VideoEncoder","VisualViewport","WakeLockSentinel","WebSocket","XMLDocument","XMLHttpRequest","XMLHttpRequestEventTarget","XMLHttpRequestUpload","DedicatedWorkerGlobalScope","ServiceWorkerGlobalScope","SharedWorkerGlobalScope","WorkerGlobalScope"]
1007
1007
  },
1008
1008
  {
1009
1009
  name: "addEventListener",
@@ -1013,7 +1013,7 @@ export const NativeFunctions = [
1013
1013
  {
1014
1014
  name: "removeEventListener",
1015
1015
  signatures: [["type","listener","?options"]],
1016
- receivers: ["AbortSignal","SharedWorker","Worker","ServiceWorker","Animation","AudioBufferSourceNode","AudioContext","AudioDecoder","AudioEncoder","AudioScheduledSourceNode","AudioWorkletNode","BaseAudioContext","BroadcastChannel","CSSAnimation","CSSTransition","CanvasCaptureMediaStreamTrack","ConstantSourceNode","CookieStore","Document","Element","EventSource","FileReader","FontFaceSet","Window","HTMLElement","MathMLElement","SVGElement","HTMLAnchorElement","HTMLAreaElement","HTMLAudioElement","HTMLBRElement","HTMLBaseElement","HTMLBodyElement","HTMLButtonElement","HTMLCanvasElement","HTMLDListElement","HTMLDataElement","HTMLDataListElement","HTMLDetailsElement","HTMLDialogElement","HTMLDirectoryElement","HTMLDivElement","HTMLDocument","HTMLEmbedElement","HTMLFieldSetElement","HTMLFontElement","HTMLFormElement","HTMLFrameElement","HTMLFrameSetElement","HTMLHRElement","HTMLHeadElement","HTMLHeadingElement","HTMLHtmlElement","HTMLIFrameElement","HTMLImageElement","HTMLInputElement","HTMLLIElement","HTMLLabelElement","HTMLLegendElement","HTMLLinkElement","HTMLMapElement","HTMLMarqueeElement","HTMLMediaElement","HTMLMenuElement","HTMLMetaElement","HTMLMeterElement","HTMLModElement","HTMLOListElement","HTMLObjectElement","HTMLOptGroupElement","HTMLOptionElement","HTMLOutputElement","HTMLParagraphElement","HTMLParamElement","HTMLPictureElement","HTMLPreElement","HTMLProgressElement","HTMLQuoteElement","HTMLScriptElement","HTMLSelectElement","HTMLSlotElement","HTMLSourceElement","HTMLSpanElement","HTMLStyleElement","HTMLTableCaptionElement","HTMLTableCellElement","HTMLTableColElement","HTMLTableDataCellElement","HTMLTableElement","HTMLTableHeaderCellElement","HTMLTableRowElement","HTMLTableSectionElement","HTMLTemplateElement","HTMLTextAreaElement","HTMLTimeElement","HTMLTitleElement","HTMLTrackElement","HTMLUListElement","HTMLUnknownElement","HTMLVideoElement","IDBDatabase","IDBOpenDBRequest","IDBRequest","IDBTransaction","MIDIAccess","MIDIInput","MIDIOutput","MIDIPort","MediaDevices","MediaKeySession","MediaQueryList","MediaRecorder","MediaSource","MediaStream","MediaStreamTrack","MessageEventTarget","MessagePort","NavigationHistoryEntry","Notification","OfflineAudioContext","OffscreenCanvas","OscillatorNode","PaymentRequest","PaymentResponse","Performance","PermissionStatus","PictureInPictureWindow","RTCDTMFSender","RTCDataChannel","RTCDtlsTransport","RTCIceTransport","RTCPeerConnection","RTCSctpTransport","RemotePlayback","SVGAElement","SVGAnimateElement","SVGAnimateMotionElement","SVGAnimateTransformElement","SVGAnimationElement","SVGCircleElement","SVGClipPathElement","SVGComponentTransferFunctionElement","SVGDefsElement","SVGDescElement","SVGEllipseElement","SVGFEBlendElement","SVGFEColorMatrixElement","SVGFEComponentTransferElement","SVGFECompositeElement","SVGFEConvolveMatrixElement","SVGFEDiffuseLightingElement","SVGFEDisplacementMapElement","SVGFEDistantLightElement","SVGFEDropShadowElement","SVGFEFloodElement","SVGFEFuncAElement","SVGFEFuncBElement","SVGFEFuncGElement","SVGFEFuncRElement","SVGFEGaussianBlurElement","SVGFEImageElement","SVGFEMergeElement","SVGFEMergeNodeElement","SVGFEMorphologyElement","SVGFEOffsetElement","SVGFEPointLightElement","SVGFESpecularLightingElement","SVGFESpotLightElement","SVGFETileElement","SVGFETurbulenceElement","SVGFilterElement","SVGForeignObjectElement","SVGGElement","SVGGeometryElement","SVGGradientElement","SVGGraphicsElement","SVGImageElement","SVGLineElement","SVGLinearGradientElement","SVGMPathElement","SVGMarkerElement","SVGMaskElement","SVGMetadataElement","SVGPathElement","SVGPatternElement","SVGPolygonElement","SVGPolylineElement","SVGRadialGradientElement","SVGRectElement","SVGSVGElement","SVGScriptElement","SVGSetElement","SVGStopElement","SVGStyleElement","SVGSwitchElement","SVGSymbolElement","SVGTSpanElement","SVGTextContentElement","SVGTextElement","SVGTextPathElement","SVGTextPositioningElement","SVGTitleElement","SVGUseElement","SVGViewElement","ScreenOrientation","ScriptProcessorNode","ServiceWorkerContainer","ServiceWorkerRegistration","ShadowRoot","SourceBuffer","SourceBufferList","SpeechSynthesis","SpeechSynthesisUtterance","TextTrack","TextTrackCue","TextTrackList","VTTCue","VideoDecoder","VideoEncoder","VisualViewport","WakeLockSentinel","WebSocket","XMLDocument","XMLHttpRequest","XMLHttpRequestEventTarget","XMLHttpRequestUpload","DedicatedWorkerGlobalScope","ServiceWorkerGlobalScope","SharedWorkerGlobalScope","WorkerGlobalScope","Highlight"]
1016
+ receivers: ["AbortSignal","SharedWorker","Worker","ServiceWorker","Animation","AudioBufferSourceNode","AudioContext","AudioDecoder","AudioEncoder","AudioScheduledSourceNode","AudioWorkletNode","BaseAudioContext","BroadcastChannel","CSSAnimation","CSSTransition","CanvasCaptureMediaStreamTrack","ConstantSourceNode","CookieStore","Document","Element","EventSource","FileReader","FontFaceSet","Window","HTMLElement","MathMLElement","SVGElement","HTMLAnchorElement","HTMLAreaElement","HTMLAudioElement","HTMLBRElement","HTMLBaseElement","HTMLBodyElement","HTMLButtonElement","HTMLCanvasElement","HTMLDListElement","HTMLDataElement","HTMLDataListElement","HTMLDetailsElement","HTMLDialogElement","HTMLDirectoryElement","HTMLDivElement","HTMLDocument","HTMLEmbedElement","HTMLFieldSetElement","HTMLFontElement","HTMLFormElement","HTMLFrameElement","HTMLFrameSetElement","HTMLHRElement","HTMLHeadElement","HTMLHeadingElement","HTMLHtmlElement","HTMLIFrameElement","HTMLImageElement","HTMLInputElement","HTMLLIElement","HTMLLabelElement","HTMLLegendElement","HTMLLinkElement","HTMLMapElement","HTMLMarqueeElement","HTMLMediaElement","HTMLMenuElement","HTMLMetaElement","HTMLMeterElement","HTMLModElement","HTMLOListElement","HTMLObjectElement","HTMLOptGroupElement","HTMLOptionElement","HTMLOutputElement","HTMLParagraphElement","HTMLParamElement","HTMLPictureElement","HTMLPreElement","HTMLProgressElement","HTMLQuoteElement","HTMLScriptElement","HTMLSelectElement","HTMLSlotElement","HTMLSourceElement","HTMLSpanElement","HTMLStyleElement","HTMLTableCaptionElement","HTMLTableCellElement","HTMLTableColElement","HTMLTableDataCellElement","HTMLTableElement","HTMLTableHeaderCellElement","HTMLTableRowElement","HTMLTableSectionElement","HTMLTemplateElement","HTMLTextAreaElement","HTMLTimeElement","HTMLTitleElement","HTMLTrackElement","HTMLUListElement","HTMLUnknownElement","HTMLVideoElement","IDBDatabase","IDBOpenDBRequest","IDBRequest","IDBTransaction","MIDIAccess","MIDIInput","MIDIOutput","MIDIPort","MediaDevices","MediaKeySession","MediaQueryList","MediaRecorder","MediaSource","MediaStream","MediaStreamTrack","MessageEventTarget","MessagePort","NavigationHistoryEntry","Notification","OfflineAudioContext","OffscreenCanvas","OscillatorNode","PaymentRequest","PaymentResponse","Performance","PermissionStatus","PictureInPictureWindow","RTCDTMFSender","RTCDataChannel","RTCDtlsTransport","RTCIceTransport","RTCPeerConnection","RTCSctpTransport","RemotePlayback","SVGAElement","SVGAnimateElement","SVGAnimateMotionElement","SVGAnimateTransformElement","SVGAnimationElement","SVGCircleElement","SVGClipPathElement","SVGComponentTransferFunctionElement","SVGDefsElement","SVGDescElement","SVGEllipseElement","SVGFEBlendElement","SVGFEColorMatrixElement","SVGFEComponentTransferElement","SVGFECompositeElement","SVGFEConvolveMatrixElement","SVGFEDiffuseLightingElement","SVGFEDisplacementMapElement","SVGFEDistantLightElement","SVGFEDropShadowElement","SVGFEFloodElement","SVGFEFuncAElement","SVGFEFuncBElement","SVGFEFuncGElement","SVGFEFuncRElement","SVGFEGaussianBlurElement","SVGFEImageElement","SVGFEMergeElement","SVGFEMergeNodeElement","SVGFEMorphologyElement","SVGFEOffsetElement","SVGFEPointLightElement","SVGFESpecularLightingElement","SVGFESpotLightElement","SVGFETileElement","SVGFETurbulenceElement","SVGFilterElement","SVGForeignObjectElement","SVGGElement","SVGGeometryElement","SVGGradientElement","SVGGraphicsElement","SVGImageElement","SVGLineElement","SVGLinearGradientElement","SVGMPathElement","SVGMarkerElement","SVGMaskElement","SVGMetadataElement","SVGPathElement","SVGPatternElement","SVGPolygonElement","SVGPolylineElement","SVGRadialGradientElement","SVGRectElement","SVGSVGElement","SVGScriptElement","SVGSetElement","SVGStopElement","SVGStyleElement","SVGSwitchElement","SVGSymbolElement","SVGTSpanElement","SVGTextContentElement","SVGTextElement","SVGTextPathElement","SVGTextPositioningElement","SVGTitleElement","SVGUseElement","SVGViewElement","ScreenOrientation","ScriptProcessorNode","ServiceWorkerContainer","ServiceWorkerRegistration","ShadowRoot","SourceBuffer","SourceBufferList","SpeechSynthesis","SpeechSynthesisUtterance","TextTrack","TextTrackCue","TextTrackList","VTTCue","VideoDecoder","VideoEncoder","VisualViewport","WakeLockSentinel","WebSocket","XMLDocument","XMLHttpRequest","XMLHttpRequestEventTarget","XMLHttpRequestUpload","DedicatedWorkerGlobalScope","ServiceWorkerGlobalScope","SharedWorkerGlobalScope","WorkerGlobalScope"]
1017
1017
  },
1018
1018
  {
1019
1019
  name: "removeEventListener",
@@ -2895,6 +2895,10 @@ export const NativeFunctions = [
2895
2895
  signatures: [["?detailsPromise"]],
2896
2896
  receivers: ["PaymentRequest"]
2897
2897
  },
2898
+ {
2899
+ name: "attachInternals",
2900
+ signatures: [["?options"]]
2901
+ },
2898
2902
  {
2899
2903
  name: "showPopover",
2900
2904
  signatures: [["?options"]]
@@ -82,10 +82,17 @@ export interface ReportJSON {
82
82
  export type DetailsJSON =
83
83
  |TableDetailsJSON|OpportunityDetailsJSON|FilmstripDetailsJSON|ScreenshotDetailsJSON|DebugDataDetailsJSON;
84
84
 
85
+ export interface SubItemsJSON {
86
+ type: 'subitems';
87
+ items: Array<Record<string, TableItemValue>>;
88
+ }
89
+
90
+ export type TableItem = Record<string, TableItemValue|SubItemsJSON|undefined>;
91
+
85
92
  export interface TableDetailsJSON {
86
93
  type: 'table';
87
94
  headings: TableHeadingJSON[];
88
- items: Array<Record<string, TableItemValue>>;
95
+ items: TableItem[];
89
96
  summary?: OpportunitySummary;
90
97
  }
91
98
 
@@ -96,7 +103,7 @@ export interface TableHeadingJSON {
96
103
  itemType?: string;
97
104
  subItemsHeading?: {
98
105
  key: string,
99
- valueType: string,
106
+ valueType?: string,
100
107
  };
101
108
  }
102
109
 
@@ -109,12 +116,7 @@ export type TableItemValue =|string|number|NodeDetailsJSON|SourceLocationDetails
109
116
  export interface OpportunityDetailsJSON {
110
117
  type: 'opportunity';
111
118
  headings: TableHeadingJSON[];
112
- items: Array<{
113
- url: string,
114
- wastedBytes?: number,
115
- wastedMs?: number,
116
- totalBytes?: number, [key: string]: unknown,
117
- }>;
119
+ items: TableItem[];
118
120
  overallSavingsMs: number;
119
121
  overallSavingsBytes?: number;
120
122
  }
@@ -821,7 +821,7 @@ export class AiAssistancePanel extends UI.Panel.Panel {
821
821
  return;
822
822
  }
823
823
  // If the UI changed, we reset the visibility of the AI Walkthrough.
824
- this.#clearWalkthrough();
824
+ this.#resetWalkthrough();
825
825
  this.#walkthrough.isInlined = isNarrow;
826
826
  this.requestUpdate();
827
827
  }
@@ -1563,7 +1563,7 @@ export class AiAssistancePanel extends UI.Panel.Panel {
1563
1563
  this.#updateConversationState();
1564
1564
  }
1565
1565
 
1566
- #clearWalkthrough(): void {
1566
+ #resetWalkthrough(): void {
1567
1567
  this.#walkthrough.isExpanded = false;
1568
1568
  this.#walkthrough.activeMessage = null;
1569
1569
  }
@@ -1574,7 +1574,7 @@ export class AiAssistancePanel extends UI.Panel.Panel {
1574
1574
  }
1575
1575
 
1576
1576
  // Ensure we clear the walkthrough so it doesn't hold onto a chat that is about to be deleted.
1577
- this.#clearWalkthrough();
1577
+ this.#resetWalkthrough();
1578
1578
 
1579
1579
  void AiAssistanceModel.AiHistoryStorage.AiHistoryStorage.instance().deleteHistoryEntry(this.#conversation.id);
1580
1580
  this.#updateConversationState();
@@ -1599,6 +1599,7 @@ export class AiAssistancePanel extends UI.Panel.Panel {
1599
1599
 
1600
1600
  #handleNewChatRequest(): void {
1601
1601
  this.#updateConversationState();
1602
+ this.#resetWalkthrough();
1602
1603
  UI.ARIAUtils.LiveAnnouncer.alert(i18nString(UIStrings.newChatCreated));
1603
1604
 
1604
1605
  if (Annotations.AnnotationRepository.annotationsEnabled()) {
@@ -18,6 +18,7 @@ import type {
18
18
  import * as AiAssistanceModel from '../../../models/ai_assistance/ai_assistance.js';
19
19
  import * as ComputedStyle from '../../../models/computed_style/computed_style.js';
20
20
  import * as Trace from '../../../models/trace/trace.js';
21
+ import * as PanelsCommon from '../../../panels/common/common.js';
21
22
  import * as Marked from '../../../third_party/marked/marked.js';
22
23
  import * as Buttons from '../../../ui/components/buttons/buttons.js';
23
24
  import * as Input from '../../../ui/components/input/input.js';
@@ -48,7 +49,10 @@ const SCROLL_ROUNDING_OFFSET = 1;
48
49
  * Strings that don't need to be translated at this time.
49
50
  */
50
51
  const UIStringsNotTranslate = {
51
-
52
+ /**
53
+ * @description Text used in the button to close an open walkthrough
54
+ */
55
+ closeAgentWalkthrough: 'Close agent walkthrough',
52
56
  /**
53
57
  * @description The title of the button that allows submitting positive
54
58
  * feedback about the response for AI assistance.
@@ -182,7 +186,23 @@ const UIStringsNotTranslate = {
182
186
  /**
183
187
  * @description Title used for revealing the performance trace.
184
188
  */
185
- revealTrace: 'Reveal trace'
189
+ revealTrace: 'Reveal trace',
190
+ /**
191
+ * @description Title for the core web vitals widget.
192
+ */
193
+ coreVitals: 'Core Web Vitals',
194
+ /**
195
+ * @description Title for the LCP breakdown widget.
196
+ */
197
+ lcpBreakdown: 'LCP breakdown',
198
+ /**
199
+ * @description Title for the LCP element widget.
200
+ */
201
+ lcpElement: 'LCP element',
202
+ /**
203
+ * @description Title for the performance summary widget.
204
+ */
205
+ performanceSummary: 'Performance summary'
186
206
  } as const;
187
207
 
188
208
  export interface Step {
@@ -496,18 +516,25 @@ function renderWalkthroughSidebarButton(
496
516
  }
497
517
 
498
518
  const hasOneStepWithWidget = steps.some(step => step.widgets?.length);
499
- const title = walkthroughTitle({
519
+ const isOpen = input.message === input.walkthrough.activeMessage;
520
+
521
+ const title = isOpen ? lockedString(UIStringsNotTranslate.closeAgentWalkthrough) : walkthroughTitle({
500
522
  isLoading: input.isLoading,
501
523
  hasWidgets: hasOneStepWithWidget,
502
524
  lastStep,
503
525
  });
504
526
 
527
+ // The button should be tonal when there are widgets, but we only
528
+ // want to change it visually at the end once everything has stopped
529
+ // loading.
530
+ const variant = hasOneStepWithWidget && !input.isLoading ? Buttons.Button.Variant.TONAL : Buttons.Button.Variant.TEXT;
531
+
505
532
  // clang-format off
506
533
  return html`
507
534
  <div class="walkthrough-toggle-container">
508
535
  ${input.isLoading ? html`<devtools-spinner></devtools-spinner>` : Lit.nothing}
509
536
  <devtools-button
510
- .variant=${Buttons.Button.Variant.OUTLINED}
537
+ .variant=${variant}
511
538
  .size=${Buttons.Button.Size.SMALL}
512
539
  .title=${lastStep.isLoading ? titleForStep(lastStep) : lockedString(UIStringsNotTranslate.showThinking)}
513
540
  .jslogContext=${walkthrough.isExpanded ? 'ai-hide-walkthrough-sidebar' : 'ai-show-walkthrough-sidebar'}
@@ -522,7 +549,9 @@ function renderWalkthroughSidebarButton(
522
549
  walkthrough.onOpen(message as ModelChatMessage);
523
550
  }
524
551
  }}
525
- >${title}</devtools-button>
552
+ >
553
+ ${title}<devtools-icon class="chevron" .name=${'chevron-right'}></devtools-icon>
554
+ </devtools-button>
526
555
  </div>
527
556
  `;
528
557
  // clang-format on
@@ -657,7 +686,8 @@ interface WidgetMakerResponse {
657
686
  renderedWidget: Lit.LitTemplate|null;
658
687
  revealable: unknown;
659
688
  customRevealTitle?: Platform.UIString.LocalizedString;
660
- widgetName?: string;
689
+ // Can be null if the widget is only used to add the Reveal CTA.
690
+ title: Lit.LitTemplate|Platform.UIString.LocalizedString|null;
661
691
  }
662
692
 
663
693
  const nodeCache = new Map<Protocol.DOM.BackendNodeId, SDK.DOMModel.DOMNode>();
@@ -696,11 +726,20 @@ async function makeComputedStyleWidget(widgetData: ComputedStyleAiWidget): Promi
696
726
  // This disables showing the nested traces and detailed information in the widget.
697
727
  propertyTraces: null,
698
728
  allowUserControl: false,
699
- filterText: new RegExp(widgetData.data.properties.join('|'), 'i')
729
+ filterText: new RegExp(widgetData.data.properties.join('|'), 'i'),
730
+ enableNarrowViewResizing: false,
700
731
  })}></devtools-widget>`;
701
732
  // clang-format on
702
733
 
703
- return {renderedWidget, revealable: new Elements.ElementsPanel.NodeComputedStyles(domNodeForId)};
734
+ return {
735
+ renderedWidget,
736
+ revealable: new Elements.ElementsPanel.NodeComputedStyles(domNodeForId),
737
+ title: html`<devtools-widget
738
+ ${widget(PanelsCommon.DOMLinkifier.DOMNodeLink, {
739
+ node: domNodeForId,
740
+ })}
741
+ ></devtools-widget>`,
742
+ };
704
743
  }
705
744
 
706
745
  async function makeCoreVitalsWidget(widgetData: CoreVitalsAiWidget): Promise<WidgetMakerResponse|null> {
@@ -710,7 +749,11 @@ async function makeCoreVitalsWidget(widgetData: CoreVitalsAiWidget): Promise<Wid
710
749
  </devtools-widget>`;
711
750
  // clang-format on
712
751
 
713
- return {renderedWidget, revealable: new TimelineUtils.Helpers.RevealableCoreVitals(widgetData.data.insightSetKey)};
752
+ return {
753
+ renderedWidget,
754
+ revealable: new TimelineUtils.Helpers.RevealableCoreVitals(widgetData.data.insightSetKey),
755
+ title: lockedString(UIStringsNotTranslate.coreVitals),
756
+ };
714
757
  }
715
758
 
716
759
  async function makeStylePropertiesWidget(widgetData: StylePropertiesAiWidget): Promise<WidgetMakerResponse|null> {
@@ -729,7 +772,15 @@ async function makeStylePropertiesWidget(widgetData: StylePropertiesAiWidget): P
729
772
  </devtools-widget>`;
730
773
  // clang-format on
731
774
 
732
- return {renderedWidget, revealable: domNodeForId};
775
+ return {
776
+ renderedWidget,
777
+ revealable: domNodeForId,
778
+ title: html`<devtools-widget
779
+ ${widget(PanelsCommon.DOMLinkifier.DOMNodeLink, {
780
+ node: domNodeForId,
781
+ })}
782
+ ></devtools-widget>`,
783
+ };
733
784
  }
734
785
 
735
786
  async function makeLcpBreakdownWidget(widgetData: LcpBreakdownAiWidget): Promise<WidgetMakerResponse|null> {
@@ -747,7 +798,11 @@ async function makeLcpBreakdownWidget(widgetData: LcpBreakdownAiWidget): Promise
747
798
  })}></devtools-widget>`;
748
799
  // clang-format on
749
800
 
750
- return {renderedWidget, revealable: new TimelineUtils.Helpers.RevealableInsight(insight)};
801
+ return {
802
+ renderedWidget,
803
+ revealable: new TimelineUtils.Helpers.RevealableInsight(insight),
804
+ title: lockedString(UIStringsNotTranslate.lcpBreakdown),
805
+ };
751
806
  }
752
807
 
753
808
  function renderWidgetResponse(response: WidgetMakerResponse|null): Lit.LitTemplate {
@@ -768,19 +823,21 @@ function renderWidgetResponse(response: WidgetMakerResponse|null): Lit.LitTempla
768
823
  });
769
824
 
770
825
  const revealButton = html`
771
- <devtools-button class="widget-reveal"
772
- .iconName=${'tab-move'}
826
+ <devtools-button class="widget-reveal-button"
773
827
  .variant=${Buttons.Button.Variant.TEXT}
774
828
  @click=${onReveal}
775
- >${response.customRevealTitle ?? lockedString(UIStringsNotTranslate.reveal)}</devtools-button>
829
+ >
830
+ ${response.customRevealTitle ?? lockedString(UIStringsNotTranslate.reveal)}
831
+ <devtools-icon name='tab-move'></devtools-icon>
832
+ </devtools-button>
776
833
  `;
777
834
 
778
835
  // clang-format off
779
836
  return html`
780
837
  <div class=${classes}>
781
- ${response.widgetName ? html`
838
+ ${response.title ? html`
782
839
  <div class="widget-header">
783
- <div class="widget-name">${response.widgetName}</div>
840
+ <div class="widget-name">${response.title}</div>
784
841
  <div class="widget-reveal-container">
785
842
  ${revealButton}
786
843
  </div>
@@ -791,7 +848,7 @@ function renderWidgetResponse(response: WidgetMakerResponse|null): Lit.LitTempla
791
848
  ${response.renderedWidget}
792
849
  </div>` : Lit.nothing
793
850
  }
794
- ${!response.widgetName ? html`
851
+ ${!response.title ? html`
795
852
  <div class="widget-reveal-container">
796
853
  ${revealButton}
797
854
  </div>
@@ -804,6 +861,7 @@ function renderWidgetResponse(response: WidgetMakerResponse|null): Lit.LitTempla
804
861
  async function makePerformanceTraceWidget(widgetData: PerformanceTraceAiWidget): Promise<WidgetMakerResponse|null> {
805
862
  return {
806
863
  renderedWidget: null,
864
+ title: null,
807
865
  revealable: new Timeline.TimelinePanel.ParsedTraceRevealable(widgetData.data.parsedTrace),
808
866
  customRevealTitle: lockedString(UIStringsNotTranslate.revealTrace),
809
867
  };
@@ -863,7 +921,7 @@ async function makeDomTreeWidget(widgetData: DomTreeAiWidget): Promise<WidgetMak
863
921
  return {
864
922
  renderedWidget,
865
923
  revealable: new SDK.DOMModel.DeferredDOMNode(root.domModel().target(), root.backendNodeId()),
866
- widgetName: 'LCP element',
924
+ title: lockedString(UIStringsNotTranslate.lcpElement),
867
925
  };
868
926
  }
869
927
 
@@ -1359,6 +1417,7 @@ async function makeTimelineRangeSummaryWidget(widgetData: TimelineRangeSummaryAi
1359
1417
  const thirdPartyTree = new Timeline.ThirdPartyTreeView.ThirdPartyTreeViewWidget();
1360
1418
  const mapper = new Trace.EntityMapper.EntityMapper(parsedTrace);
1361
1419
  thirdPartyTree.setModelWithEvents(eventsArray, parsedTrace, mapper);
1420
+ thirdPartyTree.updateContents(Timeline.TimelineSelection.selectionFromRangeMicroSeconds(bounds.min, bounds.max));
1362
1421
  thirdPartyTree.refreshTree(true);
1363
1422
 
1364
1423
  // clang-format off
@@ -1371,11 +1430,16 @@ async function makeTimelineRangeSummaryWidget(widgetData: TimelineRangeSummaryAi
1371
1430
  startTime: Trace.Helpers.Timing.microToMilli(bounds.min),
1372
1431
  endTime: Trace.Helpers.Timing.microToMilli(bounds.max),
1373
1432
  thirdPartyTreeTemplate: html`<devtools-performance-third-party-tree-view
1433
+ max-rows="10"
1374
1434
  .treeView=${thirdPartyTree}></devtools-performance-third-party-tree-view>`,
1375
1435
  } as TimelineComponents.TimelineRangeSummaryView.TimelineRangeSummaryViewData,
1376
1436
  })}
1377
1437
  ></devtools-widget>`;
1378
1438
  // clang-format on
1379
1439
 
1380
- return {renderedWidget: template, revealable: null};
1440
+ return {
1441
+ renderedWidget: template,
1442
+ revealable: new TimelineUtils.Helpers.RevealableTimeRange(bounds),
1443
+ title: lockedString(UIStringsNotTranslate.performanceSummary),
1444
+ };
1381
1445
  }
@@ -90,10 +90,10 @@ function renderInlineWalkthrough(input: ViewInput, stepsOutput: Lit.LitTemplate,
90
90
  // clang-format off
91
91
  return html`
92
92
  <details class="walkthrough-inline" ?open=${input.isExpanded} @toggle=${onToggle}>
93
- <summary>
93
+ <summary ?data-has-widgets=${!input.isLoading && hasWidgets}>
94
94
  ${input.isLoading ? html`<devtools-spinner></devtools-spinner>` : Lit.nothing}
95
95
  ${walkthroughTitle({isLoading: input.isLoading, lastStep, hasWidgets})}
96
- <devtools-icon name="chevron-down"></devtools-icon>
96
+ <devtools-icon name="chevron-right"></devtools-icon>
97
97
  </summary>
98
98
  ${stepsOutput}
99
99
  </details>
@@ -182,8 +182,6 @@ export class WalkthroughView extends UI.Widget.Widget {
182
182
  #view: View;
183
183
 
184
184
  #message: ModelChatMessage|null = null;
185
- // TODO(b/487921187): fix loading state - also unsure if we need this vs
186
- // looking at the loading state in the message's steps.
187
185
  #isLoading = false;
188
186
  #markdownRenderer: MarkdownLitRenderer|null = null;
189
187
  #onToggle: (isOpen: boolean) => void = () => {};
@@ -196,6 +194,7 @@ export class WalkthroughView extends UI.Widget.Widget {
196
194
 
197
195
  #output: ViewOutput = {};
198
196
  #stepsContainerResizeObserver = new ResizeObserver(() => this.#handleStepsContainerResize());
197
+ #lastStepsContainerWidth = 0;
199
198
 
200
199
  constructor(element?: HTMLElement, view: View = DEFAULT_VIEW) {
201
200
  super(element);
@@ -218,12 +217,27 @@ export class WalkthroughView extends UI.Widget.Widget {
218
217
  }
219
218
  }
220
219
 
221
- override onResize(): void {
222
- this.#handleStepsContainerResize();
223
- }
224
-
225
220
  #handleStepsContainerResize(): void {
226
- if (!this.#pinScrollToBottom) {
221
+ const width = this.#output.stepsContainer?.offsetWidth ?? 0;
222
+ /**
223
+ * If the width has changed, it's likely due to a manual resize (e.g., the
224
+ * user dragging the sidebar). In these cases, we want to avoid jumping the
225
+ * scroll position to the bottom, as it can be jarring for the user. We
226
+ * only auto-scroll if the width remains the same, meaning only the height
227
+ * has changed (likely due to new content being added).
228
+ */
229
+ if (width !== this.#lastStepsContainerWidth) {
230
+ this.#lastStepsContainerWidth = width;
231
+ return;
232
+ }
233
+
234
+ /**
235
+ * We only want to auto-scroll if the walkthrough is "live", which means it's
236
+ * currently loading. If it's not loading, it's a walkthrough for a previous
237
+ * message, and we don't want to jump the user to the bottom if they've
238
+ * scrolled away.
239
+ */
240
+ if (!this.#pinScrollToBottom || !this.#isLoading) {
227
241
  return;
228
242
  }
229
243
 
@@ -338,7 +352,13 @@ export class WalkthroughView extends UI.Widget.Widget {
338
352
 
339
353
  this.#registerResizeObservers();
340
354
 
341
- if (this.#pinScrollToBottom) {
355
+ /**
356
+ * We only want to auto-scroll if the walkthrough is "live", which means it's
357
+ * currently loading. If it's not loading, it's a walkthrough for a previous
358
+ * message, and we don't want to jump the user to the bottom if they've
359
+ * scrolled away.
360
+ */
361
+ if (this.#pinScrollToBottom && this.#isLoading) {
342
362
  this.scrollToBottom();
343
363
  }
344
364
  }
@@ -346,6 +346,13 @@
346
346
  display: flex;
347
347
  gap: var(--sys-size-4);
348
348
  align-items: center;
349
+
350
+ .chevron {
351
+ color: var(--sys-color-primary);
352
+ width: var(--sys-size-8);
353
+ height: var(--sys-size-8);
354
+ margin-left: var(--sys-size-2);
355
+ }
349
356
  }
350
357
 
351
358
 
@@ -372,18 +379,18 @@
372
379
  gap: var(--sys-size-5);
373
380
  }
374
381
 
375
-
376
382
  .widget-header {
377
383
  display: flex;
378
384
  justify-content: space-between;
385
+ height: var(--sys-size-11);
379
386
  align-items: center;
380
387
  background: var(--sys-color-surface5);
381
388
  padding: var(--sys-size-2) var(--sys-size-4);
382
- border-top-left-radius: var(--sys-shape-corner-medium);
383
- border-top-right-radius: var(--sys-shape-corner-medium);
389
+ border-top-left-radius: var(--sys-shape-corner-small);
390
+ border-top-right-radius: var(--sys-shape-corner-small);
384
391
 
385
392
  .widget-name {
386
- font: var(--sys-typescale-body3-regular);
393
+ font: var(--sys-typescale-body4-regular);
387
394
  }
388
395
 
389
396
  .widget-reveal-container {
@@ -393,10 +400,29 @@
393
400
  }
394
401
  }
395
402
 
403
+ .widget-reveal-button {
404
+ display: flex;
405
+ align-items: center;
406
+
407
+ devtools-icon {
408
+ margin-left: var(--sys-size-3);
409
+ color: var(--sys-color-primary);
410
+ width: var(--sys-size-8);
411
+ height: var(--sys-size-8);
412
+ }
413
+
414
+ }
415
+
416
+ .widget-and-revealer-container {
417
+ width: 100%;
418
+ min-width: var(--sys-size-30);
419
+ max-width: var(--sys-size-33);
420
+ }
421
+
396
422
  .widget-reveal-container {
397
423
  background: var(--sys-color-surface5);
398
- border-bottom-right-radius: var(--sys-shape-corner-medium);
399
- border-bottom-left-radius: var(--sys-shape-corner-medium);
424
+ border-bottom-right-radius: var(--sys-shape-corner-small);
425
+ border-bottom-left-radius: var(--sys-shape-corner-small);
400
426
  padding: 0 var(--sys-size-4) var(--sys-size-4) 0;
401
427
  }
402
428
 
@@ -406,7 +432,7 @@
406
432
  }
407
433
 
408
434
  .widget-content-container {
409
- padding: var(--sys-size-4);
435
+ padding: var(--sys-size-4) var(--sys-size-5);
410
436
  border-top-left-radius: var(--sys-shape-corner-medium);
411
437
  border-top-right-radius: var(--sys-shape-corner-medium);
412
438
  overflow-x: auto;
@@ -100,25 +100,45 @@
100
100
  .walkthrough-inline {
101
101
  border-radius: var(--sys-size-5);
102
102
  overflow: hidden;
103
- background-color: var(--sys-color-surface1);
103
+ background-color: var(--sys-color-surface2);
104
104
  width: fit-content;
105
105
 
106
106
  &[open] {
107
107
  width: auto;
108
+ background-color: var(--sys-color-surface1);
108
109
  }
109
110
  }
110
111
 
111
112
  .walkthrough-inline > summary {
112
113
  display: flex;
113
114
  align-items: center;
114
- padding: var(--sys-size-4) var(--sys-size-6);
115
+ padding: 0 var(--sys-size-6);
115
116
  cursor: pointer;
116
117
  background-color: transparent;
118
+ /* The same height as a DevTools Button */
119
+ height: var(--sys-size-11);
117
120
  font: var(--sys-typescale-body4-regular);
121
+ font-weight:var(--ref-typeface-weight-medium);
118
122
  user-select: none;
119
123
  list-style: none; /* Hide default triangle */
120
124
  justify-content: flex-start;
121
125
  gap: var(--sys-size-4);
126
+ color: var(--sys-color-primary);
127
+
128
+ devtools-icon {
129
+ color: var(--sys-color-primary);
130
+ }
131
+
132
+ /* Align the summary to look like the tonal button */
133
+ &[data-has-widgets] {
134
+ background: var(--sys-color-tonal-container);
135
+ color: var(--sys-color-on-tonal-container);
136
+ border-radius: var(--sys-shape-corner-full);
137
+
138
+ devtools-icon {
139
+ color: var(--sys-color-on-tonal-container);
140
+ }
141
+ }
122
142
  }
123
143
 
124
144
  .walkthrough-inline > summary::-webkit-details-marker {
@@ -131,8 +151,6 @@
131
151
 
132
152
  .walkthrough-inline .steps-container {
133
153
  padding: var(--sys-size-6);
134
- max-height: 300px; /* Limit height for inline view */
135
- overflow-y: auto;
136
154
  border-top: 1px solid var(--sys-color-divider);
137
155
  background-color: transparent;
138
156
  }
@@ -141,9 +159,21 @@
141
159
  width: var(--sys-size-8);
142
160
  height: var(--sys-size-8);
143
161
  transition: transform 0.2s;
162
+ margin-left: auto;
163
+ }
164
+
165
+ .walkthrough-inline[open] > summary {
166
+ border-radius: var(--sys-shape-corner-medium-small);
167
+ border-bottom-right-radius: 0;
168
+ border-bottom-left-radius: 0;
169
+ background: var(--sys-color-surface5);
170
+ }
171
+
172
+ .walkthrough-inline .step {
173
+ background-color: var(--sys-color-surface5);
144
174
  }
145
175
 
146
176
  .walkthrough-inline[open] > summary > devtools-icon {
147
- transform: rotate(180deg);
177
+ transform: rotate(270deg);
148
178
  }
149
179
  }