Merge VS Code 1.26.1 (#2394)

* Squash merge commits for 1.26 (#1) (#2323)

* Polish tag search as per feedback (#55269)

* Polish tag search as per feedback

* Updated regex

* Allow users to opt-out of features that send online requests in the background (#55097)

* settings sweep #54690

* Minor css tweaks to enable eoverflow elipsis in more places (#55277)

* fix an issue with titlebarheight when not scaling with zoom

* Settings descriptions update #54690

* fixes #55209

* Settings editor - many padding fixes

* More space above level 2 label

* Fixing Cannot debug npm script using Yarn #55103

* Settings editor - show ellipsis when description overflows

* Settings editor - ... fix measuring around links, relayout

* Setting descriptions

* Settings editor - fix ... for some short lines, fix select container width

* Settings editor - overlay trees so scrollable shadow is full width

* Fix #54133 - missing extension settings after reload

* Settings color token description tweak

* Settings editor - disable overflow indicator temporarily, needs to be faster

* Added command to Run the selected npm script

* fixes #54452

* fixes #54929

* fixes #55248

* prefix command with extension name

* Contribute run selected to the context menu

* node-debug@1.26.6

* Allow terminal rendererType to be swapped out at runtime

Part of #53274
Fixes #55344

* Settings editor - fix not focusing search when restoring editor
setInput must be actually async. Will be fixed naturally when we aren't using winJS promises...

* Settings editor - TOC should only expand the section with a selected item

* Bump node-debug2

* Settings editor - Tree focus outlines

* Settings editor - don't blink the scrollbar when toc selection changes
And hide TOC correctly when the editor is narrow

* Settings editor - header rows should not be selectable

* fixes #54877

* change debug assignee to isi

* Settings sweep (#54690)

* workaround for #55051

* Settings sweep (#54690)

* settings sweep

#54690

* Don't try closing tags when you type > after another >

* Describe what implementation code lens does

Fixes #55370

* fix javadoc formatter setting description

* fixes #55325

* update to officical TS version

* Settings editor - Even more padding, use semibold instead of bold

* Fix #55357 - fix TOC twistie

* fixes #55288

* explorer: refresh on di change file system provider registration

fixes #53256

* Disable push to Linux repo to test standalone publisher

* New env var to notify log level to extensions #54001

* Disable snippets in extension search (when not in suggest dropdown) (#55281)

* Disable snippits in extension search (when not in suggest dropdown)

* Add monaco input contributions

* Fix bug preventing snippetSuggestions from taking effect in sub-editors

* Latest emmet helper to fix #52366

* Fix comment updates for threads within same file

* Allow extensions to log telemetry to log files #54001

* Pull latest css grammar

* files.exclude control - use same style for "add" vs "edit"

* files.exclude control - focus/keyboard behavior

* don't show menubar too early

* files.exclude - better styling

* Place cursor at end of extensions search box on autofill (#55254)

* Place cursor at end of extensions search box on autofill

* Use position instead of selection

* fix linux build issue (empty if block)

* Settings editor - fix extension category prefixes

* Settings editor - add simple ellipsis for first line that overflows, doesn't cover case when first line does not overflow but there is more text, TODO

* File/Text search provider docs

* Fixes #52655

* Include epoch (#55008)

* Fixes #53385

* Fixes #49480

*  VS Code Insiders (Users) not opening Fixes #55353

* Better handling of the case when the extension host fails to start

* Fixes #53966

*  Remove confusing Start from wordPartLeft commands ID

* vscode-xterm@3.6.0-beta12

Fixes #55488

* Initial size is set to infinity!! Fixes #55461

* Polish embeddedEditorBackground

* configuration service misses event

* Fix #55224 - fix duplicate results in multiroot workspace from splitting the diskseach query

* Select all not working in issue reporter on mac, fixes #55424

* Disable fuzzy matching for extensions autosuggest (#55498)

* Fix clipping of extensions search border in some third party themes (#55504)

* fixes #55538

* Fix bug causing an aria alert to not be shown the third time
 (and odd numbers thereafter)

* Settings editor - work around rendering glitch with webkit-line-clamp

* Settings editor - revert earlier '...' changes

* Settings editor - move enumDescription to its own div, because it disturbs -webkit-line-clamp for some reason

* Settings editor - better overflow indicator

* Don't show existing filters in autocomplete (#55495)

* Dont show existing filters in autocomplete

* Simplify

* Settings Editor: Add aria labels for input elements Fixes: #54836 (#55543)

* fixes #55223

* Update vscode-css-languageservice to 3.0.10-next.1

* Fix #55509 - settings navigation

* Fix #55519

* Fix #55520

* FIx #55524

* Fix #55556 - include wordSeparators in all search queries, so findTextInFiles can respect isWordMatch correctly

* oss updates for endgame

* Fix unit tests

* fixes #55522

* Avoid missing manifest error from bubbling up #54757

* Settings format crawl

* Search provider - Fix FileSearchProvider to return array, not progress

* Fix #55598

* Settings editor - fix NPE rendering settings with no description

* dont render inden guides in search box (#55600)

* fixes #55454

* More settings crawl

* Another change for #55598 - maxResults applies to FileSearch and TextSearch but not FileIndex

* Fix FileSearchProvider unit tests for progress change

* fixes #55561

* Settings description update for #54690

* Update setting descriptions for online services

* Minor edits

* fixes #55513

* fixes #55451

* Fix #55612 - fix findTextInFiles cancellation

* fixes #55539

* More setting description tweaks

* Setting to disable online experiments #54354

* fixes #55507

* fixes #55515

* Show online services action only in Insiders for now

* Settings editor - change toc behavior default to 'filter'

* Settings editor - nicer filter count style during search

* Fix #55617 - search viewlet icons

* Settings editor - better styling for element count indicator

* SearchProvider - fix NPE when searching extraFileResources

* Allow extends to work without json suffix

Fixes #16905

* Remove accessability options logic entirely

Follow up on #55451

* use latest version of DAP

* fixes #55490

* fixes #55122

* fixes #52332

* Avoid assumptions about git: URIs (fixes #36236)

* relative path for descriptions

* resourece: get rid of isFile context key

fixes #48275

* Register previous ids for compatibility (#53497)

* more tuning for #48275

* no need to always re-read "files explorer"

fixes #52003

* read out active composites properly

fixes #51967

* Update link colors for hc theme to meet color contrast ratio, fixes #55651

Also updated link color for `textLinkActiveForeground` to be the same as `textLinkForeground` as it wasn't properly updated

* detect 'winpty-agent.exe'; fixes #55672

* node-debug@1.26.7

* reset counter on new label

* Settings editor - fix multiple setting links in one description

* Settings editor - color code blocks in setting descriptions, fix #55532

* Settings editor - hover color in TOC

* Settings editor - fix navigation NPE

* Settings editor - fix text control width

* Settings editor - maybe fix #55684

* Fix bug causing cursor to not move on paste

* fixes #53582

* Use ctrlCmd instead of ctrl for go down from search box

* fixes #55264

* fixes #55456

* filter for spcaes before triggering search (#55611)

* Fix #55698 - don't lose filtered TOC counts when refreshing TOC

* fixes #55421

* fixes #28979

* fixes #55576

* only add check for updates to windows/linux help

* readonly files: append decoration to label

fixes #53022

* debug: do not show toolbar while initialising

fixes #55026

* Opening launch.json should not activate debug extensions

fixes #55029

* fixes #55435

* fixes #55434

* fixes #55439

* trigger menu only on altkey up

* Fix #50555 - fix settings editor memory leak

* Fix #55712 - no need to focus 'a' anymore when restoring control focus after tree render

* fixes #55335

* proper fix for readonly model

fixes #53022

* improve FoldingRangeKind spec (for #55686)

* Use class with static fields (fixes #55494)

* Fixes #53671

* fixes #54630

* [html] should disable ionic suggestions by default. Currently forces deprecated Ionic v1 suggestions in .html files while typing. Fixes #53324

* cleanup deps

* debug issues back to andre

* update electron for smoketest

* Fix #55757 - prevent settings tabs from overflowing

* Fix #53897 - revert setting menu defaults to old editor

* Add enum descriptions to `typescript.preferences.importModuleSpecifier`

* Fix #55767 - leaking style elements from settings editor

* Fix #55521 - prevent flashing when clicking in exclude control

* Update Git modified color for contrast ratio, fixes #53140

* Revert "Merge branch 'master' of github.com:Microsoft/vscode"

This reverts commit bf46b6bfbae0cab99c2863e1244a916181fa9fbc, reversing
changes made to e275a424483dfb4ed33b428c97d5e2c441d6b917.

* Revert "Revert "Merge branch 'master' of github.com:Microsoft/vscode""

This reverts commit 53949d963f39e40757557c6526332354a31d9154.

* don't ask to install an incomplete menu

* Fix NPE in terminal AccessibilityManager

Fixes #55744

* don't display fallback menu unless we've closed the last window

* fixes #55547

* Fix smoke tests for extension search box

* Update OSSREADME.json for Electron 2.0.5

* Update distro

Includes Chromium license changes

* fix #55455

* fix #55865

* fixes #55893

* Fix bug causing workspace recommendations to go away upon ignoring a recommendation (#55805)

* Fix bug causing workspace recommendations to go away upon ignoring a recommendation

* ONly show on @recommended or @recommended:workspace

* Make more consistant

* Fix #55911

* Understand json activity (#55926)

* Understand json file activity

* Refactoring

* adding composer.json

* Distro update for experiments

* use terminal.processId for auto-attach; fixes #55918

* Reject invalid URI with vscode.openFolder (for #55891)

* improve win32 setup system vs user detection

fixes #55840

fixes #55840

delay winreg import

related to #55840

show notification earlier

related to #55840

fix #55840

update inno setup message

related to #55840

* Fix #55593 - this code only operates on local paths, so use fsPath and Uri.file instead

* Bring back the old menu due to electron 2.0 issues (#55913)

* add the old menu back for native menus

* make menu labels match

* `vscode.openFolder`: treat missing URI schema gracefully (for #55891)

* delay EH reattach; fixes #55955

* Mark all json files under appSettingsHome as settings

* Use localized strings for telemetry opt-out

* Exception when saving file editor opened from remote file provider (fixes #55051)

* Remove terminal menu from stable

Fixes 56003

* VSCode Insiders crashes on open with TypeError: Cannot read property 'lastIndexOf' of undefined. Fixes #54933

* improve fix for #55891

* fix #55916

* Improve #55891

* increase EH debugging restart delay; fixes #55955

* Revert "Don't include non-resource entries in history quick pick"

This reverts commit 37209a838e9f7e9abe6dc53ed73cdf1e03b72060.

* Diff editor: horizontal scrollbar height is smaller (fixes #56062)

* improve openFolder uri fix (correctly treat backslashes)

* fixes #56116
repair ipc for native menubar keybindings

* Fix #56240 - Open the JSON settings editor instead of the UI editor

* Fix #55536

* uriDisplay: if no formatter is registered fall back to getPathlabel

fixes #56104

* VSCode hangs when opening python file. Fixes #56377

* VS Code Hangs When Opening Specific PowerShell File. Fixes #56430

* Fix #56433 - search extraFileResources even when no folders open

* Workaround #55649

* Fix in master #56371

* Fix tests #56371

* Fix in master #56317

* increase version to 1.26.1

* Fixes #56387: Handle SIGPIPE in extension host

* fixes #56185

* Fix merge issues (part 1)

* Fix build breaks (part 1)

* Build breaks (part 2)

* Build breaks (part 3)

* More build breaks (part 4)

* Fix build breaks (part 5)

* WIP

* Fix menus

* Render query result and message panels (#2363)

* Put back query editor hot exit changes

* Fix grid changes that broke profiler (#2365)

* Update APIs for saving query editor state

* Fix restore view state for profiler and edit data

* Updating custom default themes to support 4.5:1 contrast ratio

* Test updates

* Fix Extension Manager and Windows Setup

* Update license headers

* Add appveyor and travis files back

* Fix hidden modal dropdown issue
This commit is contained in:
Karl Burtram
2018-09-04 14:55:00 -07:00
committed by GitHub
parent 3763278366
commit 81329fa7fa
2638 changed files with 118456 additions and 64012 deletions

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-out{fill:#f6f6f6}.icon-vs-bg{fill:#424242}.icon-vs-fg{fill:#f0eff1}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M16 14H0V2h16v12z" id="outline"/><path class="icon-vs-bg" d="M1 3v10h14V3H1zm13 9H8V8.507l3.998.006-2.121 2.129.707.707 3.35-3.35-3.35-3.338-.707.706 2.138 2.146L8 7.507V4h6v8z" id="iconBg"/><path class="icon-vs-fg" d="M14 4v8H8V8.507l3.998.006-2.121 2.129.707.707 3.35-3.35-3.35-3.338-.707.706 2.138 2.146L8 7.507V4h6zM6.057 5.367L5.35 4.66 2 8.01l3.35 3.338.707-.707-2.139-2.146L8 8.501v-1l-4.064-.005 2.121-2.129z" id="iconFg"/></svg>

After

Width:  |  Height:  |  Size: 738 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#252526}.icon-vs-out{fill:#252526}.icon-vs-bg{fill:#c5c5c5}.icon-vs-fg{fill:#2a292c}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M16 14H0V2h16v12z" id="outline"/><path class="icon-vs-bg" d="M1 3v10h14V3H1zm13 9H8V8.507l3.998.006-2.121 2.129.707.707 3.35-3.35-3.35-3.338-.707.706 2.138 2.146L8 7.507V4h6v8z" id="iconBg"/><path class="icon-vs-fg" d="M14 4v8H8V8.507l3.998.006-2.121 2.129.707.707 3.35-3.35-3.35-3.338-.707.706 2.138 2.146L8 7.507V4h6zM6.057 5.367L5.35 4.66 2 8.01l3.35 3.338.707-.707-2.139-2.146L8 8.501v-1l-4.064-.005 2.121-2.129z" id="iconFg"/></svg>

After

Width:  |  Height:  |  Size: 738 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-out{fill:#f6f6f6}.icon-vs-action-orange{fill:#c27d1a}</style><g id="canvas"><path id="XMLID_1_" class="icon-canvas-transparent" d="M16 16H0V0h16v16z"/></g><path class="icon-vs-out" d="M16 6.586l-3-3L11.586 5H9.414l1-1-4-4h-.828L0 5.586v.828l4 4L6.414 8H7v5h1.586l3 3h.828L16 12.414v-.828L13.914 9.5 16 7.414v-.828z" id="outline"/><g id="iconBg"><path class="icon-vs-action-orange" d="M13 10l2 2-3 3-2-2 1-1H8V7H6L4 9 1 6l5-5 3 3-2 2h5l1-1 2 2-3 3-2-2 1-1H9v4l2.999.002L13 10z"/></g></svg>

After

Width:  |  Height:  |  Size: 612 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#2d2d30}.icon-vs-out{fill:#2d2d30}.icon-vs-action-orange{fill:#e8ab53}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M16 6.586l-3-3L11.586 5H9.414l1-1-4-4h-.828L0 5.586v.828l4 4L6.414 8H7v5h1.586l3 3h.828L16 12.414v-.828L13.914 9.5 16 7.414v-.828z" id="outline"/><path class="icon-vs-action-orange" d="M13 10l2 2-3 3-2-2 1-1H8V7H6L4 9 1 6l5-5 3 3-2 2h5l1-1 2 2-3 3-2-2 1-1H9v4l2.999.002L13 10z" id="iconBg"/></svg>

After

Width:  |  Height:  |  Size: 584 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-out{fill:#f6f6f6}.icon-vs-bg{fill:#424242}.icon-vs-red{fill:#e51400}.icon-vs-yellow{fill:#ffcc00}.icon-vs-green{fill:#339933}.icon-vs-blue{fill:#1ba1e2}.icon-vs-action-purple{fill:#652d90}.icon-white{fill:#ffffff}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M16 8c0 4.411-3.589 8-8 8a2.803 2.803 0 0 1-2.8-2.8c0-.833.272-1.629.766-2.241a.596.596 0 0 0 .101-.359.667.667 0 0 0-.667-.666.58.58 0 0 0-.358.102A3.584 3.584 0 0 1 2.8 10.8 2.803 2.803 0 0 1 0 8c0-4.411 3.589-8 8-8s8 3.589 8 8z" id="outline"/><path class="icon-white" d="M5.4 7.933a2.67 2.67 0 0 1 2.667 2.666c0 .606-.193 1.179-.544 1.614a1.599 1.599 0 0 0-.323.987.8.8 0 0 0 .8.8c3.309 0 6-2.691 6-6s-2.691-6-6-6-6 2.691-6 6c0 .441.359.8.8.8.378 0 .729-.114.986-.322A2.568 2.568 0 0 1 5.4 7.933z" id="iconFg"/><g id="iconBg"><path class="icon-vs-bg" d="M8 15c-.992 0-1.8-.808-1.8-1.8 0-.606.193-1.179.544-1.613.208-.259.323-.609.323-.987 0-.919-.748-1.666-1.667-1.666-.377 0-.728.115-.986.323A2.58 2.58 0 0 1 2.8 9.8C1.808 9.8 1 8.992 1 8c0-3.86 3.14-7 7-7 3.859 0 7 3.14 7 7 0 3.859-3.141 7-7 7zM5.4 7.933a2.67 2.67 0 0 1 2.667 2.666c0 .606-.193 1.179-.544 1.614a1.599 1.599 0 0 0-.323.987.8.8 0 0 0 .8.8c3.309 0 6-2.691 6-6s-2.691-6-6-6-6 2.691-6 6c0 .441.359.8.8.8.378 0 .729-.114.986-.322A2.568 2.568 0 0 1 5.4 7.933z"/><path class="icon-vs-action-purple" d="M4.5 5.375a.875.875 0 1 0 0 1.75.875.875 0 0 0 0-1.75z"/><path class="icon-vs-blue" d="M7.125 3.625a.875.875 0 1 0 0 1.75.875.875 0 0 0 0-1.75z"/><path class="icon-vs-green" d="M10.625 4.5a.875.875 0 1 0 0 1.75.875.875 0 0 0 0-1.75z"/><path class="icon-vs-yellow" d="M11.5 8a.875.875 0 1 0 0 1.75.875.875 0 0 0 0-1.75z"/><path class="icon-vs-red" d="M9.75 10.625a.875.875 0 1 0 0 1.75.875.875 0 0 0 0-1.75z"/></g></svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#252526}.icon-vs-out{fill:#252526}.icon-vs-bg{fill:#c5c5c5}.icon-vs-red{fill:#ff4635}.icon-vs-yellow{fill:#ffda48}.icon-vs-green{fill:#78d278}.icon-vs-blue{fill:#37aee7}.icon-vs-action-purple{fill:#b180d7}.icon-white{fill:#000000}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M16 8c0 4.411-3.589 8-8 8a2.803 2.803 0 0 1-2.8-2.8c0-.833.272-1.629.766-2.241a.596.596 0 0 0 .101-.359.667.667 0 0 0-.667-.666.58.58 0 0 0-.358.102A3.584 3.584 0 0 1 2.8 10.8 2.803 2.803 0 0 1 0 8c0-4.411 3.589-8 8-8s8 3.589 8 8z" id="outline"/><path class="icon-white" d="M5.4 7.933a2.67 2.67 0 0 1 2.667 2.666c0 .606-.193 1.179-.544 1.614a1.599 1.599 0 0 0-.323.987.8.8 0 0 0 .8.8c3.309 0 6-2.691 6-6s-2.691-6-6-6-6 2.691-6 6c0 .441.359.8.8.8.378 0 .729-.114.986-.322A2.568 2.568 0 0 1 5.4 7.933z" id="iconFg"/><g id="iconBg"><path class="icon-vs-bg" d="M8 15c-.992 0-1.8-.808-1.8-1.8 0-.606.193-1.179.544-1.613.208-.259.323-.609.323-.987 0-.919-.748-1.666-1.667-1.666-.377 0-.728.115-.986.323A2.58 2.58 0 0 1 2.8 9.8C1.808 9.8 1 8.992 1 8c0-3.86 3.14-7 7-7 3.859 0 7 3.14 7 7 0 3.859-3.141 7-7 7zM5.4 7.933a2.67 2.67 0 0 1 2.667 2.666c0 .606-.193 1.179-.544 1.614a1.599 1.599 0 0 0-.323.987.8.8 0 0 0 .8.8c3.309 0 6-2.691 6-6s-2.691-6-6-6-6 2.691-6 6c0 .441.359.8.8.8.378 0 .729-.114.986-.322A2.568 2.568 0 0 1 5.4 7.933z"/><path class="icon-vs-action-purple" d="M4.5 5.375a.875.875 0 1 0 0 1.75.875.875 0 0 0 0-1.75z"/><path class="icon-vs-blue" d="M7.125 3.625a.875.875 0 1 0 0 1.75.875.875 0 0 0 0-1.75z"/><path class="icon-vs-green" d="M10.625 4.5a.875.875 0 1 0 0 1.75.875.875 0 0 0 0-1.75z"/><path class="icon-vs-yellow" d="M11.5 8a.875.875 0 1 0 0 1.75.875.875 0 0 0 0-1.75z"/><path class="icon-vs-red" d="M9.75 10.625a.875.875 0 1 0 0 1.75.875.875 0 0 0 0-1.75z"/></g></svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-out{fill:#f6f6f6}.icon-vs-bg{fill:#424242}.icon-vs-fg{fill:#f0eff1}.icon-vs-action-blue{fill:#00539c}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M2.879 14L1 12.121V3.879L2.879 2h10.242L15 3.879v8.242L13.121 14H2.879z" id="outline"/><path class="icon-vs-fg" d="M12.293 4H3.707L3 4.707v6.586l.707.707h8.586l.707-.707V4.707L12.293 4zM11 10H5V9h6v1zm0-3H5V6h6v1z" id="iconFg"/><g id="iconBg"><path class="icon-vs-bg" d="M12.707 13H3.293L2 11.707V4.293L3.293 3h9.414L14 4.293v7.414L12.707 13zm-9-1h8.586l.707-.707V4.707L12.293 4H3.707L3 4.707v6.586l.707.707z"/><path class="icon-vs-action-blue" d="M11 7H5V6h6v1zm0 2H5v1h6V9z"/></g></svg>

After

Width:  |  Height:  |  Size: 823 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#252526}.icon-vs-out{fill:#252526}.icon-vs-bg{fill:#c5c5c5}.icon-vs-fg{fill:#2b282e}.icon-vs-action-blue{fill:#75beff}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M2.879 14L1 12.121V3.879L2.879 2h10.242L15 3.879v8.242L13.121 14H2.879z" id="outline"/><path class="icon-vs-fg" d="M12.293 4H3.707L3 4.707v6.586l.707.707h8.586l.707-.707V4.707L12.293 4zM11 10H5V9h6v1zm0-3H5V6h6v1z" id="iconFg"/><g id="iconBg"><path class="icon-vs-bg" d="M12.707 13H3.293L2 11.707V4.293L3.293 3h9.414L14 4.293v7.414L12.707 13zm-9-1h8.586l.707-.707V4.707L12.293 4H3.707L3 4.707v6.586l.707.707z"/><path class="icon-vs-action-blue" d="M11 7H5V6h6v1zm0 2H5v1h6V9z"/></g></svg>

After

Width:  |  Height:  |  Size: 823 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" enable-background="new 0 0 16 16"><style type="text/css">.icon-canvas-transparent{opacity:0;fill:#F6F6F6;} .icon-vs-out{fill:#F6F6F6;} .icon-vs-bg{fill:#424242;} .icon-vs-fg_x0020_2{fill:#F0EFF1;}</style><path class="icon-canvas-transparent" d="M16 16h-16v-16h16v16z" id="canvas"/><path class="icon-vs-out" d="M15 16h-13v-16h8.621l4.379 4.379v11.621z" id="outline"/><path class="icon-vs-fg_x0020_2" d="M13 14h-9v-12h5v4h4v8zm-3-9v-2.793l2.793 2.793h-2.793z" id="iconFg"/><path class="icon-vs-bg" d="M3 1v14h11v-10.207l-3.793-3.793h-7.207zm10 13h-9v-12h5v4h4v8zm-3-9v-2.793l2.793 2.793h-2.793z" id="iconBg"/></svg>

After

Width:  |  Height:  |  Size: 673 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" enable-background="new 0 0 16 16"><style type="text/css">.icon-canvas-transparent{opacity:0;fill:#F6F6F6;} .icon-vs-out{fill:#F6F6F6;} .icon-vs-bg{fill:#c5c5c5;} .icon-vs-fg_x0020_2{fill:#F0EFF1;}</style><path class="icon-canvas-transparent" d="M16 16h-16v-16h16v16z" id="canvas"/><path class="icon-vs-out" d="M15 16h-13v-16h8.621l4.379 4.379v11.621z" id="outline"/><path class="icon-vs-fg_x0020_2" d="M13 14h-9v-12h5v4h4v8zm-3-9v-2.793l2.793 2.793h-2.793z" id="iconFg"/><path class="icon-vs-bg" d="M3 1v14h11v-10.207l-3.793-3.793h-7.207zm10 13h-9v-12h5v4h4v8zm-3-9v-2.793l2.793 2.793h-2.793z" id="iconBg"/></svg>

After

Width:  |  Height:  |  Size: 673 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-out{fill:#f6f6f6}.icon-vs-fg{fill:#f0eff1}.icon-vs-action-blue{fill:#00539c}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M0 15V6h6V2.586L7.585 1h6.829L16 2.586v5.829L14.414 10H10v5H0zm3-6z" id="outline"/><path class="icon-vs-fg" d="M8 3v3h5v1h-3v1h4V3H8zm5 2H9V4h4v1zM2 8v5h6V8H2zm5 3H3v-1h4v1z" id="iconFg"/><path class="icon-vs-action-blue" d="M10 6h3v1h-3V6zM9 4v1h4V4H9zm5-2H8L7 3v3h1V3h6v5h-4v1h4l1-1V3l-1-1zm-7 8H3v1h4v-1zm2-3v7H1V7h8zM8 8H2v5h6V8z" id="iconBg"/></svg>

After

Width:  |  Height:  |  Size: 664 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#2d2d30}.icon-vs-out{fill:#2d2d30}.icon-vs-fg{fill:#2b282e}.icon-vs-action-blue{fill:#75beff}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M0 15V6h6V2.586L7.585 1h6.829L16 2.586v5.829L14.414 10H10v5H0zm3-6z" id="outline"/><path class="icon-vs-fg" d="M8 3v3h5v1h-3v1h4V3H8zm5 2H9V4h4v1zM2 8v5h6V8H2zm5 3H3v-1h4v1z" id="iconFg"/><path class="icon-vs-action-blue" d="M10 6h3v1h-3V6zM9 4v1h4V4H9zm5-2H8L7 3v3h1V3h6v5h-4v1h4l1-1V3l-1-1zm-7 8H3v1h4v-1zm2-3v7H1V7h8zM8 8H2v5h6V8z" id="iconBg"/></svg>

After

Width:  |  Height:  |  Size: 664 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-out{fill:#f6f6f6}.icon-vs-fg{fill:#f0eff1}.icon-vs-action-orange{fill:#c27d1a}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M14.414 1L16 2.586v5.828L14.414 10H10v3.416L8.414 15H1.586L0 13.416v-5.83L1.586 6H6V2.586L7.586 1h6.828z" id="outline"/><path class="icon-vs-fg" d="M2 13h6V8H2v5zm1-4h4v1H3V9zm0 2h4v1H3v-1zm11-5V3H8v3h.414L9 6.586V6h4v1H9.414l.586.586V8h4V6zm-1-1H9V4h4v1z" id="iconFg"/><path class="icon-vs-action-orange" d="M3 11h4.001v1H3v-1zm0-1h4.001V9H3v1zm6-2v5l-1 1H2l-1-1V8l1-1h6l1 1zM8 8H2v5h6V8zm1-2l1 1h3V6H9zm0-1h4V4H9v1zm5-3H8L7 3v3h1V3h6v5h-4v1h4l1-1V3l-1-1z" id="iconBg"/></svg>

After

Width:  |  Height:  |  Size: 789 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#2d2d30}.icon-vs-out{fill:#2d2d30}.icon-vs-fg{fill:#2b282e}.icon-vs-action-orange{fill:#e8ab53}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M14.414 1L16 2.586v5.828L14.414 10H10v3.416L8.414 15H1.586L0 13.416v-5.83L1.586 6H6V2.586L7.586 1h6.828z" id="outline"/><path class="icon-vs-fg" d="M2 13h6V8H2v5zm1-4h4v1H3V9zm0 2h4v1H3v-1zm11-5V3H8v3h.414L9 6.586V6h4v1H9.414l.586.586V8h4V6zm-1-1H9V4h4v1z" id="iconFg"/><path class="icon-vs-action-orange" d="M3 11h4.001v1H3v-1zm0-1h4.001V9H3v1zm6-2v5l-1 1H2l-1-1V8l1-1h6l1 1zM8 8H2v5h6V8zm1-2l1 1h3V6H9zm0-1h4V4H9v1zm5-3H8L7 3v3h1V3h6v5h-4v1h4l1-1V3l-1-1z" id="iconBg"/></svg>

After

Width:  |  Height:  |  Size: 789 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-out{fill:#f6f6f6}.icon-vs-action-orange{fill:#c27d1a}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M14 1.414L9.414 6H14v1.414L5.414 16H3v-1.234L5.371 10H2V8.764L6.382 0H14v1.414z" id="outline" style="display: none;"/><path class="icon-vs-action-orange" d="M7 7h6l-8 8H4l2.985-6H3l4-8h6L7 7z" id="iconBg"/></svg>

After

Width:  |  Height:  |  Size: 499 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#2d2d30}.icon-vs-out{fill:#2d2d30}.icon-vs-action-orange{fill:#e8ab53}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M14 1.414L9.414 6H14v1.414L5.414 16H3v-1.234L5.371 10H2V8.764L6.382 0H14v1.414z" id="outline" style="display: none;"/><path class="icon-vs-action-orange" d="M7 7h6l-8 8H4l2.985-6H3l4-8h6L7 7z" id="iconBg"/></svg>

After

Width:  |  Height:  |  Size: 499 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" enable-background="new 0 0 16 16"><style type="text/css">.icon-canvas-transparent{opacity:0;fill:#F6F6F6;} .icon-vs-out{fill:#F6F6F6;} .icon-vs-fg{fill:#F0EFF1;} .icon-vs-action-blue{fill:#00539C;}</style><path class="icon-canvas-transparent" d="M16 16h-16v-16h16v16z" id="canvas"/><path class="icon-vs-out" d="M0 10.736v-6.236l9-4.5 7 3.5v6.236l-9 4.5-7-3.5z" id="outline"/><path class="icon-vs-action-blue" d="M9 1l-8 4v5l6 3 8-4v-5l-6-3zm-2 5.882l-3.764-1.882 5.764-2.882 3.764 1.882-5.764 2.882z" id="iconBg"/><path class="icon-vs-fg" d="M9 2.118l3.764 1.882-5.764 2.882-3.764-1.882 5.764-2.882z" id="iconFg"/></svg>

After

Width:  |  Height:  |  Size: 680 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#2d2d30}.icon-vs-out{fill:#2d2d30}.icon-vs-fg{fill:#2b282e}.icon-vs-action-blue{fill:#75beff}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M0 10.736V4.5L9 0l7 3.5v6.236l-9 4.5-7-3.5z" id="outline"/><path class="icon-vs-action-blue" d="M9 1L1 5v5l6 3 8-4V4L9 1zM7 6.882L3.236 5 9 2.118 12.764 4 7 6.882z" id="iconBg"/><path class="icon-vs-fg" d="M9 2.118L12.764 4 7 6.882 3.236 5 9 2.118z" id="iconFg"/></svg>

After

Width:  |  Height:  |  Size: 579 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-out{fill:#f6f6f6}.icon-vs-bg{fill:#424242}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M11 15v-3h2V4h-2V1h5v14h-5zM0 15V1h5v3H3v8h2v3H0z" id="outline"/><g id="iconBg"><path class="icon-vs-bg" d="M4 14H1V2h3v1H2v10h2v1zM15 2h-3v1h2v10h-2v1h3V2z"/></g></svg>

After

Width:  |  Height:  |  Size: 445 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#252526}.icon-vs-out{fill:#252526}.icon-vs-bg{fill:#c5c5c5}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M11 15v-3h2V4h-2V1h5v14h-5zM0 15V1h5v3H3v8h2v3H0z" id="outline"/><g id="iconBg"><path class="icon-vs-bg" d="M4 14H1V2h3v1H2v10h2v1zM15 2h-3v1h2v10h-2v1h3V2z"/></g></svg>

After

Width:  |  Height:  |  Size: 445 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-out{fill:#f6f6f6}.icon-vs-bg{fill:#424242}.icon-vs-fg{fill:#f0eff1}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M16 5V2H9V1H0v14h13v-3h3V9h-1V6H9V5h7zm-8 7V9h1v3H8z" id="outline"/><path class="icon-vs-fg" d="M2 3h5v1H2V3z" id="iconFg"/><g id="iconBg"><path class="icon-vs-bg" d="M15 4h-5V3h5v1zm-1 3h-2v1h2V7zm-4 0H1v1h9V7zm2 6H1v1h11v-1zm-5-3H1v1h6v-1zm8 0h-5v1h5v-1zM8 2v3H1V2h7zM7 3H2v1h5V3z"/></g></svg>

After

Width:  |  Height:  |  Size: 596 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#252526}.icon-vs-out{fill:#252526}.icon-vs-bg{fill:#c5c5c5}.icon-vs-fg{fill:#2a292c}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M16 5V2H9V1H0v14h13v-3h3V9h-1V6H9V5h7zm-8 7V9h1v3H8z" id="outline"/><path class="icon-vs-fg" d="M2 3h5v1H2V3z" id="iconFg"/><g id="iconBg"><path class="icon-vs-bg" d="M15 4h-5V3h5v1zm-1 3h-2v1h2V7zm-4 0H1v1h9V7zm2 6H1v1h11v-1zm-5-3H1v1h6v-1zm8 0h-5v1h5v-1zM8 2v3H1V2h7zM7 3H2v1h5V3z"/></g></svg>

After

Width:  |  Height:  |  Size: 596 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" enable-background="new 0 0 16 16"><style type="text/css">.icon-canvas-transparent{opacity:0;fill:#F6F6F6;} .icon-vs-out{fill:#F6F6F6;} .icon-vs-fg{fill:#F0EFF1;} .icon-vs-action-blue{fill:#00539C;}</style><path class="icon-canvas-transparent" d="M16 16h-16v-16h16v16z" id="canvas"/><path class="icon-vs-out" d="M11.5 12c-1.915 0-3.602-1.241-4.228-3h-1.41c-.536.985-1.572 1.625-2.737 1.625-1.723 0-3.125-1.402-3.125-3.125s1.402-3.125 3.125-3.125c1.165 0 2.201.639 2.737 1.625h1.41c.626-1.759 2.313-3 4.228-3 2.481 0 4.5 2.019 4.5 4.5s-2.019 4.5-4.5 4.5z" id="outline"/><path class="icon-vs-fg" d="M11.5 9c-.827 0-1.5-.674-1.5-1.5 0-.828.673-1.5 1.5-1.5s1.5.672 1.5 1.5c0 .826-.673 1.5-1.5 1.5z" id="iconFg"/><path class="icon-vs-action-blue" d="M11.5 4c-1.762 0-3.205 1.306-3.45 3h-2.865c-.226-.931-1.059-1.625-2.06-1.625-1.174 0-2.125.951-2.125 2.125s.951 2.125 2.125 2.125c1 0 1.834-.694 2.06-1.625h2.865c.245 1.694 1.688 3 3.45 3 1.933 0 3.5-1.567 3.5-3.5s-1.567-3.5-3.5-3.5zm0 5c-.827 0-1.5-.673-1.5-1.5s.673-1.5 1.5-1.5 1.5.673 1.5 1.5-.673 1.5-1.5 1.5z" id="iconBg"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#2d2d30}.icon-vs-out{fill:#2d2d30}.icon-vs-fg{fill:#2b282e}.icon-vs-action-blue{fill:#75beff}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M11.5 12c-1.915 0-3.602-1.241-4.228-3h-1.41a3.11 3.11 0 0 1-2.737 1.625C1.402 10.625 0 9.223 0 7.5s1.402-3.125 3.125-3.125c1.165 0 2.201.639 2.737 1.625h1.41c.626-1.759 2.313-3 4.228-3C13.981 3 16 5.019 16 7.5S13.981 12 11.5 12z" id="outline"/><path class="icon-vs-fg" d="M11.5 9A1.501 1.501 0 1 1 13 7.5c0 .826-.673 1.5-1.5 1.5z" id="iconFg"/><path class="icon-vs-action-blue" d="M11.5 4a3.49 3.49 0 0 0-3.45 3H5.185A2.122 2.122 0 0 0 1 7.5a2.123 2.123 0 1 0 4.185.5H8.05a3.49 3.49 0 0 0 3.45 3 3.5 3.5 0 1 0 0-7zm0 5c-.827 0-1.5-.673-1.5-1.5S10.673 6 11.5 6s1.5.673 1.5 1.5S12.327 9 11.5 9z" id="iconBg"/></svg>

After

Width:  |  Height:  |  Size: 923 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-out{fill:#f6f6f6}.icon-vs-bg{fill:#424242}.icon-vs-fg{fill:#f0eff1}.icon-vs-action-blue{fill:#00539c}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M11 3v1.015L8.733 2.882 5 4.749V3H0v10h5v-1.859l2.156 1.077L11 10.295V13h5V3h-5z" id="outline" style="display: none;"/><path class="icon-vs-bg" d="M2 5v6h2v1H1V4h3v1H2zm10 6v1h3V4h-3v1h2v6h-2z" id="iconBg"/><path class="icon-vs-fg" d="M7.156 7.156l-1.578-.789 3.156-1.578 1.578.789-3.156 1.578z" id="iconFg" style="display: none;"/><path class="icon-vs-action-blue" d="M8.733 4L4 6.367v3.156L7.156 11.1l4.733-2.367V5.578L8.733 4zM7.156 7.156l-1.578-.789 3.156-1.578 1.578.789-3.156 1.578z" id="colorImportance"/></svg>

After

Width:  |  Height:  |  Size: 853 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#2d2d30}.icon-vs-out{fill:#2d2d30}.icon-vs-bg{fill:#c5c5c5}.icon-vs-fg{fill:#2b282e}.icon-vs-action-blue{fill:#75beff}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M11 3v1.015L8.733 2.882 5 4.749V3H0v10h5v-1.859l2.156 1.077L11 10.295V13h5V3h-5z" id="outline" style="display: none;"/><path class="icon-vs-bg" d="M2 5v6h2v1H1V4h3v1H2zm10 6v1h3V4h-3v1h2v6h-2z" id="iconBg"/><path class="icon-vs-fg" d="M7.156 7.156l-1.578-.789 3.156-1.578 1.578.789-3.156 1.578z" id="iconFg" style="display: none;"/><path class="icon-vs-action-blue" d="M8.733 4L4 6.367v3.156L7.156 11.1l4.733-2.367V5.578L8.733 4zM7.156 7.156l-1.578-.789 3.156-1.578 1.578.789-3.156 1.578z" id="colorImportance"/></svg>

After

Width:  |  Height:  |  Size: 853 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.icon-vs-fg{fill:#f0eff1;}.icon-vs-action-purple{fill:#652d90;}</style></defs><title>Method_16x</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,16H0V0H16Z"/></g><g id="outline"><path class="icon-vs-out" d="M15,3.349v8.4L8.975,16h-.9L1,11.582V3.327L7.6,0H8.713Z"/></g><g id="iconFg"><path class="icon-vs-fg" d="M12.715,4.4,8.487,7.02,3.565,4.272,8.144,1.963ZM3,5.1,8,7.894v5.7L3,10.473Zm6,8.434V7.878L13,5.4v5.318Z"/></g><g id="iconBg"><path class="icon-vs-action-purple" d="M8.156.837,2,3.942v7.085L8.517,15.1,14,11.233V3.95ZM12.715,4.4,8.487,7.02,3.565,4.272,8.144,1.963ZM3,5.1,8,7.894v5.7L3,10.473Zm6,8.434V7.878L13,5.4v5.318Z"/></g></svg>

After

Width:  |  Height:  |  Size: 821 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#252526;}.icon-canvas-transparent{opacity:0;}.icon-vs-fg{fill:#2a292c;}.icon-vs-action-purple{fill:#b180d7;}</style></defs><title>Method_16x</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,16H0V0H16Z"/></g><g id="outline"><path class="icon-vs-out" d="M15,3.349v8.4L8.975,16h-.9L1,11.582V3.327L7.6,0H8.713Z"/></g><g id="iconFg"><path class="icon-vs-fg" d="M12.715,4.4,8.487,7.02,3.565,4.272,8.144,1.963ZM3,5.1,8,7.894v5.7L3,10.473Zm6,8.434V7.878L13,5.4v5.318Z"/></g><g id="iconBg"><path class="icon-vs-action-purple" d="M8.156.837,2,3.942v7.085L8.517,15.1,14,11.233V3.95ZM12.715,4.4,8.487,7.02,3.565,4.272,8.144,1.963ZM3,5.1,8,7.894v5.7L3,10.473Zm6,8.434V7.878L13,5.4v5.318Z"/></g></svg>

After

Width:  |  Height:  |  Size: 821 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-out{fill:#f6f6f6}.icon-vs-bg{fill:#424242}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M9.26 11.984l.978-.021a.962.962 0 0 0 .09-.006c.011-.063.026-.179.026-.361V9.688c0-.679.185-1.257.53-1.707-.346-.452-.53-1.03-.53-1.705V4.35c0-.167-.021-.259-.034-.302L9.26 4.02V.973l1.011.011c2.167.024 3.409 1.156 3.409 3.105v1.962c0 .351.071.461.072.462l.936.06.053.927v1.936l-.936.061c-.076.016-.125.146-.125.424v2.017c0 .914-.332 3.043-3.408 3.078l-1.012.011v-3.043zm-3.521 3.032c-3.089-.035-3.422-2.164-3.422-3.078V9.921c0-.327-.066-.432-.067-.433l-.937-.06-.063-.929V6.563l.942-.06c.058 0 .125-.114.125-.452V4.09c0-1.949 1.248-3.081 3.422-3.105L6.75.973V4.02l-.975.023a.572.572 0 0 0-.093.01c.006.021-.019.115-.019.297v1.928c0 .675-.186 1.253-.534 1.705.348.45.534 1.028.534 1.707v1.907c0 .175.014.291.027.363.023.002 1.06.025 1.06.025v3.043l-1.011-.012z" id="outline"/><g id="iconBg"><path class="icon-vs-bg" d="M5.75 14.016c-1.623-.019-2.434-.711-2.434-2.078V9.921c0-.902-.355-1.376-1.066-1.422v-.998c.711-.045 1.066-.529 1.066-1.449V4.09c0-1.385.811-2.087 2.434-2.105v1.06c-.725.017-1.087.453-1.087 1.305v1.928c0 .92-.454 1.488-1.36 1.702V8c.907.201 1.36.763 1.36 1.688v1.907c0 .488.081.835.243 1.042.162.208.443.316.844.325v1.054zm7.99-5.517c-.706.045-1.06.52-1.06 1.422v2.017c0 1.367-.807 2.06-2.42 2.078v-1.053c.396-.009.678-.118.844-.328.167-.21.25-.556.25-1.039V9.688c0-.925.449-1.488 1.347-1.688v-.021c-.898-.214-1.347-.782-1.347-1.702V4.35c0-.852-.364-1.288-1.094-1.306v-1.06c1.613.018 2.42.72 2.42 2.105v1.962c0 .92.354 1.404 1.06 1.449v.999z"/></g></svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#252526}.icon-vs-out{fill:#252526}.icon-vs-bg{fill:#c5c5c5}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M9.26 11.984l.978-.021a.962.962 0 0 0 .09-.006c.011-.063.026-.179.026-.361V9.688c0-.679.185-1.257.53-1.707-.346-.452-.53-1.03-.53-1.705V4.35c0-.167-.021-.259-.034-.302L9.26 4.02V.973l1.011.011c2.167.024 3.409 1.156 3.409 3.105v1.962c0 .351.071.461.072.462l.936.06.053.927v1.936l-.936.061c-.076.016-.125.146-.125.424v2.017c0 .914-.332 3.043-3.408 3.078l-1.012.011v-3.043zm-3.521 3.032c-3.089-.035-3.422-2.164-3.422-3.078V9.921c0-.327-.066-.432-.067-.433l-.937-.06-.063-.929V6.563l.942-.06c.058 0 .125-.114.125-.452V4.09c0-1.949 1.248-3.081 3.422-3.105L6.75.973V4.02l-.975.023a.572.572 0 0 0-.093.01c.006.021-.019.115-.019.297v1.928c0 .675-.186 1.253-.534 1.705.348.45.534 1.028.534 1.707v1.907c0 .175.014.291.027.363.023.002 1.06.025 1.06.025v3.043l-1.011-.012z" id="outline"/><g id="iconBg"><path class="icon-vs-bg" d="M5.75 14.016c-1.623-.019-2.434-.711-2.434-2.078V9.921c0-.902-.355-1.376-1.066-1.422v-.998c.711-.045 1.066-.529 1.066-1.449V4.09c0-1.385.811-2.087 2.434-2.105v1.06c-.725.017-1.087.453-1.087 1.305v1.928c0 .92-.454 1.488-1.36 1.702V8c.907.201 1.36.763 1.36 1.688v1.907c0 .488.081.835.243 1.042.162.208.443.316.844.325v1.054zm7.99-5.517c-.706.045-1.06.52-1.06 1.422v2.017c0 1.367-.807 2.06-2.42 2.078v-1.053c.396-.009.678-.118.844-.328.167-.21.25-.556.25-1.039V9.688c0-.925.449-1.488 1.347-1.688v-.021c-.898-.214-1.347-.782-1.347-1.702V4.35c0-.852-.364-1.288-1.094-1.306v-1.06c1.613.018 2.42.72 2.42 2.105v1.962c0 .92.354 1.404 1.06 1.449v.999z"/></g></svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-out{fill:#f6f6f6}.icon-vs-bg{fill:#424242}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M9 15v-3H7v3H4v-3H1V9h3V7H1V4h3V1h3v3h2V1h3v3h3v3h-3v2h3v3h-3v3H9z" id="outline"/><g id="iconBg"><path class="icon-vs-bg" d="M14 6V5h-3V2h-1v3H6V2H5v3H2v1h3v4H2v1h3v3h1v-3h4v3h1v-3h3v-1h-3V6h3zm-4 4H6V6h4v4z"/></g></svg>

After

Width:  |  Height:  |  Size: 496 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#252526}.icon-vs-out{fill:#252526}.icon-vs-bg{fill:#c5c5c5}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M9 15v-3H7v3H4v-3H1V9h3V7H1V4h3V1h3v3h2V1h3v3h3v3h-3v2h3v3h-3v3H9z" id="outline"/><g id="iconBg"><path class="icon-vs-bg" d="M14 6V5h-3V2h-1v3H6V2H5v3H2v1h3v4H2v1h3v3h1v-3h4v3h1v-3h3v-1h-3V6h3zm-4 4H6V6h4v4z"/></g></svg>

After

Width:  |  Height:  |  Size: 496 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-out{fill:#f6f6f6}.icon-vs-fg{fill:#f0eff1}.icon-vs-action-blue{fill:#00539c}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M16 16H0V0h16v16z" id="outline" style="display: none;"/><path class="icon-vs-action-blue" d="M1 1v14h14V1H1zm6 12H3v-1h4v1zm0-3H3V9h4v1zm0-5H5v2H4V5H2V4h2V2h1v2h2v1zm3.281 8H8.719l3-4h1.563l-3.001 4zM14 5H9V4h5v1z" id="iconBg"/><path class="icon-vs-fg" d="M7 5H5v2H4V5H2V4h2V2h1v2h2v1zm7-1H9v1h5V4zM7 9H3v1h4V9zm0 3H3v1h4v-1zm3.281 1l3-4h-1.563l-3 4h1.563z" id="iconFg" style="display: none;"/></svg>

After

Width:  |  Height:  |  Size: 710 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#2d2d30}.icon-vs-out{fill:#2d2d30}.icon-vs-fg{fill:#2b282e}.icon-vs-action-blue{fill:#75beff}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M16 16H0V0h16v16z" id="outline" style="display: none;"/><path class="icon-vs-action-blue" d="M1 1v14h14V1H1zm6 12H3v-1h4v1zm0-3H3V9h4v1zm0-5H5v2H4V5H2V4h2V2h1v2h2v1zm3.281 8H8.719l3-4h1.563l-3.001 4zM14 5H9V4h5v1z" id="iconBg"/><path class="icon-vs-fg" d="M7 5H5v2H4V5H2V4h2V2h1v2h2v1zm7-1H9v1h5V4zM7 9H3v1h4V9zm0 3H3v1h4v-1zm3.281 1l3-4h-1.563l-3 4h1.563z" id="iconFg" style="display: none;"/></svg>

After

Width:  |  Height:  |  Size: 710 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.icon-vs-bg{fill:#424242;}</style></defs><title>Property_16x</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,16H0V0H16Z"/></g><g id="outline"><path class="icon-vs-out" d="M16,5.5a5.46,5.46,0,0,1-6.307,5.434l-.078-.012a5.439,5.439,0,0,1-.811-.191L4.268,15.268A2.5,2.5,0,0,1,.732,11.732L5.269,7.2a5.452,5.452,0,0,1-.191-.812c0-.025-.008-.051-.012-.077A5.5,5.5,0,1,1,16,5.5Z"/></g><g id="iconBg"><path class="icon-vs-bg" d="M15,5.5A4.474,4.474,0,0,1,8.571,9.55l-5.01,5.01a1.5,1.5,0,0,1-2.122-2.12L6.45,7.429A4.474,4.474,0,0,1,12.429,1.45L9.636,4.243l2.121,2.121L14.55,3.571A4.462,4.462,0,0,1,15,5.5Z"/></g></svg>

After

Width:  |  Height:  |  Size: 789 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#252526;}.icon-canvas-transparent{opacity:0;}.icon-vs-bg{fill:#c5c5c5;}</style></defs><title>Property_16x</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,16H0V0H16Z"/></g><g id="outline"><path class="icon-vs-out" d="M16,5.5a5.46,5.46,0,0,1-6.307,5.434l-.078-.012a5.439,5.439,0,0,1-.811-.191L4.268,15.268A2.5,2.5,0,0,1,.732,11.732L5.269,7.2a5.452,5.452,0,0,1-.191-.812c0-.025-.008-.051-.012-.077A5.5,5.5,0,1,1,16,5.5Z"/></g><g id="iconBg"><path class="icon-vs-bg" d="M15,5.5A4.474,4.474,0,0,1,8.571,9.55l-5.01,5.01a1.5,1.5,0,0,1-2.122-2.12L6.45,7.429A4.474,4.474,0,0,1,12.429,1.45L9.636,4.243l2.121,2.121L14.55,3.571A4.462,4.462,0,0,1,15,5.5Z"/></g></svg>

After

Width:  |  Height:  |  Size: 789 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.st0{opacity:0}.st0,.st1{fill:#f6f6f6}.st2{fill:#424242}.st3{fill:none}.st4{fill:#f0eff1}</style><g id="outline"><path class="st0" d="M0 0h16v16H0z"/><path class="st1" d="M2 0h13v15H2z"/></g><g id="icon_x5F_bg"><path class="st2" d="M7 13h1v1H7zM5 13h1v1H5zM3 13h1v1H3zM9 13h1v1H9zM11 13h1v1h-1zM13 13h1v1h-1zM3 1v11h1V2h9v10h1V1z"/></g><g id="icon_x5F_fg"><path class="st3" d="M13 2H4h9z"/><path class="st4" d="M4 2h9v10H4z"/></g></svg>

After

Width:  |  Height:  |  Size: 503 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.st0{opacity:0}.st0,.st1{fill:#252526}.st2{fill:#c5c5c5}.st3{fill:none}.st4{fill:#2a292c}</style><g id="outline"><path class="st0" d="M0 0h16v16H0z"/><path class="st1" d="M2 0h13v15H2z"/></g><g id="icon_x5F_bg"><path class="st2" d="M7 13h1v1H7zM5 13h1v1H5zM3 13h1v1H3zM9 13h1v1H9zM11 13h1v1h-1zM13 13h1v1h-1zM3 1v11h1V2h9v10h1V1z"/></g><g id="icon_x5F_fg"><path class="st3" d="M13 2H4h9z"/><path class="st4" d="M4 2h9v10H4z"/></g></svg>

After

Width:  |  Height:  |  Size: 503 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-out{fill:#f6f6f6}.icon-vs-bg{fill:#424242}</style><path class="icon-canvas-transparent" d="M0 0h16v16H0z" id="canvas"/><path class="icon-vs-out" d="M15.256 5.539a3.579 3.579 0 0 0-1.501-.306c-1.014 0-1.85.328-2.482.974-.084.086-.149.185-.222.278-.057-.091-.109-.186-.175-.27-.512-.642-1.243-.982-2.117-.982-.189 0-.372.016-.547.048V3.176h-3.02v2.736c-.463-.438-1.123-.68-1.949-.68-.8 0-1.524.189-2.153.562l-.49.291v2.081c-.288.393-.44.887-.44 1.464 0 .667.236 1.246.684 1.676.442.423 1.024.638 1.731.638.265 0 .517-.036.753-.105H7.8c.237.07.49.105.755.105.928 0 1.709-.365 2.258-1.055.052-.066.091-.142.138-.212.087.117.171.236.275.342.604.614 1.388.925 2.33.925.668 0 1.267-.15 1.779-.446l.5-.289V9.39l.004.003V5.806l-.583-.267zm-6.88 3.59l-.123-.013c-.024-.026-.051-.055-.051-.159v-.558c0-.21.063-.284.09-.315.021-.024.033-.038.119-.038l.033-.003c.02.025.084.128.084.418-.001.418-.091.587-.152.668zm5.834-.165c-.191.154-.326.171-.411.171-.229 0-.293-.066-.322-.097-.073-.076-.11-.214-.11-.411 0-.31.103-.418.14-.458.057-.061.134-.125.332-.125.086 0 .221.016.403.152l.479.358-.511.41z" id="outline"/><g id="iconBg"><path class="icon-vs-bg" d="M3.243 6.233c-.621 0-1.169.141-1.644.422v.892c.431-.369.914-.554 1.45-.554.609 0 .914.321.914.962l-1.336.189c-.978.141-1.467.636-1.467 1.486 0 .396.125.713.375.954.251.24.597.36 1.04.36.601 0 1.056-.27 1.367-.809h.018v.703h.989V7.911c-.001-1.119-.57-1.678-1.706-1.678zm.72 2.786c0 .331-.102.606-.305.824a1.011 1.011 0 0 1-.771.327c-.229 0-.411-.061-.547-.183a.595.595 0 0 1-.205-.467c0-.261.074-.443.222-.547.147-.104.368-.175.661-.213l.945-.132v.391zM8.758 6.233c-.671 0-1.181.299-1.529.896h-.018V4.176h-1.02v6.662h1.02v-.65h.018c.299.504.741.756 1.327.756.624 0 1.116-.227 1.476-.679.361-.453.541-1.056.541-1.809 0-.677-.16-1.216-.48-1.619s-.767-.604-1.335-.604zm.445 3.46c-.214.294-.511.441-.889.441-.322 0-.588-.114-.798-.343s-.314-.506-.314-.834v-.558c0-.387.11-.709.332-.967s.514-.387.877-.387c.343 0 .615.125.816.375.199.251.301.597.301 1.04-.001.528-.108.939-.325 1.233zM13.838 7.046c.354 0 .688.117 1.002.352v-.95a2.572 2.572 0 0 0-1.085-.215c-.738 0-1.328.225-1.769.675-.441.45-.662 1.045-.662 1.786 0 .665.205 1.206.615 1.624.41.417.949.626 1.617.626.492 0 .919-.104 1.279-.312v-.888c-.325.261-.671.391-1.037.391-.437 0-.784-.135-1.044-.404-.259-.27-.389-.637-.389-1.103 0-.472.138-.853.413-1.145.277-.291.63-.437 1.06-.437z"/></g></svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#252526}.icon-vs-out{fill:#252526}.icon-vs-bg{fill:#c5c5c5}</style><path class="icon-canvas-transparent" d="M0 0h16v16H0z" id="canvas"/><path class="icon-vs-out" d="M15.256 5.539a3.579 3.579 0 0 0-1.501-.306c-1.014 0-1.85.328-2.482.974-.084.086-.149.185-.222.278-.057-.091-.109-.186-.175-.27-.512-.642-1.243-.982-2.117-.982-.189 0-.372.016-.547.048V3.176h-3.02v2.736c-.463-.438-1.123-.68-1.949-.68-.8 0-1.524.189-2.153.562l-.49.291v2.081c-.288.393-.44.887-.44 1.464 0 .667.236 1.246.684 1.676.442.423 1.024.638 1.731.638.265 0 .517-.036.753-.105H7.8c.237.07.49.105.755.105.928 0 1.709-.365 2.258-1.055.052-.066.091-.142.138-.212.087.117.171.236.275.342.604.614 1.388.925 2.33.925.668 0 1.267-.15 1.779-.446l.5-.289V9.39l.004.003V5.806l-.583-.267zm-6.88 3.59l-.123-.013c-.024-.026-.051-.055-.051-.159v-.558c0-.21.063-.284.09-.315.021-.024.033-.038.119-.038l.033-.003c.02.025.084.128.084.418-.001.418-.091.587-.152.668zm5.834-.165c-.191.154-.326.171-.411.171-.229 0-.293-.066-.322-.097-.073-.076-.11-.214-.11-.411 0-.31.103-.418.14-.458.057-.061.134-.125.332-.125.086 0 .221.016.403.152l.479.358-.511.41z" id="outline"/><g id="iconBg"><path class="icon-vs-bg" d="M3.243 6.233c-.621 0-1.169.141-1.644.422v.892c.431-.369.914-.554 1.45-.554.609 0 .914.321.914.962l-1.336.189c-.978.141-1.467.636-1.467 1.486 0 .396.125.713.375.954.251.24.597.36 1.04.36.601 0 1.056-.27 1.367-.809h.018v.703h.989V7.911c-.001-1.119-.57-1.678-1.706-1.678zm.72 2.786c0 .331-.102.606-.305.824a1.011 1.011 0 0 1-.771.327c-.229 0-.411-.061-.547-.183a.595.595 0 0 1-.205-.467c0-.261.074-.443.222-.547.147-.104.368-.175.661-.213l.945-.132v.391zM8.758 6.233c-.671 0-1.181.299-1.529.896h-.018V4.176h-1.02v6.662h1.02v-.65h.018c.299.504.741.756 1.327.756.624 0 1.116-.227 1.476-.679.361-.453.541-1.056.541-1.809 0-.677-.16-1.216-.48-1.619s-.767-.604-1.335-.604zm.445 3.46c-.214.294-.511.441-.889.441-.322 0-.588-.114-.798-.343s-.314-.506-.314-.834v-.558c0-.387.11-.709.332-.967s.514-.387.877-.387c.343 0 .615.125.816.375.199.251.301.597.301 1.04-.001.528-.108.939-.325 1.233zM13.838 7.046c.354 0 .688.117 1.002.352v-.95a2.572 2.572 0 0 0-1.085-.215c-.738 0-1.328.225-1.769.675-.441.45-.662 1.045-.662 1.786 0 .665.205 1.206.615 1.624.41.417.949.626 1.617.626.492 0 .919-.104 1.279-.312v-.888c-.325.261-.671.391-1.037.391-.437 0-.784-.135-1.044-.404-.259-.27-.389-.637-.389-1.103 0-.472.138-.853.413-1.145.277-.291.63-.437 1.06-.437z"/></g></svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-out{fill:#f6f6f6}.icon-vs-action-blue{fill:#00539c}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M9 14V8H7v6H1V2h14v12H9z" id="outline" style="display: none;"/><path class="icon-vs-action-blue" d="M10 9h4v4h-4V9zm-8 4h4V9H2v4zM2 3v4h12V3H2z" id="iconBg"/></svg>

After

Width:  |  Height:  |  Size: 449 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#2d2d30}.icon-vs-out{fill:#2d2d30}.icon-vs-action-blue{fill:#75beff}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M9 14V8H7v6H1V2h14v12H9z" id="outline" style="display: none;"/><path class="icon-vs-action-blue" d="M10 9h4v4h-4V9zm-8 4h4V9H2v4zM2 3v4h12V3H2z" id="iconBg"/></svg>

After

Width:  |  Height:  |  Size: 449 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-out{fill:#f6f6f6}.icon-vs-bg{fill:#424242}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M10.702 10.5l2-2-2-2 .5-.5H10v5h1v3H5v-3h1V6H4.798l.5.5-2 2 2 2L3 12.797l-3-3V7.201l3-3V2h10v2.201l3 3v2.596l-3 3-2.298-2.297z" id="outline" style="display: none;"/><path class="icon-vs-bg" d="M4 3h8v2h-1v-.5c0-.277-.224-.5-.5-.5H9v7.5c0 .275.224.5.5.5h.5v1H6v-1h.5a.5.5 0 0 0 .5-.5V4H5.5a.5.5 0 0 0-.5.5V5H4V3zM3 5.615L.116 8.5 3 11.383l.884-.883-2-2 2-2L3 5.615zm10 0l-.884.885 2 2-2 2 .884.883L15.884 8.5 13 5.615z" id="iconBg"/></svg>

After

Width:  |  Height:  |  Size: 714 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#2d2d30}.icon-vs-out{fill:#2d2d30}.icon-vs-bg{fill:#c5c5c5}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M10.702 10.5l2-2-2-2 .5-.5H10v5h1v3H5v-3h1V6H4.798l.5.5-2 2 2 2L3 12.797l-3-3V7.201l3-3V2h10v2.201l3 3v2.596l-3 3-2.298-2.297z" id="outline" style="display: none;"/><path class="icon-vs-bg" d="M4 3h8v2h-1v-.5c0-.277-.224-.5-.5-.5H9v7.5c0 .275.224.5.5.5h.5v1H6v-1h.5a.5.5 0 0 0 .5-.5V4H5.5a.5.5 0 0 0-.5.5V5H4V3zM3 5.615L.116 8.5 3 11.383l.884-.883-2-2 2-2L3 5.615zm10 0l-.884.885 2 2-2 2 .884.883L15.884 8.5 13 5.615z" id="iconBg"/></svg>

After

Width:  |  Height:  |  Size: 714 B

View File

@@ -0,0 +1,66 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
.monaco-tree.focused .selected .outline-element-label, .monaco-tree.focused .selected .outline-element-decoration {
/* make sure selection color wins when a label is being selected */
color: inherit !important;
}
.monaco-tree .outline-element {
display: flex;
flex: 1;
flex-flow: row nowrap;
align-items: center;
}
.monaco-tree .outline-element .outline-element-icon {
padding-right: 3px;
}
/* .monaco-tree.no-icons .outline-element .outline-element-icon {
display: none;
} */
.monaco-tree .outline-element .outline-element-label {
text-overflow: ellipsis;
overflow: hidden;
color: var(--outline-element-color);
}
.monaco-tree .outline-element .outline-element-label .monaco-highlighted-label .highlight {
font-weight: bold;
}
.monaco-tree .outline-element .outline-element-detail {
visibility: hidden;
flex: 1;
flex-basis: 10%;
opacity: 0.8;
overflow: hidden;
text-overflow: ellipsis;
font-size: 90%;
padding-left: 4px;
padding-top: 3px;
}
.monaco-tree .monaco-tree-row.focused .outline-element .outline-element-detail {
visibility: inherit;
}
.monaco-tree .outline-element .outline-element-decoration {
opacity: 0.75;
font-size: 90%;
font-weight: 600;
padding: 0 12px 0 5px;
margin-left: auto;
text-align: center;
color: var(--outline-element-color);
}
.monaco-tree .outline-element .outline-element-decoration.bubble {
font-family: octicons;
font-size: 14px;
opacity: 0.4;
}

View File

@@ -0,0 +1,276 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
.monaco-workbench .symbol-icon {
display: inline-block;
height: 14px;
width: 16px;
min-height: 14px;
min-width: 16px;
}
/* default icons */
.monaco-workbench .symbol-icon {
background-image: url('Field_16x.svg');
background-repeat: no-repeat;
}
.vs-dark .monaco-workbench .symbol-icon,
.hc-black .monaco-workbench .symbol-icon {
background-image: url('Field_16x_darkp.svg');
}
/* constant */
.monaco-workbench .symbol-icon.constant {
background-image: url('Constant_16x.svg');
}
.vs-dark .monaco-workbench .symbol-icon.constant,
.hc-black .monaco-workbench .symbol-icon.constant {
background-image: url('Constant_16x_inverse.svg');
}
/* enum */
.monaco-workbench .symbol-icon.enum {
background-image: url('Enumerator_16x.svg');
}
.vs-dark .monaco-workbench .symbol-icon.enum,
.hc-black .monaco-workbench .symbol-icon.enum {
background-image: url('Enumerator_inverse_16x.svg');
}
/* enum-member */
.monaco-workbench .symbol-icon.enum-member {
background-image: url('EnumItem_16x.svg');
}
.vs-dark .monaco-workbench .symbol-icon.enum-member,
.hc-black .monaco-workbench .symbol-icon.enum-member {
background-image: url('EnumItem_inverse_16x.svg');
}
/* struct */
.monaco-workbench .symbol-icon.struct {
background-image: url('Structure_16x_vscode.svg');
}
.vs-dark .monaco-workbench .symbol-icon.struct,
.hc-black .monaco-workbench .symbol-icon.struct {
background-image: url('Structure_16x_vscode_inverse.svg');
}
/* event */
.monaco-workbench .symbol-icon.event {
background-image: url('Event_16x_vscode.svg');
}
.vs-dark .monaco-workbench .symbol-icon.event,
.hc-black .monaco-workbench .symbol-icon.event {
background-image: url('Event_16x_vscode_inverse.svg');
}
/* operator */
.monaco-workbench .symbol-icon.operator {
background-image: url('Operator_16x_vscode.svg');
}
.vs-dark .monaco-workbench .symbol-icon.operator,
.hc-black .monaco-workbench .symbol-icon.operator {
background-image: url('Operator_16x_vscode_inverse.svg');
}
/* type paramter */
.monaco-workbench .symbol-icon.type-parameter {
background-image: url('Template_16x_vscode.svg');
}
.vs-dark .monaco-workbench .symbol-icon.type-parameter,
.hc-black .monaco-workbench .symbol-icon.type-parameter {
background-image: url('Template_16x_vscode_inverse.svg');
}
/* boolean, null */
.monaco-workbench .symbol-icon.boolean {
background-image: url('BooleanData_16x.svg');
}
.vs-dark .monaco-workbench .symbol-icon.boolean,
.hc-black .monaco-workbench .symbol-icon.boolean {
background-image: url('BooleanData_16x_darkp.svg');
}
/* null */
.monaco-workbench .symbol-icon.null {
background-image: url('BooleanData_16x.svg');
}
.vs-dark .monaco-workbench .symbol-icon.null,
.hc-black .monaco-workbench .symbol-icon.null {
background-image: url('BooleanData_16x_darkp.svg');
}
/* class */
.monaco-workbench .symbol-icon.class {
background-image: url('Class_16x.svg');
}
.vs-dark .monaco-workbench .symbol-icon.class,
.hc-black .monaco-workbench .symbol-icon.class {
background-image: url('Class_16x_darkp.svg');
}
/* constructor */
.monaco-workbench .symbol-icon.constructor {
background-image: url('Method_16x.svg');
}
.vs-dark .monaco-workbench .symbol-icon.constructor,
.hc-black .monaco-workbench .symbol-icon.constructor {
background-image: url('Method_16x_darkp.svg');
}
/* file */
.monaco-workbench .symbol-icon.file {
background-image: url('Document_16x.svg');
}
.vs-dark .monaco-workbench .symbol-icon.file,
.hc-black .monaco-workbench .symbol-icon.file {
background-image: url('Document_16x_darkp.svg');
}
/* field */
.monaco-workbench .symbol-icon.field {
background-image: url('Field_16x.svg');
}
.vs-dark .monaco-workbench .symbol-icon.field,
.hc-black .monaco-workbench .symbol-icon.field {
background-image: url('Field_16x_darkp.svg');
}
/* variable */
.monaco-workbench .symbol-icon.variable {
background-image: url('LocalVariable_16x_vscode.svg');
}
.vs-dark .monaco-workbench .symbol-icon.variable,
.hc-black .monaco-workbench .symbol-icon.variable {
background-image: url('LocalVariable_16x_vscode_inverse.svg');
}
/* array */
.monaco-workbench .symbol-icon.array {
background-image: url('Indexer_16x.svg');
}
.vs-dark .monaco-workbench .symbol-icon.array,
.hc-black .monaco-workbench .symbol-icon.array {
background-image: url('Indexer_16x_darkp.svg');
}
/* keyword */
/* todo@joh not used? */
.monaco-workbench .symbol-icon.keyword {
background-image: url('IntelliSenseKeyword_16x.svg');
}
.vs-dark .monaco-workbench .symbol-icon.keyword,
.hc-black .monaco-workbench .symbol-icon.keyword {
background-image: url('IntelliSenseKeyword_16x_darkp.svg');
}
/* interface */
.monaco-workbench .symbol-icon.interface {
background-image: url('Interface_16x.svg');
}
.vs-dark .monaco-workbench .symbol-icon.interface,
.hc-black .monaco-workbench .symbol-icon.interface {
background-image: url('Interface_16x_darkp.svg');
}
/* method */
.monaco-workbench .symbol-icon.method {
background-image: url('Method_16x.svg');
}
.vs-dark .monaco-workbench .symbol-icon.method,
.hc-black .monaco-workbench .symbol-icon.method {
background-image: url('Method_16x_darkp.svg');
}
/* function */
.monaco-workbench .symbol-icon.function {
background-image: url('Method_16x.svg');
}
.vs-dark .monaco-workbench .symbol-icon.function,
.hc-black .monaco-workbench .symbol-icon.function {
background-image: url('Method_16x_darkp.svg');
}
/* object */
.monaco-workbench .symbol-icon.object {
background-image: url('Namespace_16x.svg');
}
.vs-dark .monaco-workbench .symbol-icon.object,
.hc-black .monaco-workbench .symbol-icon.object {
background-image: url('Namespace_16x_darkp.svg');
}
/* namespace */
.monaco-workbench .symbol-icon.namespace {
background-image: url('Namespace_16x.svg');
}
.vs-dark .monaco-workbench .symbol-icon.namespace,
.hc-black .monaco-workbench .symbol-icon.namespace {
background-image: url('Namespace_16x_darkp.svg');
}
/* package */
.monaco-workbench .symbol-icon.package {
background-image: url('Namespace_16x.svg');
}
.vs-dark .monaco-workbench .symbol-icon.package,
.hc-black .monaco-workbench .symbol-icon.package {
background-image: url('Namespace_16x_darkp.svg');
}
/* module */
.monaco-workbench .symbol-icon.module {
background-image: url('Namespace_16x.svg');
}
.vs-dark .monaco-workbench .symbol-icon.module,
.hc-black .monaco-workbench .symbol-icon.module {
background-image: url('Namespace_16x_darkp.svg');
}
/* number */
.monaco-workbench .symbol-icon.number {
background-image: url('Numeric_16x.svg');
}
.vs-dark .monaco-workbench .symbol-icon.number,
.hc-black .monaco-workbench .symbol-icon.number {
background-image: url('Numeric_16x_darkp.svg');
}
/* property */
.monaco-workbench .symbol-icon.property {
background-image: url('Property_16x.svg');
}
.vs-dark .monaco-workbench .symbol-icon.property,
.hc-black .monaco-workbench .symbol-icon.property {
background-image: url('Property_16x_darkp.svg');
}
/* snippet */
/* todo@joh unused? */
.monaco-workbench .symbol-icon.snippet {
background-image: url('Snippet_16x.svg');
}
.vs-dark .monaco-workbench .symbol-icon.snippet,
.hc-black .monaco-workbench .symbol-icon.snippet {
background-image: url('Snippet_16x_darkp.svg');
}
/* string */
.monaco-workbench .symbol-icon.string {
background-image: url('String_16x.svg');
}
.vs-dark .monaco-workbench .symbol-icon.string,
.hc-black .monaco-workbench .symbol-icon.string {
background-image: url('String_16x_darkp.svg');
}
/* key */
.monaco-workbench .symbol-icon.key {
background-image: url('String_16x.svg');
}
.vs-dark .monaco-workbench .symbol-icon.key,
.hc-black .monaco-workbench .symbol-icon.key {
background-image: url('String_16x_darkp.svg');
}

View File

@@ -0,0 +1,441 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import { DocumentSymbolProviderRegistry, DocumentSymbolProvider, DocumentSymbol } from 'vs/editor/common/modes';
import { ITextModel } from 'vs/editor/common/model';
import { fuzzyScore, FuzzyScore } from 'vs/base/common/filters';
import { IPosition } from 'vs/editor/common/core/position';
import { Range, IRange } from 'vs/editor/common/core/range';
import { first, size, forEach } from 'vs/base/common/collections';
import { isFalsyOrEmpty, binarySearch, coalesce } from 'vs/base/common/arrays';
import { commonPrefixLength } from 'vs/base/common/strings';
import { IMarker, MarkerSeverity } from 'vs/platform/markers/common/markers';
import { onUnexpectedExternalError } from 'vs/base/common/errors';
import { LRUCache } from 'vs/base/common/map';
import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation';
export abstract class TreeElement {
abstract id: string;
abstract children: { [id: string]: TreeElement };
abstract parent: TreeElement;
abstract adopt(newParent: TreeElement): TreeElement;
remove(): void {
delete this.parent.children[this.id];
}
static findId(candidate: DocumentSymbol | string, container: TreeElement): string {
// complex id-computation which contains the origin/extension,
// the parent path, and some dedupe logic when names collide
let candidateId: string;
if (typeof candidate === 'string') {
candidateId = `${container.id}/${candidate}`;
} else {
candidateId = `${container.id}/${candidate.name}`;
if (container.children[candidateId] !== void 0) {
candidateId = `${container.id}/${candidate.name}_${candidate.range.startLineNumber}_${candidate.range.startColumn}`;
}
}
let id = candidateId;
for (let i = 0; container.children[id] !== void 0; i++) {
id = `${candidateId}_${i}`;
}
return id;
}
static getElementById(id: string, element: TreeElement): TreeElement {
if (!id) {
return undefined;
}
let len = commonPrefixLength(id, element.id);
if (len === id.length) {
return element;
}
if (len < element.id.length) {
return undefined;
}
for (const key in element.children) {
let candidate = TreeElement.getElementById(id, element.children[key]);
if (candidate) {
return candidate;
}
}
return undefined;
}
static size(element: TreeElement): number {
let res = 1;
for (const key in element.children) {
res += TreeElement.size(element.children[key]);
}
return res;
}
static empty(element: TreeElement): boolean {
for (const _key in element.children) {
return false;
}
return true;
}
}
export class OutlineElement extends TreeElement {
children: { [id: string]: OutlineElement; } = Object.create(null);
score: FuzzyScore = [0, []];
marker: { count: number, topSev: MarkerSeverity };
constructor(
readonly id: string,
public parent: OutlineModel | OutlineGroup | OutlineElement,
readonly symbol: DocumentSymbol
) {
super();
}
adopt(parent: OutlineModel | OutlineGroup | OutlineElement): OutlineElement {
let res = new OutlineElement(this.id, parent, this.symbol);
forEach(this.children, entry => res.children[entry.key] = entry.value.adopt(res));
return res;
}
}
export class OutlineGroup extends TreeElement {
children: { [id: string]: OutlineElement; } = Object.create(null);
constructor(
readonly id: string,
public parent: OutlineModel,
readonly provider: DocumentSymbolProvider,
readonly providerIndex: number,
) {
super();
}
adopt(parent: OutlineModel): OutlineGroup {
let res = new OutlineGroup(this.id, parent, this.provider, this.providerIndex);
forEach(this.children, entry => res.children[entry.key] = entry.value.adopt(res));
return res;
}
updateMatches(pattern: string, topMatch: OutlineElement): OutlineElement {
for (const key in this.children) {
topMatch = this._updateMatches(pattern, this.children[key], topMatch);
}
return topMatch;
}
private _updateMatches(pattern: string, item: OutlineElement, topMatch: OutlineElement): OutlineElement {
item.score = fuzzyScore(pattern, item.symbol.name, undefined, true);
if (item.score && (!topMatch || item.score[0] > topMatch.score[0])) {
topMatch = item;
}
for (const key in item.children) {
let child = item.children[key];
topMatch = this._updateMatches(pattern, child, topMatch);
if (!item.score && child.score) {
// don't filter parents with unfiltered children
item.score = [0, []];
}
}
return topMatch;
}
getItemEnclosingPosition(position: IPosition): OutlineElement {
return this._getItemEnclosingPosition(position, this.children);
}
private _getItemEnclosingPosition(position: IPosition, children: { [id: string]: OutlineElement }): OutlineElement {
for (let key in children) {
let item = children[key];
if (!Range.containsPosition(item.symbol.range, position)) {
continue;
}
return this._getItemEnclosingPosition(position, item.children) || item;
}
return undefined;
}
updateMarker(marker: IMarker[]): void {
for (const key in this.children) {
this._updateMarker(marker, this.children[key]);
}
}
private _updateMarker(markers: IMarker[], item: OutlineElement): void {
item.marker = undefined;
// find the proper start index to check for item/marker overlap.
let idx = binarySearch<IRange>(markers, item.symbol.range, Range.compareRangesUsingStarts);
let start: number;
if (idx < 0) {
start = ~idx;
if (start > 0 && Range.areIntersecting(markers[start - 1], item.symbol.range)) {
start -= 1;
}
} else {
start = idx;
}
let myMarkers: IMarker[] = [];
let myTopSev: MarkerSeverity;
for (; start < markers.length && Range.areIntersecting(item.symbol.range, markers[start]); start++) {
// remove markers intersecting with this outline element
// and store them in a 'private' array.
let marker = markers[start];
myMarkers.push(marker);
markers[start] = undefined;
if (!myTopSev || marker.severity > myTopSev) {
myTopSev = marker.severity;
}
}
// Recurse into children and let them match markers that have matched
// this outline element. This might remove markers from this element and
// therefore we remember that we have had markers. That allows us to render
// the dot, saying 'this element has children with markers'
for (const key in item.children) {
this._updateMarker(myMarkers, item.children[key]);
}
if (myTopSev) {
item.marker = {
count: myMarkers.length,
topSev: myTopSev
};
}
coalesce(markers, true);
}
}
export class OutlineModel extends TreeElement {
private static readonly _requests = new LRUCache<string, { promiseCnt: number, source: CancellationTokenSource, promise: Promise<any>, model: OutlineModel }>(9, .75);
private static readonly _keys = new class {
private _counter = 1;
private _data = new WeakMap<DocumentSymbolProvider, number>();
for(textModel: ITextModel): string {
return `${textModel.id}/${textModel.getVersionId()}/${this._hash(DocumentSymbolProviderRegistry.all(textModel))}`;
}
private _hash(providers: DocumentSymbolProvider[]): string {
let result = '';
for (const provider of providers) {
let n = this._data.get(provider);
if (typeof n === 'undefined') {
n = this._counter++;
this._data.set(provider, n);
}
result += n;
}
return result;
}
};
static create(textModel: ITextModel, token: CancellationToken): Promise<OutlineModel> {
let key = this._keys.for(textModel);
let data = OutlineModel._requests.get(key);
if (!data) {
let source = new CancellationTokenSource();
data = {
promiseCnt: 0,
source,
promise: OutlineModel._create(textModel, source.token),
model: undefined,
};
OutlineModel._requests.set(key, data);
}
if (data.model) {
// resolved -> return data
return Promise.resolve(data.model);
}
// increase usage counter
data.promiseCnt += 1;
token.onCancellationRequested(() => {
// last -> cancel provider request, remove cached promise
if (--data.promiseCnt === 0) {
data.source.cancel();
OutlineModel._requests.delete(key);
}
});
return new Promise((resolve, reject) => {
data.promise.then(model => {
data.model = model;
resolve(model);
}, err => {
OutlineModel._requests.delete(key);
reject(err);
});
});
}
static _create(textModel: ITextModel, token: CancellationToken): Promise<OutlineModel> {
let result = new OutlineModel(textModel);
let promises = DocumentSymbolProviderRegistry.ordered(textModel).map((provider, index) => {
let id = TreeElement.findId(`provider_${index}`, result);
let group = new OutlineGroup(id, result, provider, index);
return Promise.resolve(provider.provideDocumentSymbols(result.textModel, token)).then(result => {
if (!isFalsyOrEmpty(result)) {
for (const info of result) {
OutlineModel._makeOutlineElement(info, group);
}
}
return group;
}, err => {
onUnexpectedExternalError(err);
return group;
}).then(group => {
if (!TreeElement.empty(group)) {
result._groups[id] = group;
} else {
group.remove();
}
});
});
return Promise.all(promises).then(() => result._compact());
}
private static _makeOutlineElement(info: DocumentSymbol, container: OutlineGroup | OutlineElement): void {
let id = TreeElement.findId(info, container);
let res = new OutlineElement(id, container, info);
if (info.children) {
for (const childInfo of info.children) {
OutlineModel._makeOutlineElement(childInfo, res);
}
}
container.children[res.id] = res;
}
static get(element: TreeElement): OutlineModel {
while (element) {
if (element instanceof OutlineModel) {
return element;
}
element = element.parent;
}
return undefined;
}
readonly id = 'root';
readonly parent = undefined;
protected _groups: { [id: string]: OutlineGroup; } = Object.create(null);
children: { [id: string]: OutlineGroup | OutlineElement; } = Object.create(null);
protected constructor(readonly textModel: ITextModel) {
super();
}
adopt(): OutlineModel {
let res = new OutlineModel(this.textModel);
forEach(this._groups, entry => res._groups[entry.key] = entry.value.adopt(res));
return res._compact();
}
private _compact(): this {
let count = 0;
for (const key in this._groups) {
let group = this._groups[key];
if (first(group.children) === undefined) { // empty
delete this._groups[key];
} else {
count += 1;
}
}
if (count !== 1) {
//
this.children = this._groups;
} else {
// adopt all elements of the first group
let group = first(this._groups);
for (let key in group.children) {
let child = group.children[key];
child.parent = this;
this.children[child.id] = child;
}
}
return this;
}
merge(other: OutlineModel): boolean {
if (this.textModel.uri.toString() !== other.textModel.uri.toString()) {
return false;
}
if (size(this._groups) !== size(other._groups)) {
return false;
}
this._groups = other._groups;
this.children = other.children;
return true;
}
updateMatches(pattern: string): OutlineElement {
let topMatch: OutlineElement;
for (const key in this._groups) {
topMatch = this._groups[key].updateMatches(pattern, topMatch);
}
return topMatch;
}
getItemEnclosingPosition(position: IPosition, context?: OutlineElement): OutlineElement {
let preferredGroup: OutlineGroup;
if (context) {
let candidate = context.parent;
while (candidate && !preferredGroup) {
if (candidate instanceof OutlineGroup) {
preferredGroup = candidate;
}
candidate = candidate.parent;
}
}
let result: OutlineElement = undefined;
for (const key in this._groups) {
const group = this._groups[key];
result = group.getItemEnclosingPosition(position);
if (result && (!preferredGroup || preferredGroup === group)) {
break;
}
}
return result;
}
getItemById(id: string): TreeElement {
return TreeElement.getElementById(id, this);
}
updateMarker(marker: IMarker[]): void {
// sort markers by start range so that we can use
// outline element starts for quicker look up
marker.sort(Range.compareRangesUsingStarts);
for (const key in this._groups) {
this._groups[key].updateMarker(marker.slice(0));
}
}
}

View File

@@ -0,0 +1,318 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import * as dom from 'vs/base/browser/dom';
import { IMouseEvent } from 'vs/base/browser/mouseEvent';
import { HighlightedLabel } from 'vs/base/browser/ui/highlightedlabel/highlightedLabel';
import { values } from 'vs/base/common/collections';
import { createMatches } from 'vs/base/common/filters';
import { TPromise } from 'vs/base/common/winjs.base';
import { IDataSource, IFilter, IRenderer, ISorter, ITree } from 'vs/base/parts/tree/browser/tree';
import 'vs/css!./media/outlineTree';
import 'vs/css!./media/symbol-icons';
import { Range } from 'vs/editor/common/core/range';
import { SymbolKind, symbolKindToCssClass } from 'vs/editor/common/modes';
import { OutlineElement, OutlineGroup, OutlineModel, TreeElement } from 'vs/editor/contrib/documentSymbols/outlineModel';
import { localize } from 'vs/nls';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { WorkbenchTreeController } from 'vs/platform/list/browser/listService';
import { MarkerSeverity } from 'vs/platform/markers/common/markers';
import { listErrorForeground, listWarningForeground } from 'vs/platform/theme/common/colorRegistry';
import { IThemeService } from 'vs/platform/theme/common/themeService';
export const enum OutlineItemCompareType {
ByPosition,
ByName,
ByKind
}
export class OutlineItemComparator implements ISorter {
constructor(
public type: OutlineItemCompareType = OutlineItemCompareType.ByPosition
) { }
compare(tree: ITree, a: OutlineGroup | OutlineElement, b: OutlineGroup | OutlineElement): number {
if (a instanceof OutlineGroup && b instanceof OutlineGroup) {
return a.providerIndex - b.providerIndex;
}
if (a instanceof OutlineElement && b instanceof OutlineElement) {
switch (this.type) {
case OutlineItemCompareType.ByKind:
return a.symbol.kind - b.symbol.kind;
case OutlineItemCompareType.ByName:
return a.symbol.name.localeCompare(b.symbol.name);
case OutlineItemCompareType.ByPosition:
default:
return Range.compareRangesUsingStarts(a.symbol.range, b.symbol.range);
}
}
return 0;
}
}
export class OutlineItemFilter implements IFilter {
enabled: boolean = true;
isVisible(tree: ITree, element: OutlineElement | any): boolean {
if (!this.enabled) {
return true;
}
return !(element instanceof OutlineElement) || Boolean(element.score);
}
}
export class OutlineDataSource implements IDataSource {
// this is a workaround for the tree showing twisties for items
// with only filtered children
filterOnScore: boolean = true;
getId(tree: ITree, element: TreeElement): string {
return element ? element.id : 'empty';
}
hasChildren(tree: ITree, element: OutlineModel | OutlineGroup | OutlineElement): boolean {
if (!element) {
return false;
}
if (element instanceof OutlineModel) {
return true;
}
if (element instanceof OutlineElement && (this.filterOnScore && !element.score)) {
return false;
}
for (const id in element.children) {
if (!this.filterOnScore || element.children[id].score) {
return true;
}
}
return false;
}
getChildren(tree: ITree, element: TreeElement): TPromise<TreeElement[]> {
let res = values(element.children);
// console.log(element.id + ' with children ' + res.length);
return TPromise.wrap(res);
}
getParent(tree: ITree, element: TreeElement | any): TPromise<TreeElement> {
return TPromise.wrap(element && element.parent);
}
shouldAutoexpand(tree: ITree, element: TreeElement): boolean {
return element && (element instanceof OutlineModel || element.parent instanceof OutlineModel || element instanceof OutlineGroup || element.parent instanceof OutlineGroup);
}
}
export interface OutlineTemplate {
labelContainer: HTMLElement;
label: HighlightedLabel;
icon?: HTMLElement;
detail?: HTMLElement;
decoration?: HTMLElement;
}
export class OutlineRenderer implements IRenderer {
renderProblemColors = true;
renderProblemBadges = true;
constructor(
@IThemeService readonly _themeService: IThemeService,
@IConfigurationService readonly _configurationService: IConfigurationService
) {
//
}
getHeight(tree: ITree, element: any): number {
return 22;
}
getTemplateId(tree: ITree, element: OutlineGroup | OutlineElement): string {
return element instanceof OutlineGroup ? 'outline-group' : 'outline-element';
}
renderTemplate(tree: ITree, templateId: string, container: HTMLElement): OutlineTemplate {
if (templateId === 'outline-element') {
const icon = dom.$('.outline-element-icon symbol-icon');
const labelContainer = dom.$('.outline-element-label');
const detail = dom.$('.outline-element-detail');
const decoration = dom.$('.outline-element-decoration');
dom.addClass(container, 'outline-element');
dom.append(container, icon, labelContainer, detail, decoration);
return { icon, labelContainer, label: new HighlightedLabel(labelContainer), detail, decoration };
}
if (templateId === 'outline-group') {
const labelContainer = dom.$('.outline-element-label');
dom.addClass(container, 'outline-element');
dom.append(container, labelContainer);
return { labelContainer, label: new HighlightedLabel(labelContainer) };
}
throw new Error(templateId);
}
renderElement(tree: ITree, element: OutlineGroup | OutlineElement, templateId: string, template: OutlineTemplate): void {
if (element instanceof OutlineElement) {
template.icon.className = `outline-element-icon ${symbolKindToCssClass(element.symbol.kind)}`;
template.label.set(element.symbol.name, element.score ? createMatches(element.score[1]) : undefined, localize('title.template', "{0} ({1})", element.symbol.name, OutlineRenderer._symbolKindNames[element.symbol.kind]));
template.detail.innerText = element.symbol.detail || '';
this._renderMarkerInfo(element, template);
}
if (element instanceof OutlineGroup) {
template.label.set(element.provider.displayName || localize('provider', "Outline Provider"));
}
}
private _renderMarkerInfo(element: OutlineElement, template: OutlineTemplate): void {
if (!element.marker) {
dom.hide(template.decoration);
template.labelContainer.style.removeProperty('--outline-element-color');
return;
}
const { count, topSev } = element.marker;
const color = this._themeService.getTheme().getColor(topSev === MarkerSeverity.Error ? listErrorForeground : listWarningForeground);
const cssColor = color ? color.toString() : 'inherit';
// color of the label
if (this.renderProblemColors) {
template.labelContainer.style.setProperty('--outline-element-color', cssColor);
} else {
template.labelContainer.style.removeProperty('--outline-element-color');
}
// badge with color/rollup
if (!this.renderProblemBadges) {
dom.hide(template.decoration);
} else if (count > 0) {
dom.show(template.decoration);
dom.removeClass(template.decoration, 'bubble');
template.decoration.innerText = count < 10 ? count.toString() : '+9';
template.decoration.title = count === 1 ? localize('1.problem', "1 problem in this element") : localize('N.problem', "{0} problems in this element", count);
template.decoration.style.setProperty('--outline-element-color', cssColor);
} else {
dom.show(template.decoration);
dom.addClass(template.decoration, 'bubble');
template.decoration.innerText = '\uf052';
template.decoration.title = localize('deep.problem', "Contains elements with problems");
template.decoration.style.setProperty('--outline-element-color', cssColor);
}
}
private static _symbolKindNames: { [symbol: number]: string } = {
[SymbolKind.Array]: localize('Array', "array"),
[SymbolKind.Boolean]: localize('Boolean', "boolean"),
[SymbolKind.Class]: localize('Class', "class"),
[SymbolKind.Constant]: localize('Constant', "constant"),
[SymbolKind.Constructor]: localize('Constructor', "constructor"),
[SymbolKind.Enum]: localize('Enum', "enumeration"),
[SymbolKind.EnumMember]: localize('EnumMember', "enumeration member"),
[SymbolKind.Event]: localize('Event', "event"),
[SymbolKind.Field]: localize('Field', "field"),
[SymbolKind.File]: localize('File', "file"),
[SymbolKind.Function]: localize('Function', "function"),
[SymbolKind.Interface]: localize('Interface', "interface"),
[SymbolKind.Key]: localize('Key', "key"),
[SymbolKind.Method]: localize('Method', "method"),
[SymbolKind.Module]: localize('Module', "module"),
[SymbolKind.Namespace]: localize('Namespace', "namespace"),
[SymbolKind.Null]: localize('Null', "null"),
[SymbolKind.Number]: localize('Number', "number"),
[SymbolKind.Object]: localize('Object', "object"),
[SymbolKind.Operator]: localize('Operator', "operator"),
[SymbolKind.Package]: localize('Package', "package"),
[SymbolKind.Property]: localize('Property', "property"),
[SymbolKind.String]: localize('String', "string"),
[SymbolKind.Struct]: localize('Struct', "struct"),
[SymbolKind.TypeParameter]: localize('TypeParameter', "type parameter"),
[SymbolKind.Variable]: localize('Variable', "variable"),
};
disposeTemplate(tree: ITree, templateId: string, template: OutlineTemplate): void {
template.label.dispose();
}
}
export class OutlineTreeState {
readonly selected: string;
readonly focused: string;
readonly expanded: string[];
static capture(tree: ITree): OutlineTreeState {
// selection
let selected: string;
let element = tree.getSelection()[0];
if (element instanceof TreeElement) {
selected = element.id;
}
// focus
let focused: string;
element = tree.getFocus(true);
if (element instanceof TreeElement) {
focused = element.id;
}
// expansion
let expanded = new Array<string>();
let nav = tree.getNavigator();
while (nav.next()) {
let element = nav.current();
if (element instanceof TreeElement) {
if (tree.isExpanded(element)) {
expanded.push(element.id);
}
}
}
return { selected, focused, expanded };
}
static async restore(tree: ITree, state: OutlineTreeState, eventPayload: any): Promise<void> {
let model = <OutlineModel>tree.getInput();
if (!state || !(model instanceof OutlineModel)) {
return TPromise.as(undefined);
}
// expansion
let items: TreeElement[] = [];
for (const id of state.expanded) {
let item = model.getItemById(id);
if (item) {
items.push(item);
}
}
await tree.collapseAll(undefined);
await tree.expandAll(items);
// selection & focus
let selected = model.getItemById(state.selected);
let focused = model.getItemById(state.focused);
tree.setSelection([selected], eventPayload);
tree.setFocus(focused, eventPayload);
}
}
export class OutlineController extends WorkbenchTreeController {
protected shouldToggleExpansion(element: any, event: IMouseEvent, origin: string): boolean {
if (element instanceof OutlineElement) {
return this.isClickOnTwistie(event);
} else {
return super.shouldToggleExpansion(element, event, origin);
}
}
}

View File

@@ -0,0 +1,188 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import * as assert from 'assert';
import { OutlineElement, OutlineGroup, OutlineModel } from '../outlineModel';
import { SymbolKind, DocumentSymbol, DocumentSymbolProviderRegistry } from 'vs/editor/common/modes';
import { Range } from 'vs/editor/common/core/range';
import { IMarker, MarkerSeverity } from 'vs/platform/markers/common/markers';
import { TextModel } from 'vs/editor/common/model/textModel';
import URI from 'vs/base/common/uri';
import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation';
suite('OutlineModel', function () {
test('OutlineModel#create, cached', async function () {
let model = TextModel.createFromString('foo', undefined, undefined, URI.file('/fome/path.foo'));
let count = 0;
let reg = DocumentSymbolProviderRegistry.register({ pattern: '**/path.foo' }, {
provideDocumentSymbols() {
count += 1;
return [];
}
});
await OutlineModel.create(model, CancellationToken.None);
assert.equal(count, 1);
// cached
await OutlineModel.create(model, CancellationToken.None);
assert.equal(count, 1);
// new version
model.applyEdits([{ text: 'XXX', range: new Range(1, 1, 1, 1) }]);
await OutlineModel.create(model, CancellationToken.None);
assert.equal(count, 2);
reg.dispose();
});
test('OutlineModel#create, cached/cancel', async function () {
let model = TextModel.createFromString('foo', undefined, undefined, URI.file('/fome/path.foo'));
let isCancelled = false;
let reg = DocumentSymbolProviderRegistry.register({ pattern: '**/path.foo' }, {
provideDocumentSymbols(d, token) {
return new Promise(resolve => {
token.onCancellationRequested(_ => {
isCancelled = true;
resolve(null);
});
});
}
});
assert.equal(isCancelled, false);
let s1 = new CancellationTokenSource();
OutlineModel.create(model, s1.token);
let s2 = new CancellationTokenSource();
OutlineModel.create(model, s2.token);
s1.cancel();
assert.equal(isCancelled, false);
s2.cancel();
assert.equal(isCancelled, true);
reg.dispose();
});
function fakeSymbolInformation(range: Range, name: string = 'foo'): DocumentSymbol {
return {
name,
detail: 'fake',
kind: SymbolKind.Boolean,
selectionRange: range,
range: range
};
}
function fakeMarker(range: Range): IMarker {
return { ...range, owner: 'ffff', message: 'test', severity: MarkerSeverity.Error, resource: null };
}
test('OutlineElement - updateMarker', function () {
let e0 = new OutlineElement('foo1', null, fakeSymbolInformation(new Range(1, 1, 1, 10)));
let e1 = new OutlineElement('foo2', null, fakeSymbolInformation(new Range(2, 1, 5, 1)));
let e2 = new OutlineElement('foo3', null, fakeSymbolInformation(new Range(6, 1, 10, 10)));
let group = new OutlineGroup('group', null, null, 1);
group.children[e0.id] = e0;
group.children[e1.id] = e1;
group.children[e2.id] = e2;
const data = [fakeMarker(new Range(6, 1, 6, 7)), fakeMarker(new Range(1, 1, 1, 4)), fakeMarker(new Range(10, 2, 14, 1))];
data.sort(Range.compareRangesUsingStarts); // model does this
group.updateMarker(data);
assert.equal(data.length, 0); // all 'stolen'
assert.equal(e0.marker.count, 1);
assert.equal(e1.marker, undefined);
assert.equal(e2.marker.count, 2);
group.updateMarker([]);
assert.equal(e0.marker, undefined);
assert.equal(e1.marker, undefined);
assert.equal(e2.marker, undefined);
});
test('OutlineElement - updateMarker, 2', function () {
let p = new OutlineElement('A', null, fakeSymbolInformation(new Range(1, 1, 11, 1)));
let c1 = new OutlineElement('A/B', null, fakeSymbolInformation(new Range(2, 4, 5, 4)));
let c2 = new OutlineElement('A/C', null, fakeSymbolInformation(new Range(6, 4, 9, 4)));
let group = new OutlineGroup('group', null, null, 1);
group.children[p.id] = p;
p.children[c1.id] = c1;
p.children[c2.id] = c2;
let data = [
fakeMarker(new Range(2, 4, 5, 4))
];
group.updateMarker(data);
assert.equal(p.marker.count, 0);
assert.equal(c1.marker.count, 1);
assert.equal(c2.marker, undefined);
data = [
fakeMarker(new Range(2, 4, 5, 4)),
fakeMarker(new Range(2, 6, 2, 8)),
fakeMarker(new Range(7, 6, 7, 8)),
];
group.updateMarker(data);
assert.equal(p.marker.count, 0);
assert.equal(c1.marker.count, 2);
assert.equal(c2.marker.count, 1);
data = [
fakeMarker(new Range(1, 4, 1, 11)),
fakeMarker(new Range(7, 6, 7, 8)),
];
group.updateMarker(data);
assert.equal(p.marker.count, 1);
assert.equal(c1.marker, undefined);
assert.equal(c2.marker.count, 1);
});
test('OutlineElement - updateMarker/multiple groups', function () {
let model = new class extends OutlineModel {
constructor() {
super(null);
}
readyForTesting() {
this._groups = this.children as any;
}
};
model.children['g1'] = new OutlineGroup('g1', model, null, 1);
model.children['g1'].children['c1'] = new OutlineElement('c1', model.children['g1'], fakeSymbolInformation(new Range(1, 1, 11, 1)));
model.children['g2'] = new OutlineGroup('g2', model, null, 1);
model.children['g2'].children['c2'] = new OutlineElement('c2', model.children['g2'], fakeSymbolInformation(new Range(1, 1, 7, 1)));
model.children['g2'].children['c2'].children['c2.1'] = new OutlineElement('c2.1', model.children['g2'].children['c2'], fakeSymbolInformation(new Range(1, 3, 2, 19)));
model.children['g2'].children['c2'].children['c2.2'] = new OutlineElement('c2.2', model.children['g2'].children['c2'], fakeSymbolInformation(new Range(4, 1, 6, 10)));
model.readyForTesting();
const data = [
fakeMarker(new Range(1, 1, 2, 8)),
fakeMarker(new Range(6, 1, 6, 98)),
];
model.updateMarker(data);
assert.equal(model.children['g1'].children['c1'].marker.count, 2);
assert.equal(model.children['g2'].children['c2'].children['c2.1'].marker.count, 1);
assert.equal(model.children['g2'].children['c2'].children['c2.2'].marker.count, 1);
});
});