chrome-devtools-frontend 1.0.962581 → 1.0.963415

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.
package/AUTHORS CHANGED
@@ -39,6 +39,7 @@ Luke Swiderski <luke.swiderski@gmail.com>
39
39
  Marijn Haverbeke <marijnh@gmail.com>
40
40
  Michael Brüning <michael.bruning@qt.io>
41
41
  Michael Rienstra <mrienstra@gmail.com>
42
+ Paul Fisher <paul@pfish.zone>
42
43
  Per-Olov Jernberg <possan@possan.se>
43
44
  PhistucK <phistuck@gmail.com>
44
45
  Pradhuman Singh Baid <pradhumansinghbaid@gmail.com>
@@ -168,16 +168,17 @@ export class ParsedURL {
168
168
  }
169
169
 
170
170
  static rawPathToUrlString(fileSystemPath: Platform.DevToolsPath.RawPathString): Platform.DevToolsPath.UrlString {
171
- let rawPath: string = fileSystemPath;
172
- rawPath = rawPath.replace(/\\/g, '/');
173
- if (!rawPath.startsWith('file://')) {
174
- if (rawPath.startsWith('/')) {
175
- rawPath = 'file://' + rawPath;
171
+ let preEncodedPath: string = ParsedURL.preEncodeSpecialCharactersInPath(
172
+ fileSystemPath.replace(/\\/g, '/') as Platform.DevToolsPath.RawPathString);
173
+ preEncodedPath = preEncodedPath.replace(/\\/g, '/');
174
+ if (!preEncodedPath.startsWith('file://')) {
175
+ if (preEncodedPath.startsWith('/')) {
176
+ preEncodedPath = 'file://' + preEncodedPath;
176
177
  } else {
177
- rawPath = 'file:///' + rawPath;
178
+ preEncodedPath = 'file:///' + preEncodedPath;
178
179
  }
179
180
  }
180
- return rawPath as Platform.DevToolsPath.UrlString;
181
+ return new URL(preEncodedPath).toString() as Platform.DevToolsPath.UrlString;
181
182
  }
182
183
 
183
184
  static relativePathToUrlString(relativePath: string, baseURL: Platform.DevToolsPath.UrlString):
@@ -187,13 +188,14 @@ export class ParsedURL {
187
188
  return new URL(preEncodedPath, baseURL).toString() as Platform.DevToolsPath.UrlString;
188
189
  }
189
190
 
190
- static capFilePrefix(fileURL: Platform.DevToolsPath.UrlString, isWindows?: boolean):
191
+ static urlToRawPathString(fileURL: Platform.DevToolsPath.UrlString, isWindows?: boolean):
191
192
  Platform.DevToolsPath.RawPathString {
192
193
  console.assert(fileURL.startsWith('file://'), 'This must be a file URL.');
194
+ const decodedFileURL = decodeURIComponent(fileURL);
193
195
  if (isWindows) {
194
- return fileURL.substr('file:///'.length).replace(/\//g, '\\') as Platform.DevToolsPath.RawPathString;
196
+ return decodedFileURL.substr('file:///'.length).replace(/\//g, '\\') as Platform.DevToolsPath.RawPathString;
195
197
  }
196
- return fileURL.substr('file://'.length) as Platform.DevToolsPath.RawPathString;
198
+ return decodedFileURL.substr('file://'.length) as Platform.DevToolsPath.RawPathString;
197
199
  }
198
200
 
199
201
  static urlWithoutHash(url: string): string {
@@ -584,7 +584,8 @@ export enum DevtoolsExperiments {
584
584
  'cssTypeComponentLength' = 52,
585
585
  'preciseChanges' = 53,
586
586
  'bfcacheDisplayTree' = 54,
587
- 'MaxValue' = 55,
587
+ 'stylesPaneCSSChanges' = 55,
588
+ 'MaxValue' = 56,
588
589
  }
589
590
  /* eslint-enable @typescript-eslint/naming-convention */
590
591
 
@@ -272,6 +272,8 @@ export enum ExperimentName {
272
272
  WEBAUTHN_PANE = 'webauthnPane',
273
273
  SYNC_SETTINGS = 'syncSettings',
274
274
  FULL_ACCESSIBILITY_TREE = 'fullAccessibilityTree',
275
+ PRECISE_CHANGES = 'preciseChanges',
276
+ STYLES_PANE_CSS_CHANGES = 'stylesPaneCSSChanges',
275
277
  }
276
278
 
277
279
  // TODO(crbug.com/1167717): Make this a const enum again
@@ -425,7 +425,7 @@ export class DebuggerModel extends SDKModel<EventTypes> {
425
425
  if (this.target().type() === Type.Node && url.startsWith('file://')) {
426
426
  // TODO(crbug.com/1253323): Cast to UrlString will be removed when migration to branded types is complete.
427
427
  const platformPath =
428
- Common.ParsedURL.ParsedURL.capFilePrefix(url as Platform.DevToolsPath.UrlString, Host.Platform.isWin());
428
+ Common.ParsedURL.ParsedURL.urlToRawPathString(url as Platform.DevToolsPath.UrlString, Host.Platform.isWin());
429
429
  urlRegex =
430
430
  `${Platform.StringUtilities.escapeForRegExp(platformPath)}|${Platform.StringUtilities.escapeForRegExp(url)}`;
431
431
  }
@@ -365,13 +365,18 @@ export class MainImpl {
365
365
  'https://developer.chrome.com/blog/new-in-devtools-96/#length');
366
366
 
367
367
  // Display precise changes in the Changes tab.
368
- Root.Runtime.experiments.register('preciseChanges', 'Display more precise changes in the Changes tab');
368
+ Root.Runtime.experiments.register(
369
+ Root.Runtime.ExperimentName.PRECISE_CHANGES, 'Display more precise changes in the Changes tab');
370
+
371
+ // Integrate CSS changes in the Styles pane.
372
+ Root.Runtime.experiments.register(
373
+ Root.Runtime.ExperimentName.STYLES_PANE_CSS_CHANGES, 'Sync CSS changes in the Styles pane');
369
374
 
370
375
  Root.Runtime.experiments.enableExperimentsByDefault([
371
376
  'sourceOrderViewer',
372
377
  'hideIssuesFeature',
373
378
  'cssTypeComponentLength',
374
- 'preciseChanges',
379
+ Root.Runtime.ExperimentName.PRECISE_CHANGES,
375
380
  'reportingApiDebugging',
376
381
  Root.Runtime.ExperimentName.SYNC_SETTINGS,
377
382
  ]);
@@ -176,7 +176,7 @@ export class IsolatedFileSystem extends PlatformFileSystem {
176
176
  this.initialGitFoldersInternal.add(parentFolder);
177
177
  }
178
178
  if (this.isFileExcluded(entry.fullPath + '/')) {
179
- this.excludedEmbedderFolders.push(Common.ParsedURL.ParsedURL.capFilePrefix(
179
+ this.excludedEmbedderFolders.push(Common.ParsedURL.ParsedURL.urlToRawPathString(
180
180
  this.path() + entry.fullPath as Platform.DevToolsPath.UrlString, Host.Platform.isWin()));
181
181
  continue;
182
182
  }
@@ -555,7 +555,8 @@ export class IsolatedFileSystem extends PlatformFileSystem {
555
555
 
556
556
  tooltipForURL(url: string): string {
557
557
  const path = Platform.StringUtilities.trimMiddle(
558
- Common.ParsedURL.ParsedURL.capFilePrefix(url as Platform.DevToolsPath.UrlString, Host.Platform.isWin()), 150);
558
+ Common.ParsedURL.ParsedURL.urlToRawPathString(url as Platform.DevToolsPath.UrlString, Host.Platform.isWin()),
559
+ 150);
559
560
  return i18nString(UIStrings.linkedToS, {PH1: path});
560
561
  }
561
562
 
@@ -94,8 +94,8 @@ export class ContextMenuProvider implements UI.ContextMenu.Provider {
94
94
  const fileURL = binding ? binding.fileSystem.contentURL() : contentProvider.contentURL();
95
95
  if (fileURL.startsWith('file://')) {
96
96
  // TODO(crbug.com/1253323): Cast to UrlString will be removed when migration to branded types is complete.
97
- const path =
98
- Common.ParsedURL.ParsedURL.capFilePrefix(fileURL as Platform.DevToolsPath.UrlString, Host.Platform.isWin());
97
+ const path = Common.ParsedURL.ParsedURL.urlToRawPathString(
98
+ fileURL as Platform.DevToolsPath.UrlString, Host.Platform.isWin());
99
99
  contextMenu.revealSection().appendItem(
100
100
  i18nString(UIStrings.openInContainingFolder),
101
101
  () => Host.InspectorFrontendHost.InspectorFrontendHostInstance.showItemInFolder(path));
@@ -617,7 +617,13 @@ export class AppManifestView extends UI.Widget.VBox implements SDK.TargetManager
617
617
  const copyButton = new IconButton.IconButton.IconButton();
618
618
  copyButton.title = i18nString(UIStrings.copyToClipboard);
619
619
  copyButton.data = {
620
- groups: [{iconName: 'copy_icon', iconHeight: '12px', iconWidth: '12px', text: ''}],
620
+ groups: [{
621
+ iconName: 'copy_icon',
622
+ iconHeight: '12px',
623
+ iconWidth: '12px',
624
+ text: '',
625
+ iconColor: 'var(--color-text-primary)',
626
+ }],
621
627
  clickHandler: (): void => {
622
628
  Host.InspectorFrontendHost.InspectorFrontendHostInstance.copyText(recommendedId);
623
629
  },
@@ -342,6 +342,7 @@ export class FrameDetailsReportView extends HTMLElement {
342
342
  {
343
343
  iconName: 'refresh_12x12_icon',
344
344
  text: i18nString(UIStrings.refresh),
345
+ iconColor: 'var(--color-text-primary)',
345
346
  } as IconButton.IconButton.IconWithTextData,
346
347
  ],
347
348
  } as IconButton.IconButton.IconButtonData}>
@@ -477,6 +477,8 @@ export class StylePropertyTreeElement extends UI.TreeOutline.TreeElement {
477
477
  } else {
478
478
  this.listItemElement.classList.remove('disabled');
479
479
  }
480
+
481
+ this.listItemElement.classList.toggle('changed', this.parentPane().isPropertyChanged(this.property));
480
482
  }
481
483
 
482
484
  node(): SDK.DOMModel.DOMNode|null {
@@ -714,6 +716,14 @@ export class StylePropertyTreeElement extends UI.TreeOutline.TreeElement {
714
716
  UI.ARIAUtils.setAccessibleName(
715
717
  enabledCheckboxElement, `${this.nameElement.textContent} ${this.valueElement.textContent}`);
716
718
  }
719
+
720
+ const copyIcon = UI.Icon.Icon.create('largeicon-copy', 'copy');
721
+ UI.Tooltip.Tooltip.install(copyIcon, i18nString(UIStrings.copyDeclaration));
722
+ copyIcon.addEventListener('click', () => {
723
+ const propertyText = `${this.property.name}: ${this.property.value};`;
724
+ Host.InspectorFrontendHost.InspectorFrontendHostInstance.copyText(propertyText);
725
+ });
726
+ this.listItemElement.append(copyIcon);
717
727
  this.listItemElement.insertBefore(enabledCheckboxElement, this.listItemElement.firstChild);
718
728
  }
719
729
  }
@@ -1470,6 +1480,9 @@ export class StylePropertyTreeElement extends UI.TreeOutline.TreeElement {
1470
1480
  this.styleTextAppliedForTest();
1471
1481
  return;
1472
1482
  }
1483
+ if (updatedProperty) {
1484
+ this.listItemElement.classList.toggle('changed', this.parentPane().isPropertyChanged(updatedProperty));
1485
+ }
1473
1486
 
1474
1487
  this.matchedStylesInternal.resetActiveProperties();
1475
1488
  this.hasBeenEditedIncrementally = true;
@@ -40,6 +40,9 @@ import * as SDK from '../../core/sdk/sdk.js';
40
40
  import * as Protocol from '../../generated/protocol.js';
41
41
  import * as Bindings from '../../models/bindings/bindings.js';
42
42
  import * as TextUtils from '../../models/text_utils/text_utils.js';
43
+ import * as Workspace from '../../models/workspace/workspace.js';
44
+ import * as WorkspaceDiff from '../../models/workspace_diff/workspace_diff.js';
45
+ import * as DiffView from '../../ui/components/diff_view/diff_view.js';
43
46
  import * as IconButton from '../../ui/components/icon_button/icon_button.js';
44
47
  import * as InlineEditor from '../../ui/legacy/components/inline_editor/inline_editor.js';
45
48
  import * as Components from '../../ui/legacy/components/utils/utils.js';
@@ -231,6 +234,8 @@ export class StylesSidebarPane extends Common.ObjectWrapper.eventMixin<EventType
231
234
  private readonly resizeThrottler: Common.Throttler.Throttler;
232
235
  private readonly imagePreviewPopover: ImagePreviewPopover;
233
236
  activeCSSAngle: InlineEditor.CSSAngle.CSSAngle|null;
237
+ #changedLinesByURLs: Map<string, Set<number>> = new Map();
238
+ #uiSourceCodeToDiffCallbacks: Map<Workspace.UISourceCode.UISourceCode, () => void> = new Map();
234
239
 
235
240
  static instance(): StylesSidebarPane {
236
241
  if (!_stylesSidebarPaneInstance) {
@@ -834,7 +839,14 @@ export class StylesSidebarPane extends Common.ObjectWrapper.eventMixin<EventType
834
839
  const blocks = [new SectionBlock(null)];
835
840
  let sectionIdx = 0;
836
841
  let lastParentNode: SDK.DOMModel.DOMNode|null = null;
842
+ if (Root.Runtime.experiments.isEnabled(Root.Runtime.ExperimentName.STYLES_PANE_CSS_CHANGES)) {
843
+ this.resetChangedLinesTracking();
844
+ }
837
845
  for (const style of matchedStyles.nodeStyles()) {
846
+ if (Root.Runtime.experiments.isEnabled(Root.Runtime.ExperimentName.STYLES_PANE_CSS_CHANGES) && style.parentRule) {
847
+ await this.trackChangedLines(style.parentRule.resourceURL());
848
+ }
849
+
838
850
  const parentNode = matchedStyles.isInherited(style) ? matchedStyles.nodeForStyle(style) : null;
839
851
  if (parentNode && parentNode !== lastParentNode) {
840
852
  lastParentNode = parentNode;
@@ -987,6 +999,61 @@ export class StylesSidebarPane extends Common.ObjectWrapper.eventMixin<EventType
987
999
  return sections;
988
1000
  }
989
1001
 
1002
+ resetChangedLinesTracking(): void {
1003
+ this.#changedLinesByURLs.clear();
1004
+ for (const [uiSourceCode, callback] of this.#uiSourceCodeToDiffCallbacks) {
1005
+ WorkspaceDiff.WorkspaceDiff.workspaceDiff().unsubscribeFromDiffChange(uiSourceCode, callback);
1006
+ }
1007
+ this.#uiSourceCodeToDiffCallbacks.clear();
1008
+ }
1009
+
1010
+ async trackChangedLines(url: string): Promise<void> {
1011
+ if (!url || this.#changedLinesByURLs.has(url)) {
1012
+ return;
1013
+ }
1014
+ const uiSourceCode = Workspace.Workspace.WorkspaceImpl.instance().uiSourceCodeForURL(url);
1015
+ if (uiSourceCode) {
1016
+ await this.refreshChangedLines(uiSourceCode);
1017
+ const callback = this.refreshChangedLines.bind(this, uiSourceCode);
1018
+ WorkspaceDiff.WorkspaceDiff.workspaceDiff().subscribeToDiffChange(uiSourceCode, callback);
1019
+ this.#uiSourceCodeToDiffCallbacks.set(uiSourceCode, callback);
1020
+ }
1021
+ }
1022
+
1023
+ isPropertyChanged(property: SDK.CSSProperty.CSSProperty): boolean {
1024
+ if (!Root.Runtime.experiments.isEnabled(Root.Runtime.ExperimentName.STYLES_PANE_CSS_CHANGES)) {
1025
+ return false;
1026
+ }
1027
+ const url = property.ownerStyle.parentRule?.resourceURL();
1028
+ if (!url) {
1029
+ return false;
1030
+ }
1031
+ const changedLines = this.#changedLinesByURLs.get(url);
1032
+ if (!changedLines) {
1033
+ return false;
1034
+ }
1035
+ const uiLocation = Bindings.CSSWorkspaceBinding.CSSWorkspaceBinding.instance().propertyUILocation(property, true);
1036
+ if (!uiLocation) {
1037
+ return false;
1038
+ }
1039
+ // UILocation's lineNumber starts at 0, but changedLines start at 1.
1040
+ return changedLines.has(uiLocation.lineNumber + 1);
1041
+ }
1042
+
1043
+ private async refreshChangedLines(uiSourceCode: Workspace.UISourceCode.UISourceCode): Promise<void> {
1044
+ const diff = await WorkspaceDiff.WorkspaceDiff.workspaceDiff().requestDiff(uiSourceCode, {shouldFormatDiff: true});
1045
+ const changedLines = new Set<number>();
1046
+ if (diff && diff.length > 0) {
1047
+ const {rows} = DiffView.DiffView.buildDiffRows(diff);
1048
+ for (const row of rows) {
1049
+ if (row.type === DiffView.DiffView.RowType.Addition) {
1050
+ changedLines.add(row.currentLineNumber);
1051
+ }
1052
+ }
1053
+ }
1054
+ this.#changedLinesByURLs.set(uiSourceCode.url(), changedLines);
1055
+ }
1056
+
990
1057
  private clipboardCopy(_event: Event): void {
991
1058
  Host.userMetrics.actionTaken(Host.UserMetrics.Action.StyleRuleCopied);
992
1059
  }
@@ -126,6 +126,34 @@ ol.expanded {
126
126
  opacity: 50%;
127
127
  }
128
128
 
129
+ .changed::after {
130
+ content: "";
131
+ position: absolute;
132
+ left: -4px;
133
+ width: 2px;
134
+ height: 100%;
135
+ background-color: var(--color-accent-green);
136
+ }
137
+
138
+ .copy {
139
+ display: none;
140
+ }
141
+
142
+ .changed:hover {
143
+ background-color: var(--color-accent-green-background);
144
+ }
145
+
146
+ .changed:hover .copy {
147
+ position: absolute;
148
+ right: -4px;
149
+ top: 0;
150
+ bottom: 0;
151
+ margin: auto;
152
+ display: inline-block;
153
+ cursor: pointer;
154
+ transform: scale(0.9);
155
+ }
156
+
129
157
  .has-ignorable-error {
130
158
  color: var(--color-text-disabled);
131
159
  }
@@ -87,8 +87,10 @@ export class PlayerListView extends UI.Widget.VBox implements TriggerDispatcher
87
87
  this.mainContainer.renderMainPanel(playerID);
88
88
  if (this.currentlySelectedEntry !== null) {
89
89
  this.currentlySelectedEntry.classList.remove('selected');
90
+ this.currentlySelectedEntry.classList.remove('force-white-icons');
90
91
  }
91
92
  element.classList.add('selected');
93
+ element.classList.add('force-white-icons');
92
94
  this.currentlySelectedEntry = element;
93
95
  }
94
96
 
@@ -42,6 +42,9 @@ li.storage-group-list-item::before {
42
42
 
43
43
  .player-entry-frame-title {
44
44
  height: 26px;
45
+ width: 125px;
46
+ min-width: 125px;
47
+ text-overflow: elipsis;
45
48
  padding: 0 10px;
46
49
  border-right: 1px solid var(--color-details-hairline);
47
50
  overflow: hidden;
@@ -184,7 +184,7 @@ Common.Settings.registerSettingExtension({
184
184
  title: 'Mountain View',
185
185
  lat: 37.386052,
186
186
  long: -122.083851,
187
- timezoneId: 'US/Pacific',
187
+ timezoneId: 'America/Los_Angeles',
188
188
  locale: 'en-US',
189
189
  },
190
190
  {
@@ -198,7 +198,7 @@ Common.Settings.registerSettingExtension({
198
198
  title: 'San Francisco',
199
199
  lat: 37.774929,
200
200
  long: -122.419416,
201
- timezoneId: 'US/Pacific',
201
+ timezoneId: 'America/Los_Angeles',
202
202
  locale: 'en-US',
203
203
  },
204
204
  {
@@ -849,7 +849,7 @@ export class NavigatorView extends UI.Widget.VBox implements SDK.TargetManager.O
849
849
 
850
850
  if (project.type() === Workspace.Workspace.projectTypes.FileSystem) {
851
851
  // TODO(crbug.com/1253323): Cast to RawPathString will be removed when migration to branded types is complete.
852
- const folderPath = Common.ParsedURL.ParsedURL.capFilePrefix(
852
+ const folderPath = Common.ParsedURL.ParsedURL.urlToRawPathString(
853
853
  Persistence.FileSystemWorkspaceBinding.FileSystemWorkspaceBinding.completeURL(project, path) as
854
854
  Platform.DevToolsPath.UrlString,
855
855
  Host.Platform.isWin());
@@ -44,14 +44,14 @@ interface Row {
44
44
  type: RowType;
45
45
  }
46
46
 
47
- const enum RowType {
47
+ export const enum RowType {
48
48
  Deletion = 'deletion',
49
49
  Addition = 'addition',
50
50
  Equal = 'equal',
51
51
  Spacer = 'spacer',
52
52
  }
53
53
 
54
- function buildDiffRows(diff: Diff.Diff.DiffArray): {
54
+ export function buildDiffRows(diff: Diff.Diff.DiffArray): {
55
55
  originalLines: readonly string[],
56
56
  currentLines: readonly string[],
57
57
  rows: readonly Row[],
@@ -12,7 +12,7 @@ function appendComponent(data: IconButton.IconButton.IconButtonData) {
12
12
 
13
13
  appendComponent({
14
14
  clickHandler: (): void => {},
15
- groups: [{iconName: 'survey_feedback_icon', text: '1 item'}],
15
+ groups: [{iconName: 'survey_feedback_icon', iconColor: 'var(--color-text-primary)', text: '1 item'}],
16
16
  });
17
17
 
18
18
  appendComponent({
@@ -85,7 +85,7 @@ export class IconButton extends HTMLElement {
85
85
  ${filteredGroups.map(counter =>
86
86
  LitHtml.html`
87
87
  <${Icon.litTagName} class="status-icon"
88
- .data=${{iconName: counter.iconName, color: counter.iconColor || 'var(--color-text-primary)', width: counter.iconWidth || '1.5ex', height: counter.iconHeight || '1.5ex'} as IconData}>
88
+ .data=${{iconName: counter.iconName, color: counter.iconColor, width: counter.iconWidth || '1.5ex', height: counter.iconHeight || '1.5ex'} as IconData}>
89
89
  </${Icon.litTagName}>
90
90
  ${this.#compact ? LitHtml.html`<!-- Force line-height for this element --><span>&#8203;</span>` : LitHtml.nothing}
91
91
  <span class="icon-button-title">${counter.text}</span>
@@ -120,6 +120,7 @@ export class GlassPane {
120
120
  // Deliberately starts with 3000 to hide other z-indexed elements below.
121
121
  this.element.style.zIndex = `${3000 + 1000 * _panes.size}`;
122
122
  document.body.addEventListener('mousedown', this.onMouseDownBound, true);
123
+ document.body.addEventListener('pointerdown', this.onMouseDownBound, true);
123
124
  this.widgetInternal.show(document.body);
124
125
  _panes.add(this);
125
126
  this.positionContent();
@@ -131,6 +132,7 @@ export class GlassPane {
131
132
  }
132
133
  _panes.delete(this);
133
134
  this.element.ownerDocument.body.removeEventListener('mousedown', this.onMouseDownBound, true);
135
+ this.element.ownerDocument.body.removeEventListener('pointerdown', this.onMouseDownBound, true);
134
136
  this.widgetInternal.detach();
135
137
  }
136
138
 
@@ -26,6 +26,8 @@ button.soft-dropdown > .title {
26
26
  @media (forced-colors: active) {
27
27
  button.soft-dropdown {
28
28
  border: 1px solid ButtonText;
29
+ background: ButtonFace;
30
+ color: ButtonText;
29
31
  }
30
32
 
31
33
  button.soft-dropdown[disabled] {
@@ -57,6 +57,7 @@
57
57
  --color-accent-red: rgb(217 48 37);
58
58
  --color-red: rgb(238 68 47);
59
59
  --color-accent-green: rgb(24 128 56);
60
+ --color-accent-green-background: rgb(24 128 56 / 10%);
60
61
  --color-green: rgb(99 172 190);
61
62
  --color-link: var(--color-primary);
62
63
  --color-syntax-1: rgb(200 0 0);
@@ -219,6 +220,7 @@
219
220
  --color-accent-red: rgb(242 139 130);
220
221
  --color-red: rgb(237 78 76);
221
222
  --color-accent-green: rgb(129 201 149);
223
+ --color-accent-green-background: rgb(129 201 149 / 20%);
222
224
  --color-link: var(--color-primary);
223
225
  --color-syntax-1: rgb(53 212 199);
224
226
  --color-syntax-2: rgb(93 176 215);
@@ -537,4 +537,10 @@ devtools-icon.leading-issue-icon {
537
537
  .toolbar-item .devtools-link {
538
538
  color: linktext;
539
539
  }
540
+
541
+ .toolbar-has-dropdown {
542
+ forced-color-adjust: none;
543
+ background: ButtonFace;
544
+ color: ButtonText;
545
+ }
540
546
  }
package/package.json CHANGED
@@ -53,5 +53,5 @@
53
53
  "unittest": "scripts/test/run_unittests.py --no-text-coverage",
54
54
  "watch": "third_party/node/node.py --output scripts/watch_build.js"
55
55
  },
56
- "version": "1.0.962581"
56
+ "version": "1.0.963415"
57
57
  }