Add live server extension

This commit is contained in:
2024-04-25 13:49:40 +01:00
parent cf0d73b1ac
commit 794e7b6aed
153 changed files with 14521 additions and 1 deletions

View File

@@ -1 +1 @@
[{"identifier":{"id":"piousdeer.adwaita-theme","uuid":"93fbc635-4a9a-4ff1-88ba-bf017484c602"},"version":"1.1.0","location":{"$mid":1,"path":"/home/trude/.vscode-oss/extensions/piousdeer.adwaita-theme-1.1.0-universal","scheme":"file"},"relativeLocation":"piousdeer.adwaita-theme-1.1.0-universal","metadata":{"id":"93fbc635-4a9a-4ff1-88ba-bf017484c602","publisherId":"93befe42-7314-4d14-8724-19419a27ed64","publisherDisplayName":"piousdeer","targetPlatform":"universal","updated":false,"isPreReleaseVersion":false,"hasPreReleaseVersion":false,"installedTimestamp":1714048423200,"pinned":false,"source":"gallery"}},{"identifier":{"id":"oderwat.indent-rainbow","uuid":"eaa2127d-cb69-4ab9-8505-a60c9ee5f28b"},"version":"8.3.1","location":{"$mid":1,"fsPath":"/home/trude/.vscode-oss/extensions/oderwat.indent-rainbow-8.3.1-universal","external":"file:///home/trude/.vscode-oss/extensions/oderwat.indent-rainbow-8.3.1-universal","path":"/home/trude/.vscode-oss/extensions/oderwat.indent-rainbow-8.3.1-universal","scheme":"file"},"relativeLocation":"oderwat.indent-rainbow-8.3.1-universal","metadata":{"id":"eaa2127d-cb69-4ab9-8505-a60c9ee5f28b","publisherId":"ac064ae0-224d-4351-9aa4-45ef7bf3ed21","publisherDisplayName":"oderwat","targetPlatform":"universal","updated":false,"isPreReleaseVersion":false,"hasPreReleaseVersion":false,"installedTimestamp":1714048433635,"pinned":false,"source":"gallery"}}]
[{"identifier":{"id":"piousdeer.adwaita-theme","uuid":"93fbc635-4a9a-4ff1-88ba-bf017484c602"},"version":"1.1.0","location":{"$mid":1,"path":"/home/trude/.vscode-oss/extensions/piousdeer.adwaita-theme-1.1.0-universal","scheme":"file"},"relativeLocation":"piousdeer.adwaita-theme-1.1.0-universal","metadata":{"id":"93fbc635-4a9a-4ff1-88ba-bf017484c602","publisherId":"93befe42-7314-4d14-8724-19419a27ed64","publisherDisplayName":"piousdeer","targetPlatform":"universal","updated":false,"isPreReleaseVersion":false,"hasPreReleaseVersion":false,"installedTimestamp":1714048423200,"pinned":false,"source":"gallery"}},{"identifier":{"id":"oderwat.indent-rainbow","uuid":"eaa2127d-cb69-4ab9-8505-a60c9ee5f28b"},"version":"8.3.1","location":{"$mid":1,"path":"/home/trude/.vscode-oss/extensions/oderwat.indent-rainbow-8.3.1-universal","scheme":"file"},"relativeLocation":"oderwat.indent-rainbow-8.3.1-universal","metadata":{"id":"eaa2127d-cb69-4ab9-8505-a60c9ee5f28b","publisherId":"ac064ae0-224d-4351-9aa4-45ef7bf3ed21","publisherDisplayName":"oderwat","targetPlatform":"universal","updated":false,"isPreReleaseVersion":false,"hasPreReleaseVersion":false,"installedTimestamp":1714048433635,"pinned":false,"source":"gallery"}},{"identifier":{"id":"yandeu.five-server","uuid":"a18a6705-5a6a-4e14-a4a7-3efa6b7647d5"},"version":"0.3.1","location":{"$mid":1,"fsPath":"/home/trude/.vscode-oss/extensions/yandeu.five-server-0.3.1-universal","external":"file:///home/trude/.vscode-oss/extensions/yandeu.five-server-0.3.1-universal","path":"/home/trude/.vscode-oss/extensions/yandeu.five-server-0.3.1-universal","scheme":"file"},"relativeLocation":"yandeu.five-server-0.3.1-universal","metadata":{"id":"a18a6705-5a6a-4e14-a4a7-3efa6b7647d5","publisherId":"a342b7ab-2d58-4313-9c2d-f506bb2aa10c","publisherDisplayName":"yandeu","targetPlatform":"universal","updated":false,"isPreReleaseVersion":false,"hasPreReleaseVersion":false,"installedTimestamp":1714049361078,"pinned":false,"source":"gallery"}}]

View File

@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<PackageManifest Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2011" xmlns:d="http://schemas.microsoft.com/developer/vsx-schema-design/2011">
<Metadata>
<Identity Language="en-US" Id="five-server" Version="0.3.1" Publisher="yandeu" />
<DisplayName>Live Server (Five Server)</DisplayName>
<Description xml:space="preserve">A better Live Server with instant updates, highlights and some PHP support.</Description>
<Tags>remote,browser,development,tool,html,php,http,live,instant,server,cli,preview,reload,refresh,update,highlight,live-server,live server,keybindings,__sponsor_extension</Tags>
<Categories>Other</Categories>
<GalleryFlags>Public</GalleryFlags>
<Badges><Badge Link="https://github.com/sponsors/yandeu" ImgUri="https://img.shields.io/badge/Sponsor-%E2%9D%A4-lightgrey?style=social&amp;logo=GitHub" Description="GitHub Sponsors" />
<Badge Link="https://github.com/sponsors/yandeu?frequency=one-time&amp;sponsor=yandeu#sponsors:~:text=%241%20one%20time" ImgUri="https://img.shields.io/badge/One--Time%20Donation-$1-lightgrey?style=social&amp;logo=GitHub" Description="One-Time Donation" /></Badges>
<Properties>
<Property Id="Microsoft.VisualStudio.Code.Engine" Value="^1.66.2" />
<Property Id="Microsoft.VisualStudio.Code.ExtensionDependencies" Value="" />
<Property Id="Microsoft.VisualStudio.Code.ExtensionPack" Value="" />
<Property Id="Microsoft.VisualStudio.Code.ExtensionKind" Value="workspace" />
<Property Id="Microsoft.VisualStudio.Code.LocalizedLanguages" Value="" />
<Property Id="Microsoft.VisualStudio.Code.SponsorLink" Value="https://github.com/sponsors/yandeu?frequency=recurring#:~:text=a%20month" />
<Property Id="Microsoft.VisualStudio.Services.Links.Source" Value="https://github.com/yandeu/five-server-vscode.git" />
<Property Id="Microsoft.VisualStudio.Services.Links.Getstarted" Value="https://github.com/yandeu/five-server-vscode.git" />
<Property Id="Microsoft.VisualStudio.Services.Links.GitHub" Value="https://github.com/yandeu/five-server-vscode.git" />
<Property Id="Microsoft.VisualStudio.Services.Links.Support" Value="https://github.com/yandeu/five-server/discussions" />
<Property Id="Microsoft.VisualStudio.Services.Links.Learn" Value="https://github.com/yandeu/five-server-vscode#readme" />
<Property Id="Microsoft.VisualStudio.Services.Branding.Color" Value="#41205f" />
<Property Id="Microsoft.VisualStudio.Services.Branding.Theme" Value="dark" />
<Property Id="Microsoft.VisualStudio.Services.GitHubFlavoredMarkdown" Value="true" />
<Property Id="Microsoft.VisualStudio.Services.Content.Pricing" Value="Free"/>
<Property Id="Microsoft.VisualStudio.Services.CustomerQnALink" Value="https://github.com/yandeu/five-server/discussions" />
</Properties>
<License>extension/LICENSE.txt</License>
<Icon>extension/img/icon-star.png</Icon>
</Metadata>
<Installation>
<InstallationTarget Id="Microsoft.VisualStudio.Code"/>
</Installation>
<Dependencies/>
<Assets>
<Asset Type="Microsoft.VisualStudio.Code.Manifest" Path="extension/package.json" Addressable="true" />
<Asset Type="Microsoft.VisualStudio.Services.Content.Details" Path="extension/README.md" Addressable="true" />
<Asset Type="Microsoft.VisualStudio.Services.Content.Changelog" Path="extension/CHANGELOG.md" Addressable="true" />
<Asset Type="Microsoft.VisualStudio.Services.Content.License" Path="extension/LICENSE.txt" Addressable="true" />
<Asset Type="Microsoft.VisualStudio.Services.Icons.Default" Path="extension/img/icon-star.png" Addressable="true" />
</Assets>
</PackageManifest>

View File

@@ -0,0 +1,13 @@
# Change Log
_There will be no change log while < v1.0.0_
---
All notable changes to the "Five Server" extension will be documented in this file.
Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file.
## [Unreleased]
- Initial release

View File

@@ -0,0 +1,40 @@
Five Server License
Copyright (C) 2021, Yannick Deubel (https://github.com/yandeu)
All rights reserved.
This file is part of the "Five Server" project.
1. DEFINITIONS
a) "Licensor" is Yannick Deubel (https://github.com/yandeu).
b) "Software" is the software known as Five Server.
2. RESTRICTIONS
You are NOT permitted to:
a) Edit, alter, modify, adapt, translate or otherwise change the whole or any
part of the Software without the express permission of the Licensor.
b) Decompile, disassemble or reverse engineer the Software or attempt to do
any such things.
c) Reproduce, copy, distribute, resell or otherwise use the whole or any part
of the Software for any commercial or non-commercial purpose.
d) Disable, modify or hide notifications sent by the Software.
3. OWNERSHIP
The Software, copyright, and other intellectual property rights of whatever
nature in the Software, including any modifications made thereto are and shall
remain the property of the Licensor.
4. WARRANTY DISCLAIMER
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED.
5. LIMITATION OF LIABILITY
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@@ -0,0 +1,164 @@
<p align="center">
<img
src="https://raw.githubusercontent.com/yandeu/five-server-vscode/main/img/icon.png"
height="100"
width="134"
/>
</p>
<h1 align="center">Five Server</h1>
<p align="center">
A better <em><b>live server</b></em>
</p>
<p align="center">
<a
href="https://marketplace.visualstudio.com/items?itemName=yandeu.five-server"
target="__blank"
>
<img alt="VERSION" src="https://img.shields.io/visual-studio-marketplace/v/yandeu.five-server.svg?color=228cb3&amp;label="/>
<img alt="Visual Studio Marketplace Rating" src="https://img.shields.io/visual-studio-marketplace/r/yandeu.five-server?color=228cb3">
</a>
<a href="https://github.com/sponsors/yandeu" target="__blank">
<img alt="GitHub Sponsors" src="https://img.shields.io/github/sponsors/yandeu?color=228cb3">
</a>
</p>
- ⚡️ **Updates your files instantly** while typing on your keyboard
- ⬢ Remote displays the logs of your browser/phone in your terminal
- 💡 Highlights the code you are working on in your browser
- 🚀 Navigates your browser automatically to the current editing file
- 🐘 Includes **PHP Support** for serving and live reload all your `.php` files
- 🗄️ Supports all **Server Side Rendered Apps** like express.js
<p>
<a href="https://youtu.be/aETkOu8J-bo">
<img src="https://raw.githubusercontent.com/yandeu/five-server/main/img/vscode-preview.gif" alt="demo">
</a>
</p>
## Get Started
4 ways to start your live server.
1. Click **Go Live** in the Status Bar (bottom of VSCode)
2. Right-Click a Open File > **Open with Five Server**
3. Right-Click a File in the Explorer > **Open with Five Server**
4. Right-Click a Folder in the Explorer > **Open with Five Server (root)**
_(will set the current folder as root until you stop the server)_
## Videos
- [Instant Update](https://youtu.be/3-zKYNrxKOk)
- [Instant Update (with PHP)](https://youtu.be/4s7q5chX-e0)
- [New Highlight Styles](https://youtu.be/zlKxvw-vy_M)
## Quick Test
Something is not working? Try the simple setup below:
- make sure you have uninstalled the old **Live Server**
- check if you have the latest version
[![VERSION](https://img.shields.io/visual-studio-marketplace/v/yandeu.five-server.svg?color=228cb3&label=)](https://marketplace.visualstudio.com/items?itemName=yandeu.five-server)
- make a new folder `www` on the desktop
- add the `index.html` (see below)
- open the folder `www` with VSCode
- click on **Go Live**
```html
<!DOCTYPE html>
<html>
<head>
<title>HTML Test File</title>
</head>
<body>
<h1>It works!</h1>
</body>
</html>
```
The setup above works but your project not?
- Maybe because your project is on another drive?
- Or maybe on a USB Stick or remote folder like `OneDrive` or `DropBox`?
- Make sure you open a folder in VSCode and NOT just a single file.
- All these things can sometimes cause issues.
## About PHP
Although Five Server can render, display and live reload PHP, it does not provide a full PHP server. If you want to develop a big PHP app, you manually have to link the client-side Five Server script with your PHP files. See [five-server-with-php](https://github.com/yandeu/five-server-with-php).
## Features
💡 Most **advanced features** are disabled by default.
Turn them on in the settings or by configuring a `fiveserver.config.js` file in the root of your workspace.
Note:
- **Instant Update** & **Highlight** works with `.html` and `.php` files.
- All remote logs will be visible in a new Terminal called "Five Server".
- The features `highlight`, `injectBody` and `remoteLogs` are disable by default.
- To use the `highlight` feature, `injectBody` has to be activated.
- `injectBody` performs some simple HTML Validation. When using `injectBody`, a message will be displayed if your HTML Page is invalid.
- To temporarily disable `highlight` for a single HTML Tag, add a **H**.
Example: `<div H>Don't highlight me</div>`
Config File Example:
```js
// fiveserver.config.js
module.exports = {
highlight: true, // enable highlight feature
injectBody: true, // enable instant update
remoteLogs: true, // enable remoteLogs
remoteLogs: "yellow", // enable remoteLogs and use the color yellow
injectCss: false, // disable injecting css
navigate: true, // enable auto-navigation
};
```
### More Docs
- Read [Five Server - Documentation](https://github.com/yandeu/five-server#documentation).
- Read [Five Server - Config File](https://github.com/yandeu/five-server#config-file).
- Check all available options for the **Config File** in [`/src/types.ts`](https://github.com/yandeu/five-server/blob/main/src/types.ts).
- Check all available colors for the **remoteLogs** in [`/src/colors.ts`](https://github.com/yandeu/five-server/blob/main/src/colors.ts).
### Known Issues
- Sometimes `injectBody` does not work well when using inline JavaScript inside `<body>`.
As a workaround, execute your inline scripts after Five Server is connected:
```html
<script>
const main = () => {
console.log("Some JavaScript Code...");
};
// wait for five-server to connect
const five = document.querySelector('[data-id="five-server"]');
if (five) five.addEventListener("connected", main);
else window.addEventListener("load", main);
</script>
```
### Debug Mode
Need to debug something? Set `debugVSCode` to true.
```js
// fiveserver.config.js
module.exports = {
debugVSCode: true,
};
```
## Release Notes
_No release notes while < v1.0.0_
## Support Five Server
[![GitHub Sponsors](https://img.shields.io/badge/Sponsor-%E2%9D%A4-lightgrey?style=social&logo=GitHub)](https://github.com/sponsors/yandeu)
[![One-Time Donation](https://img.shields.io/badge/One--Time%20Donation-$1-lightgrey?style=social&logo=GitHub)](https://github.com/sponsors/yandeu?frequency=one-time&sponsor=yandeu#sponsors:~:text=%241%20one%20time)

View File

@@ -0,0 +1,407 @@
/* eslint-disable prefer-object-spread */
/* eslint-disable prefer-template */
/**
* @copyright
* Copyright (c) 2012 - present Adobe Systems Incorporated. All rights reserved. (https://github.com/adobe)
* Copyright (c) 2021 Yannick Deubel (https://github.com/yandeu)
*
* @license {@link https://github.com/yandeu/five-server/blob/main/LICENSE LICENSE}
*
* @description
* copied from https://github.com/adobe/brackets/blob/master/src/LiveDevelopment/Agents/RemoteFunctions.js
* previously licensed under MIT (https://github.com/adobe/brackets/blob/master/LICENSE)
*/
let _remoteHighlight
const HIGHLIGHT_CLASS_NAME = '__brackets-ld-highlight'
const config = {
experimental: false, // enable experimental features
debug: true, // enable debug output and helpers
autoConnect: false, // go live automatically after startup?
highlight: true, // enable highlighting?
highlightConfig: {
// the highlight configuration for the Inspector
borderColor: { r: 255, g: 229, b: 153, a: 0.66 },
contentColor: { r: 111, g: 168, b: 220, a: 0.55 },
marginColor: { r: 246, g: 178, b: 107, a: 0.66 },
paddingColor: { r: 147, g: 196, b: 125, a: 0.66 },
showInfo: true
},
remoteHighlight: {
animateStartValue: {
'background-color': 'rgba(0, 162, 255, 0.5)',
opacity: 0
},
animateEndValue: {
'background-color': 'rgb(106, 171, 233)', //'rgba(0, 162, 255, 0)',
opacity: 0.6
},
paddingStyling: {
//'border-width': '1px',
//'border-style': 'dashed',
//'border-color': 'rgba(0, 162, 255, 0.5)',
'background-color': 'rgb(156, 221, 156)'
},
marginStyling: {
'background-color': 'rgb(255 ,177 ,95)' // 'rgba(21, 165, 255, 0.58)'
},
borderColor: 'rgba(21, 165, 255, 0.85)',
showPaddingMargin: true
}
}
// Checks if the element is in Viewport in the client browser
function isInViewport(element) {
const rect = element.getBoundingClientRect()
const html = window.document.documentElement
return (
rect.top >= 0 &&
rect.left >= 0 &&
rect.bottom <= (window.innerHeight || html.clientHeight) &&
rect.right <= (window.innerWidth || html.clientWidth)
)
}
// set an event on a element
function _trigger(element, name, value, autoRemove?) {
// MOD(yandeu): Do not automatically remove the highlight.
/*
const key = 'data-ld-' + name
if (value !== undefined && value !== null) {
element.setAttribute(key, value)
if (autoRemove) {
window.setTimeout(element.removeAttribute.bind(element, key))
}
} else {
element.removeAttribute(key)
}
*/
}
// compute the screen offset of an element
function _screenOffset(element) {
const elemBounds = element.getBoundingClientRect(),
body = window.document.body
let offsetTop, offsetLeft
if (window.getComputedStyle(body).position === 'static') {
offsetLeft = elemBounds.left + window.pageXOffset
offsetTop = elemBounds.top + window.pageYOffset
} else {
const bodyBounds = body.getBoundingClientRect()
offsetLeft = elemBounds.left - bodyBounds.left
offsetTop = elemBounds.top - bodyBounds.top
}
return { left: offsetLeft, top: offsetTop }
}
// returns the distance from the top of the closest relatively positioned parent element
function getDocumentOffsetTop(element) {
return element.offsetTop + (element.offsetParent ? getDocumentOffsetTop(element.offsetParent) : 0)
}
// redraw active highlights
function redrawHighlights() {
if (_remoteHighlight) {
_remoteHighlight.redraw()
}
}
let req, timeout
const animateHighlight = function (time) {
if (req) {
window.cancelAnimationFrame(req)
window.clearTimeout(timeout)
}
req = window.requestAnimationFrame(redrawHighlights)
timeout = setTimeout(function () {
window.cancelAnimationFrame(req)
req = null
}, time * 1000)
}
export class Highlight {
trigger: boolean
elements: any[] = []
selector = '[data-highlight="true"]'
constructor(trigger: boolean) {
this.trigger = !!trigger
}
elementExists(element) {
let i
for (i in this.elements) {
if (this.elements[i] === element) {
return true
}
}
return false
}
makeHighlightDiv(element, doAnimation) {
const elementBounds = element.getBoundingClientRect(),
highlight = window.document.createElement('div'),
elementStyling = window.getComputedStyle(element),
transitionDuration = parseFloat(elementStyling.getPropertyValue('transition-duration')),
animationDuration = parseFloat(elementStyling.getPropertyValue('animation-duration'))
if (transitionDuration) {
animateHighlight(transitionDuration)
}
if (animationDuration) {
animateHighlight(animationDuration)
}
// Don't highlight elements with 0 width & height
if (elementBounds.width === 0 && elementBounds.height === 0) {
return
}
const realElBorder = {
right: elementStyling.getPropertyValue('border-right-width'),
left: elementStyling.getPropertyValue('border-left-width'),
top: elementStyling.getPropertyValue('border-top-width'),
bottom: elementStyling.getPropertyValue('border-bottom-width')
}
const borderBox = elementStyling.boxSizing === 'border-box'
let innerWidth = parseFloat(elementStyling.width),
innerHeight = parseFloat(elementStyling.height),
outerHeight = innerHeight,
outerWidth = innerWidth
if (!borderBox) {
innerWidth += parseFloat(elementStyling.paddingLeft) + parseFloat(elementStyling.paddingRight)
innerHeight += parseFloat(elementStyling.paddingTop) + parseFloat(elementStyling.paddingBottom)
;(outerWidth = innerWidth + parseFloat(realElBorder.right) + parseFloat(realElBorder.left)),
(outerHeight = innerHeight + parseFloat(realElBorder.bottom) + parseFloat(realElBorder.top))
}
const visualizations = {
horizontal: 'left, right',
vertical: 'top, bottom'
}
const drawPaddingRect = function (side) {
const elStyling = {}
if (visualizations.horizontal.indexOf(side) >= 0) {
elStyling['width'] = elementStyling.getPropertyValue('padding-' + side)
elStyling['height'] = innerHeight + 'px'
elStyling['top'] = 0
if (borderBox) {
elStyling['height'] = innerHeight - parseFloat(realElBorder.top) - parseFloat(realElBorder.bottom) + 'px'
}
} else {
elStyling['height'] = elementStyling.getPropertyValue('padding-' + side)
elStyling['width'] = innerWidth + 'px'
elStyling['left'] = 0
if (borderBox) {
elStyling['width'] = innerWidth - parseFloat(realElBorder.left) - parseFloat(realElBorder.right) + 'px'
}
}
elStyling[side] = 0
elStyling['position'] = 'absolute'
return elStyling
}
const drawMarginRect = function (side) {
const elStyling = {}
const margin = []
margin['right'] = parseFloat(elementStyling.getPropertyValue('margin-right'))
margin['top'] = parseFloat(elementStyling.getPropertyValue('margin-top'))
margin['bottom'] = parseFloat(elementStyling.getPropertyValue('margin-bottom'))
margin['left'] = parseFloat(elementStyling.getPropertyValue('margin-left'))
if (visualizations['horizontal'].indexOf(side) >= 0) {
elStyling['width'] = elementStyling.getPropertyValue('margin-' + side)
elStyling['height'] = outerHeight + margin['top'] + margin['bottom'] + 'px'
elStyling['top'] = '-' + (margin['top'] + parseFloat(realElBorder.top)) + 'px'
} else {
elStyling['height'] = elementStyling.getPropertyValue('margin-' + side)
elStyling['width'] = outerWidth + 'px'
elStyling['left'] = '-' + realElBorder.left
}
elStyling[side] = '-' + (margin[side] + parseFloat(realElBorder[side])) + 'px'
elStyling['position'] = 'absolute'
return elStyling
}
const setVisibility = function (el) {
if (!config.remoteHighlight.showPaddingMargin || parseInt(el.height, 10) <= 0 || parseInt(el.width, 10) <= 0) {
el.display = 'none'
} else {
el.display = 'block'
}
}
const paddingVisualizations = [
drawPaddingRect('top'),
drawPaddingRect('right'),
drawPaddingRect('bottom'),
drawPaddingRect('left')
]
const marginVisualizations = [
drawMarginRect('top'),
drawMarginRect('right'),
drawMarginRect('bottom'),
drawMarginRect('left')
]
const setupVisualizations = function (arr, config) {
let i
for (i = 0; i < arr.length; i++) {
setVisibility(arr[i])
// Applies to every visualisationElement (padding or margin div)
arr[i]['transform'] = 'none'
const el = window.document.createElement('div'),
styles = Object.assign({}, config, arr[i])
_setStyleValues(styles, el.style)
highlight.appendChild(el)
}
}
setupVisualizations(marginVisualizations, config.remoteHighlight.marginStyling)
setupVisualizations(paddingVisualizations, config.remoteHighlight.paddingStyling)
highlight.className = HIGHLIGHT_CLASS_NAME
const offset = _screenOffset(element)
let el = element,
offsetLeft = 0,
offsetTop = 0
// Probably the easiest way to get elements position without including transform
do {
offsetLeft += el.offsetLeft
offsetTop += el.offsetTop
el = el.offsetParent
} while (el)
const stylesToSet = {
left: offsetLeft + 'px',
top: offsetTop + 'px',
width: innerWidth + 'px',
height: innerHeight + 'px',
'z-index': 2000000,
margin: 0,
padding: 0,
position: 'absolute',
'pointer-events': 'none',
'box-shadow': '0 0 1px #fff',
'box-sizing': elementStyling.getPropertyValue('box-sizing'),
'border-right': elementStyling.getPropertyValue('border-right'),
'border-left': elementStyling.getPropertyValue('border-left'),
'border-top': elementStyling.getPropertyValue('border-top'),
'border-bottom': elementStyling.getPropertyValue('border-bottom'),
transform: elementStyling.getPropertyValue('transform'),
'transform-origin': elementStyling.getPropertyValue('transform-origin'),
'border-color': config.remoteHighlight.borderColor
}
const mergedStyles = Object.assign({}, stylesToSet)
const animateStartValues = config.remoteHighlight.animateStartValue
const animateEndValues = config.remoteHighlight.animateEndValue
const transitionValues = {
'transition-property': 'opacity, background-color, transform',
'transition-duration': '300ms, 2.3s'
}
function _setStyleValues(styleValues, obj) {
let prop
for (prop in styleValues) {
obj.setProperty(prop, styleValues[prop])
}
}
_setStyleValues(mergedStyles, highlight.style)
_setStyleValues(doAnimation ? animateStartValues : animateEndValues, highlight.style)
if (doAnimation) {
_setStyleValues(transitionValues, highlight.style)
window.setTimeout(function () {
_setStyleValues(animateEndValues, highlight.style)
}, 20)
}
window.document.body.appendChild(highlight)
}
add(element, doAnimation) {
if (this.elementExists(element) || element === window.document) {
return
}
if (this.trigger) {
_trigger(element, 'highlight', 1)
}
if ((!window.event || window.event instanceof MessageEvent) && !isInViewport(element)) {
let top = getDocumentOffsetTop(element)
if (top) {
top -= window.innerHeight / 2
window.scrollTo(0, top)
}
}
this.elements.push(element)
this.makeHighlightDiv(element, doAnimation)
}
clear() {
let i
const highlights = window.document.querySelectorAll('.' + HIGHLIGHT_CLASS_NAME),
body = window.document.body
for (i = 0; i < highlights.length; i++) {
body.removeChild(highlights[i])
}
if (this.trigger) {
for (i = 0; i < this.elements.length; i++) {
_trigger(this.elements[i], 'highlight', 0)
}
}
this.elements = []
}
redraw() {
let i, highlighted
// When redrawing a selector-based highlight, run a new selector
// query to ensure we have the latest set of elements to highlight.
if (this.selector) {
highlighted = window.document.querySelectorAll(this.selector)
} else {
highlighted = this.elements.slice(0)
}
this.clear()
for (i = 0; i < highlighted.length; i++) {
this.add(highlighted[i], false)
}
}
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,432 @@
declare const diffDOM: any
import { Highlight } from './highlight'
import { appendPathToUrl } from '../src/helpers'
// clone the current state of the body before any javascript
// manipulates it inside window.addEventListener('load', (...))
let _internalDOMBody
const block = (document.body) ? document.body.hasAttribute('data-server-no-reload') : false;
if (block) {
console.info('[Five Server] Reload disabled due to \'data-server-no-reload\' attribute on BODY element')
}
if ('WebSocket' in window && !block) {
window.addEventListener('load', () => {
console.log('[Five Server] connecting...')
const script = document.querySelector('[data-id="five-server"]') as HTMLScriptElement
const protocol = window.location.protocol === 'http:' ? 'ws://' : 'wss://'
const address = appendPathToUrl(`${protocol}${new URL(script.src).host}`, 'fsws')
// check if we need to clone the body for the "injectBody" feature or not
const optionsInjectBody = script.getAttribute('data-inject-body')
if (optionsInjectBody && optionsInjectBody.toString() === 'true')
_internalDOMBody = document.body ? document.body.cloneNode(true) : undefined
let timer: any = null
const highlight = new Highlight(true)
highlight.redraw()
window.addEventListener('resize', () => {
highlight.redraw()
})
const CONNECTED_MSG = '[Five Server] connected.'
const MAX_ATTEMPTS = 25
let wait = 1000
let attempts = 0
let socket!: WebSocket
let lastPopUp = ''
const popup = (
message: string,
type: 'info' | 'success' | 'error' | 'warn',
options: { time?: number; animation?: boolean } = {}
) => {
const str = JSON.stringify({ message, type, options })
// block identical popups, except "css update"
if (lastPopUp === str && message !== 'css updated') return
lastPopUp = str
let wrapper = document.getElementById('fiveserver-info-wrapper')
if (wrapper) wrapper.remove()
const { time = 3, animation = true } = options
wrapper = document.createElement('div')
wrapper.id = 'fiveserver-info-wrapper'
wrapper.classList.add(`fiveserver-info-wrapper_${type}`)
wrapper.style.zIndex = '100'
wrapper.style.display = 'flex'
wrapper.style.justifyContent = 'center'
wrapper.style.position = 'fixed'
wrapper.style.top = 'flex'
wrapper.style.left = '50%'
wrapper.style.transform = 'translateX(-50%)'
wrapper.style.width = '100%'
wrapper.style.maxWidth = '80%'
const el = document.createElement('div')
el.id = 'fiveserver-info'
el.style.fontSize = '16px'
el.style.fontFamily = 'Arial, Helvetica, sans-serif'
el.style.color = 'white'
el.style.backgroundColor = 'black'
el.style.padding = '4px 12px'
el.style.borderRadius = '4px'
el.style.whiteSpace = 'pre-wrap'
wrapper.appendChild(el)
document.body.appendChild(wrapper)
// remove popup from DOM after 'time'
if (timer) {
clearTimeout(timer)
timer = null
}
timer = setTimeout(() => {
if (wrapper && wrapper.isConnected) wrapper.remove()
}, time * 1000)
if (type === 'error') {
wrapper.style.top = '4px'
wrapper.style.animation = ''
el.style.color = 'black'
el.style.backgroundColor = 'red'
} else {
if (animation) {
wrapper.style.top = '-40px'
wrapper.style.animation = `fiveserverInfoPopup ${time}s forwards`
} else {
wrapper.style.top = '4px'
wrapper.style.animation = ''
}
}
if (type === 'success') {
el.style.color = '#498d76'
el.style.backgroundColor = '#00ffa9'
} else if (type === 'info') {
el.style.color = '#d2e1f0'
el.style.backgroundColor = '#2996ff'
}
el.innerHTML = message.replace(/</gm, '&lt;')
}
const send = (type: string, ...message: string[]) => {
if (socket && socket?.readyState === 1) {
socket.send(JSON.stringify({ console: { type, message } }))
}
}
const overwriteLogs = () => {
// log
const oldLog = console.log
console.log = function (...message) {
if (message[0] === CONNECTED_MSG) {
popup('connected', 'success')
} else {
send('log', ...message)
}
oldLog.apply(console, message)
}
// warn
const oldWarn = console.warn
console.warn = function (...message) {
send('warn', ...message)
oldWarn.apply(console, message)
}
// error
const oldError = console.error
console.error = function (...message) {
send('error', ...message)
oldError.apply(console, message)
}
}
const refreshCSS = (showPopup: boolean) => {
const head = document.getElementsByTagName('head')[0]
let sheets = Array.from(document.getElementsByTagName('link'))
sheets = sheets.filter(sheet => /\.css/gm.test(sheet.href) || sheet.rel.toLowerCase() == 'stylesheet')
for (let i = 0; i < sheets.length; ++i) {
const el = sheets[i]
const newEl = el.cloneNode(true) as HTMLLinkElement
// changing the href of the css file will make the browser refetch it
const url = newEl.href.replace(/(&|\?)_cacheOverride=\d+/, '')
newEl.href = `${url}${url.indexOf('?') >= 0 ? '&' : '?'}_cacheOverride=${new Date().valueOf()}`
newEl.onload = () => {
setTimeout(() => el.remove(), 0)
}
head.appendChild(newEl)
}
if (sheets.length > 0 && showPopup) popup('css updated', 'info')
}
const injectBody = body => {
document.body.innerHTML = body
}
let _diffDOMStatus = ''
let _dd
const addDiffDOM = (): Promise<void> => {
_diffDOMStatus = 'loading'
return new Promise(resolve => {
const url = `//${new URL(script.src).host}/fiveserver/scripts/diffDOM.js`
const s = document.createElement('script')
s.type = 'text/javascript'
s.src = url
s.onload = () => {
setTimeout(() => {
_dd = new diffDOM.DiffDOM()
_diffDOMStatus = 'ready'
resolve()
})
}
document.getElementsByTagName('head')[0].appendChild(s)
})
}
const domParser = new DOMParser()
let diffError = false
const updateBody = async (d: any) => {
if (_diffDOMStatus === '') await addDiffDOM()
if (_diffDOMStatus === 'ready') {
try {
const body = _internalDOMBody
const newBody = domParser.parseFromString(d, 'text/html').querySelector('body')
const tmp = document.createElement('body')
tmp.innerHTML = d
// copy all attributes
if (newBody) {
if (newBody.attributes.length > 0)
for (let i = 0; i < newBody.attributes.length; i++) {
const attr = newBody.attributes.item(i)
if (attr) {
const newAttr = document.createAttribute(attr.name)
newAttr.value = attr.value
tmp.attributes.setNamedItem(newAttr)
}
}
}
const diff = _dd.diff(body, tmp)
const testBody = document.body.cloneNode(true)
const testSuccess = _dd.apply(testBody, diff)
if (testSuccess) {
const success = _dd.apply(document.body, diff)
if (success) {
_internalDOMBody = tmp
if (diffError) {
diffError = false
appendMessage('HIDE')
}
// scroll element into view (center of page)
const el = document.querySelector(`[data-highlight="true"]`)
if (el) {
const documentOffsetTop = el => {
return el.offsetTop + (el.offsetParent ? documentOffsetTop(el.offsetParent) : 0)
}
const pos = documentOffsetTop(el) - window.innerHeight / 2
window.scrollTo(0, pos)
}
}
}
} catch (error) {
diffError = true
appendMessage('Having issues parsing the DOM.\nPlease verify that your HTML is valid...')
}
}
}
const appendMessages = (msg: string[]) => {
appendMessage(msg.join('\n\n'))
}
const appendMessage = (msg: string) => {
if (msg === 'HIDE' || msg === 'HIDE_MESSAGE' || msg === 'HIDE_MESSAGES') {
const wrapper = document.getElementById('fiveserver-info-wrapper')
if (wrapper) wrapper.remove()
} else {
popup(msg, 'info', { animation: false })
}
}
const connect = () => {
socket = new WebSocket(address)
socket.onmessage = function (msg) {
wait = 1000
attempts = 0
if (msg.data === 'reload') window.location.reload()
else if (msg.data === 'refreshcss') refreshCSS(true)
else if (msg.data === 'refreshcss-silent') refreshCSS(false)
else if (msg.data === 'connected') {
console.log(CONNECTED_MSG)
// dispatch "connected" event when client is connected
const script = document.querySelector('[data-id="five-server"]')
if (script) script.dispatchEvent(new Event('connected'))
} else if (msg.data === 'initRemoteLogs') overwriteLogs()
else {
const d = JSON.parse(msg.data)
if (d.navigate) window.location.replace(d.navigate)
// hot body injection
if (d.body && d.hot) updateBody(d.body)
// simple body replacement
else if (d.body) injectBody(d.body)
// message and messages 🤣
if (d.messages) appendMessages(d.messages)
if (d.message) appendMessage(d.message)
// redraw the highlight on body update
if (d.body) highlight.redraw()
}
}
socket.onopen = function () {
// reload page on successful reconnection
if (attempts > 0) {
window.location.reload()
return
}
const scripts = document.querySelectorAll('script')
for (let i = 0; i < scripts.length; i++) {
const script = scripts[i]
if (script.dataset && script.dataset.file) {
socket.send(JSON.stringify({ file: script.dataset.file }))
}
}
// add styles to body
const style = document.createElement('style')
style.innerHTML = `
/* Injected by five-server */
/*[data-highlight="true"] {
border: 1px rgb(90,170,255) solid !important;
background-color: rgba(155,215,255,0.5);
animation: fadeOutHighlight 1s forwards 0.5s;
}
img[data-highlight="true"] {
filter: sepia(100%) hue-rotate(180deg) saturate(200%);
animation: fadeOutHighlightIMG 0.5s forwards 0.5s;
}*/
@keyframes fadeOutHighlight {
from {background-color: rgba(155,215,255,0.5);}
to {background-color: rgba(155,215,255,0);}
}
@keyframes fadeOutHighlightIMG {
0% {filter: sepia(100%) hue-rotate(180deg) saturate(200%);}
33% {filter: sepia(66%) hue-rotate(180deg) saturate(100%);}
50% {filter: sepia(50%) hue-rotate(90deg) saturate(50%);}
66% {filter: sepia(33%) hue-rotate(0deg) saturate(100%);}
100% {filter: sepia(0%) hue-rotate(0deg) saturate(100%);}
}
@keyframes fiveserverInfoPopup {
0% {top:-40px;}
15% {top:4px;}
85% {top:4px;}
100% {top:-40px;}
}
/*smaller*/
@media (max-width: 640px) {
#fiveserver-info-wrapper {
max-width: 98%;
}
#fiveserver-info {
border-radius: 0px;
}
}
`
document.head.appendChild(style)
}
socket.onclose = function (e) {
setTimeout(function () {
popup('lost connection to dev server', 'error')
}, 300)
if (attempts === 0) console.log('Socket is closed. Reconnect will be attempted in 1 second.', e.reason)
setTimeout(function () {
attempts++
if (attempts > 1) console.log('connecting...')
if (attempts <= MAX_ATTEMPTS) connect()
wait = Math.floor(wait * 1.1)
}, wait)
}
socket.onerror = function (event) {
// console.error('Socket encountered error: ', event, 'Closing socket')
socket.close()
}
}
const MAX_STATUS_CHECK = 10
let statusChecks = 0
const reCheckStatus = () => {
if (statusChecks > MAX_STATUS_CHECK) {
console.error('[Five Server] status check failed')
console.log('[Five Server] browser reloads in 5 seconds')
setTimeout(() => {
window.location.reload()
}, 5000)
return
}
console.log('[Five Server] status check...')
setTimeout(() => {
checkStatus()
}, 1000)
}
const checkStatus = async () => {
statusChecks++
const p = new URL(script.src).protocol
const h = new URL(script.src).host
const url = `${p}//${h}/fiveserver/status`
try {
const res = await fetch(url)
const json = await res.json()
if (json && json.status && json.status === 'online') {
connect()
statusChecks = 0
} else {
reCheckStatus()
}
} catch (error) {
reCheckStatus()
}
}
checkStatus()
})
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,168 @@
html,
body,
h1,
h2,
h3,
h4,
ul,
li,
pre,
code {
margin: 0;
padding: 0;
outline: 0;
}
html {
background: rgb(255, 255, 255);
background: linear-gradient(
0deg,
rgba(255, 255, 255, 1) 0%,
rgba(255, 255, 255, 1) 25%,
rgba(255, 255, 255, 1) 75%,
rgba(246, 246, 246, 1) 100%
);
background-size: 100vw 100vh;
background-repeat: repeat-x;
}
body {
padding: 80px 100px 20px 100px;
font: 14px 'Helvetica Neue', 'Lucida Grande', 'Arial';
color: #555;
max-width: 1024px;
margin: 0 auto;
min-height: calc(100vh - 120px);
}
h1,
h2,
h3 {
font-size: 22px;
color: #343434;
}
h1 em,
h2 em {
padding: 0 5px;
font-weight: normal;
}
h1 {
font-size: 60px;
}
h2 {
margin-top: 10px;
}
h3 {
margin: 5px 0 10px 0;
padding-bottom: 5px;
border-bottom: 1px solid #eee;
font-size: 18px;
}
ul li {
list-style: none;
}
ul li:hover {
cursor: pointer;
color: #2e2e2e;
}
ul li .path {
padding-left: 5px;
font-weight: bold;
}
ul li .line {
padding-right: 5px;
font-style: italic;
}
ul li:first-child .path {
padding-left: 0;
}
p {
line-height: 1.5;
}
a {
color: #555;
text-decoration: none;
}
a:hover {
color: #303030;
}
#stacktrace {
margin-top: 15px;
}
#wrapper {
display: flex;
flex-direction: column;
justify-content: space-between;
min-height: calc(100vh - 120px);
}
.directory h1 {
margin-bottom: 15px;
font-size: 18px;
}
.preview .image,
.preview code {
/* min-width: calc(100vw - 200px - 32px); */
min-height: 160px;
padding: 16px;
font-size: 14px;
border: 1px solid #e9e9e9;
border-radius: 5px;
box-shadow: 1px 1px 4px 1px rgb(0 0 0 / 10%);
}
.preview .image {
padding: 0;
text-align: center;
}
.footer {
text-align: right;
padding-top: 32px;
color: #d6d6d6;
}
.footer a {
color: #ababab;
}
/*small*/
@media (max-width: 768px) {
body {
padding: 80px 24px 40px 24px;
}
}
/*smaller*/
@media (max-width: 640px) {
}
/*mobile*/
@media (max-width: 480px) {
body {
padding: 0;
}
.directory h1 {
font-size: 2em;
line-height: 1.5em;
color: rgb(0, 0, 0);
background: rgb(255, 255, 255);
padding: 15px 10px;
margin: 0;
}
.message {
border-top: 1px solid #cacaca;
border-bottom: 1px solid #cacaca;
padding: 0px 10px;
}
.preview .image,
.preview code {
min-width: calc(100vw - 200px - 32px);
min-height: 160px;
padding: 16px;
padding-bottom: 0px;
font-size: 14px;
border: none;
margin: 0;
border-radius: 0px;
box-shadow: none;
}
.footer {
text-align: center;
}
}

View File

@@ -0,0 +1,40 @@
function $(id) {
const el = 'string' == typeof id ? document.getElementById(id) : id
el.on = function (event, fn) {
if ('content loaded' == event) {
event = window.attachEvent ? 'load' : 'DOMContentLoaded'
}
el.addEventListener ? el.addEventListener(event, fn, false) : el.attachEvent(`on${event}`, fn)
}
el.all = function (selector) {
return $(el.querySelectorAll(selector))
}
el.each = function (fn) {
for (let i = 0, len = el.length; i < len; ++i) {
fn($(el[i]), i)
}
}
el.getClasses = function () {
const c = this.getAttribute('class')
if (c) return c.split(/\s+/)
return []
}
el.addClass = function (name) {
const classes = this.getAttribute('class')
if (!el.getAttribute(name)) el.setAttribute('class', classes ? `${classes} ${name}` : name)
}
el.removeClass = function (name) {
const classes = this.getClasses().filter(function (curr) {
return curr != name
})
this.setAttribute('class', classes.join(' '))
}
return el
}

View File

@@ -0,0 +1,3 @@
Files used by server-explorer
.svg icons are from https://github.com/PKief/vscode-material-icon-theme/tree/master/icons

View File

@@ -0,0 +1,72 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<title>listing directory {directory}</title>
<link rel="stylesheet" href="/fiveserver/scripts/directory.css" />
<style>
{style}
</style>
<script
async
data-id="five-server"
data-file="{filePath}"
type="application/javascript"
src="/fiveserver.js"
></script>
<script src="/fiveserver/scripts/query.js"></script>
<script>
function search() {
var str = $("search").value.toLowerCase();
// var links = $("files").all("a"); // for highlight
var list = $("files").all("li");
list.each(function (li) {
var link = $(li.firstChild);
var text = link.textContent.toLowerCase();
if (".." == text) return;
const match = str.length && ~text.indexOf(str);
// highlight
// if (match) {
// link.addClass("highlight");
// } else {
// link.removeClass("highlight");
// }
// hide
if (match) {
li.removeClass("hidden");
} else {
li.addClass("hidden");
}
if (str.length === 0) li.removeClass("hidden");
});
}
$(window).on("content loaded", function () {
$("search").on("keyup", search);
});
</script>
</head>
<body>
<input id="search" type="text" placeholder="Search" autocomplete="off" />
<div id="wrapper">
<div class="directory">
<h1><a href="/">~</a>{linked-path}</h1>
{files}
</div>
<div class="footer">
<p>Explorer Developed by <a href="https://github.com/yandeu">@yandeu</a></p>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="M16,9V7H12V12.5C11.58,12.19 11.07,12 10.5,12A2.5,2.5 0 0,0 8,14.5A2.5,2.5 0 0,0 10.5,17A2.5,2.5 0 0,0 13,14.5V9H16M12,2A10,10 0 0,1 22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12A10,10 0 0,1 12,2Z" fill="#ef5350"/>
</svg>

After

Width:  |  Height:  |  Size: 363 B

View File

@@ -0,0 +1 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m16.45 15.97.42 2.44c-.26.14-.68.27-1.24.39-.57.13-1.24.2-2.01.2-2.21-.04-3.87-.7-4.98-1.96-1.14-1.27-1.68-2.88-1.68-4.83.04-2.31.72-4.08 2.04-5.32 1.28-1.25 2.92-1.89 4.9-1.89.75 0 1.4.07 1.94.19s.94.25 1.2.4l-.6 2.49-1.04-.34c-.4-.1-.87-.15-1.4-.15-1.15-.01-2.11.36-2.86 1.1-.76.73-1.14 1.85-1.18 3.34.01 1.36.37 2.42 1.08 3.2.71.77 1.7 1.17 2.99 1.18l1.33-.12c.43-.08.79-.19 1.09-.32z" style="fill:#0277bd"/></svg>

After

Width:  |  Height:  |  Size: 501 B

View File

@@ -0,0 +1,3 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="m4 2.5c-1.11 0-2 .89-2 2v10a2 2 0 0 0 2 2h8v5l3-3 3 3v-5h2a2 2 0 0 0 2 -2v-10a2 2 0 0 0 -2 -2h-16m8 2 3 2 3-2v3.5l3 1.5-3 1.5v3.5l-3-2-3 2v-3.5l-3-1.5 3-1.5v-3.5m-8 0h5v2h-5v-2m0 4h3v2h-3v-2m0 4h5v2h-5z" fill="#ff5722"/>
</svg>

After

Width:  |  Height:  |  Size: 312 B

View File

@@ -0,0 +1 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m11 7.5v5.11l4.71 2.79.79-1.28-4-2.37v-4.25m0-5c-3.53 0-6.59 1.92-8.23 4.77l-2.27-2.27v6.5h6.5l-2.75-2.75c1.21-2.52 3.75-4.25 6.75-4.25a7.5 7.5 0 0 1 7.5 7.5 7.5 7.5 0 0 1 -7.5 7.5c-3.27 0-6.03-2.09-7.06-5h-2.1c1.1 4.03 4.77 7 9.16 7 5.24 0 9.5-4.25 9.5-9.5a9.5 9.5 0 0 0 -9.5 -9.5z" style="fill:#8bc34a"/></svg>

After

Width:  |  Height:  |  Size: 396 B

View File

@@ -0,0 +1,3 @@
<svg width="25.6" height="25.6" version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="m20 19v-12h-16v12h16m0-16a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-16a2 2 0 0 1 -2 -2v-14c0-1.11.9-2 2-2h16m-7 14v-2h5v2h-5m-3.42-4-4.01-4h2.83l3.3 3.3c.39.39.39 1.03 0 1.42l-3.28 3.28h-2.83z" fill="#ff7043"/>
</svg>

After

Width:  |  Height:  |  Size: 320 B

View File

@@ -0,0 +1 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m10 15.97.41 2.44c-.26.14-.68.27-1.24.39-.57.13-1.24.2-2.01.2-2.21-.04-3.87-.7-4.98-1.96-1.12-1.27-1.68-2.88-1.68-4.83.05-2.31.72-4.08 2-5.32 1.32-1.25 2.96-1.89 4.94-1.89.75 0 1.4.07 1.94.19s.94.25 1.2.4l-.58 2.49-1.06-.34c-.4-.1-.86-.15-1.39-.15-1.16-.01-2.12.36-2.87 1.1-.76.73-1.15 1.85-1.18 3.34 0 1.36.37 2.42 1.08 3.2.71.77 1.71 1.17 2.99 1.18l1.33-.12c.43-.08.79-.19 1.1-.32m.5-4.97h2v-2h2v2h2v2h-2v2h-2v-2h-2v-2m7 0h2v-2h2v2h2v2h-2v2h-2v-2h-2z" style="fill:#0277bd"/></svg>

After

Width:  |  Height:  |  Size: 566 B

View File

@@ -0,0 +1,3 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="m5 3l-.65 3.34h13.59l-.44 2.16h-13.58l-.66 3.33h13.59l-.76 3.81-5.48 1.81-4.75-1.81.33-1.64h-3.34l-.79 4 7.85 3 9.05-3 1.2-6.03.24-1.21 1.54-7.76h-16.94z" fill="#42a5f5"/>
</svg>

After

Width:  |  Height:  |  Size: 263 B

View File

@@ -0,0 +1 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m12 3c-4.42 0-8 1.79-8 4s3.58 4 8 4 8-1.79 8-4-3.58-4-8-4m-8 6v3c0 2.21 3.58 4 8 4s8-1.79 8-4v-3c0 2.21-3.58 4-8 4s-8-1.79-8-4m0 5v3c0 2.21 3.58 4 8 4s8-1.79 8-4v-3c0 2.21-3.58 4-8 4s-8-1.79-8-4z" style="fill:#ffca28"/></svg>

After

Width:  |  Height:  |  Size: 309 B

View File

@@ -0,0 +1 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m12 14.5c-1.3875 0-2.5-1.125-2.5-2.5 0-1.3875 1.1125-2.5 2.5-2.5s2.5 1.1125 2.5 2.5a2.5 2.5 0 0 1-2.5 2.5m0-12.5a10 10 0 0 0-10 10 10 10 0 0 0 10 10 10 10 0 0 0 10-10 10 10 0 0 0-10-10z" style="fill:#b0bec5;stroke-width:1.25"/></svg>

After

Width:  |  Height:  |  Size: 317 B

View File

@@ -0,0 +1,3 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="m13 9h5.5l-5.5-5.5v5.5m-7-7h8l6 6v12a2 2 0 0 1 -2 2h-12c-1.11 0-2-.9-2-2v-16c0-1.11.89-2 2-2m9 16v-2h-9v2h9m3-4v-2h-12v2h12z" fill="#42a5f5"/>
</svg>

After

Width:  |  Height:  |  Size: 234 B

View File

@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg width="300" height="300" version="1.1" viewBox="0 0 299.99999 300.00001" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><metadata><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/><dc:title/></cc:Work></rdf:RDF></metadata><g transform="matrix(1.0344 0 0 1.0344 -2.8803 18.438)"><path d="m97.021 99.016 48.432-27.962c1.212-0.7 2.706-0.7 3.918 0l48.433 27.962c1.211 0.7 1.959 1.993 1.959 3.393v55.924c0 1.399-0.748 2.693-1.959 3.394l-48.433 27.962c-1.212 0.7-2.706 0.7-3.918 0l-48.432-27.962c-1.212-0.7-1.959-1.994-1.959-3.394v-55.924c1e-3 -1.4 0.748-2.693 1.959-3.393" fill="#7986cb"/><path d="m273.34 124.49-57.867-100.67c-2.102-3.64-5.985-6.325-10.188-6.325h-115.74c-4.204 0-8.088 2.685-10.19 6.325l-57.867 100.45c-2.102 3.641-2.102 8.236 0 11.877l57.867 99.847c2.102 3.64 5.986 5.501 10.19 5.501h115.74c4.203 0 8.087-1.805 10.188-5.446l57.867-100.01c2.104-3.639 2.104-7.907 1e-3 -11.547m-47.917 48.41c0 1.48-0.891 2.849-2.174 3.59l-73.71 42.527c-1.282 0.74-2.888 0.74-4.17 0l-73.767-42.527c-1.282-0.741-2.179-2.109-2.179-3.59v-85.055c0-1.481 0.884-2.849 2.167-3.59l73.707-42.527c1.282-0.741 2.886-0.741 4.168 0l73.772 42.527c1.283 0.741 2.186 2.109 2.186 3.59z" fill="#3f51b5"/></g></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1,3 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="m13 9h5.5l-5.5-5.5v5.5m-7-7h8l6 6v12a2 2 0 0 1 -2 2h-12c-1.11 0-2-.9-2-2v-16c0-1.11.89-2 2-2m5 2h-5v16h5 7v-9h-7v-7z" fill="#42a5f5"/>
</svg>

After

Width:  |  Height:  |  Size: 226 B

View File

@@ -0,0 +1,326 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
viewBox="0 0 24 24"
id="svg4"
sodipodi:docname="fiveserver.svg"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8">
<filter
style="color-interpolation-filters:sRGB"
id="filter1214">
<feComponentTransfer
result="fbSourceGraphic"
id="feComponentTransfer1212">
<feFuncR
type="gamma"
amplitude=".86"
exponent="2.09"
offset=".05"
id="feFuncR1206" />
<feFuncG
type="gamma"
amplitude=".86"
exponent="2.09"
offset=".05"
id="feFuncG1208" />
<feFuncB
type="gamma"
amplitude=".86"
exponent="2.09"
offset=".05"
id="feFuncB1210" />
</feComponentTransfer>
<feColorMatrix
result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
id="feColorMatrix1310" />
<feColorMatrix
id="feColorMatrix1312"
values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 -1 0.5 0.5 1 0"
in="fbSourceGraphic"
result="colormatrix" />
<feComposite
in2="fbSourceGraphic"
id="feComposite1314"
in="colormatrix"
operator="in"
result="composite1" />
</filter>
<filter
style="color-interpolation-filters:sRGB"
id="filter4568">
<feComponentTransfer
result="fbSourceGraphic"
id="feComponentTransfer4560">
<feFuncR
type="gamma"
amplitude=".86"
exponent="2.09"
offset=".05"
id="feFuncR4554" />
<feFuncG
type="gamma"
amplitude=".86"
exponent="2.09"
offset=".05"
id="feFuncG4556" />
<feFuncB
type="gamma"
amplitude=".86"
exponent="2.09"
offset=".05"
id="feFuncB4558" />
</feComponentTransfer>
<feColorMatrix
result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
id="feColorMatrix4562" />
<feColorMatrix
id="feColorMatrix4564"
values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 -1 0.5 0.5 1 0"
in="fbSourceGraphic"
result="colormatrix" />
<feComposite
in2="fbSourceGraphic"
id="feComposite4566"
in="colormatrix"
operator="in"
result="composite1" />
</filter>
<filter
style="color-interpolation-filters:sRGB"
id="filter4584">
<feComponentTransfer
result="fbSourceGraphic"
id="feComponentTransfer4576">
<feFuncR
type="gamma"
amplitude=".86"
exponent="2.09"
offset=".05"
id="feFuncR4570" />
<feFuncG
type="gamma"
amplitude=".86"
exponent="2.09"
offset=".05"
id="feFuncG4572" />
<feFuncB
type="gamma"
amplitude=".86"
exponent="2.09"
offset=".05"
id="feFuncB4574" />
</feComponentTransfer>
<feColorMatrix
result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
id="feColorMatrix4578" />
<feColorMatrix
id="feColorMatrix4580"
values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 -1 0.5 0.5 1 0"
in="fbSourceGraphic"
result="colormatrix" />
<feComposite
in2="fbSourceGraphic"
id="feComposite4582"
in="colormatrix"
operator="in"
result="composite1" />
</filter>
<filter
style="color-interpolation-filters:sRGB"
id="filter4600">
<feComponentTransfer
result="fbSourceGraphic"
id="feComponentTransfer4592">
<feFuncR
type="gamma"
amplitude=".86"
exponent="2.09"
offset=".05"
id="feFuncR4586" />
<feFuncG
type="gamma"
amplitude=".86"
exponent="2.09"
offset=".05"
id="feFuncG4588" />
<feFuncB
type="gamma"
amplitude=".86"
exponent="2.09"
offset=".05"
id="feFuncB4590" />
</feComponentTransfer>
<feColorMatrix
result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
id="feColorMatrix4594" />
<feColorMatrix
id="feColorMatrix4596"
values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 -1 0.5 0.5 1 0"
in="fbSourceGraphic"
result="colormatrix" />
<feComposite
in2="fbSourceGraphic"
id="feComposite4598"
in="colormatrix"
operator="in"
result="composite1" />
</filter>
<filter
style="color-interpolation-filters:sRGB"
id="filter4616">
<feComponentTransfer
result="fbSourceGraphic"
id="feComponentTransfer4608">
<feFuncR
type="gamma"
amplitude=".86"
exponent="2.09"
offset=".05"
id="feFuncR4602" />
<feFuncG
type="gamma"
amplitude=".86"
exponent="2.09"
offset=".05"
id="feFuncG4604" />
<feFuncB
type="gamma"
amplitude=".86"
exponent="2.09"
offset=".05"
id="feFuncB4606" />
</feComponentTransfer>
<feColorMatrix
result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
id="feColorMatrix4610" />
<feColorMatrix
id="feColorMatrix4612"
values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 -1 0.5 0.5 1 0"
in="fbSourceGraphic"
result="colormatrix" />
<feComposite
in2="fbSourceGraphic"
id="feComposite4614"
in="colormatrix"
operator="in"
result="composite1" />
</filter>
</defs>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="2560"
inkscape:window-height="1346"
id="namedview6"
showgrid="false"
inkscape:zoom="13.906433"
inkscape:cx="3.7439381"
inkscape:cy="12.69948"
inkscape:window-x="-11"
inkscape:window-y="49"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" />
<g
id="g1527"
transform="matrix(0.34104959,0,0,0.34104959,-132.83244,-85.218532)">
<path
inkscape:connector-curvature="0"
id="path1507"
d="m 420.18,269.92 -2.36,10.16 c 1.08,0.96 2.19,1.9 3.27,2.86 a 4.76,4.76 0 1 1 -1,2.95 v -0.02 -0.03 -0.01 l -3.54,0.01 a 8.3,8.3 0 1 0 5.44,-7.78 l 1.21,-4.45 h 7.36 l 1.94,-3.69 z"
style="opacity:1;fill:#7b1fa2;fill-opacity:1;stroke:none;stroke-width:0.93546373;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1214)" />
<path
inkscape:connector-curvature="0"
transform="matrix(0.48882,0,0,0.48882,376.63,254.42)"
style="fill:#ce93d8;fill-opacity:1;filter:url(#filter1214)"
class="st0"
d="m 35.2,63.1 c 0.1,-16.9 5.4,-31.5 16.3,-43.9 2.9,-3.3 6,-7.3 10.7,-3.1 4.2,3.8 1.3,7.4 -1.5,10.7 -13.7,16 -17.1,34.1 -10.6,54 2.2,6.9 6.2,12.9 11,18.3 2.8,3.2 4.8,6.8 0.9,10.2 -4,3.5 -7.1,0.8 -9.9,-2.4 C 40.8,94.4 35.2,79.6 35.2,63.1 Z"
id="path1509" />
<path
inkscape:connector-curvature="0"
transform="matrix(0.48882,0,0,0.48882,374.1,254.42)"
style="fill:#ce93d8;fill-opacity:1;filter:url(#filter1214)"
class="st0"
d="m 166.5,63.6 c -0.2,16.4 -6,31.2 -17.4,43.7 -2.7,3 -5.7,5.4 -9.5,2.3 -4,-3.3 -2.4,-7 0.6,-10.2 17.1,-18 18.5,-45.6 6.6,-64.5 -2,-3.1 -4.3,-6 -6.6,-8.9 -2.8,-3.3 -4.5,-6.9 -0.6,-10.2 3.8,-3.2 6.8,-0.7 9.5,2.2 11.6,12.9 17.4,27.8 17.4,45.6 z"
id="path1511" />
<path
inkscape:connector-curvature="0"
transform="matrix(0.48882,0,0,0.48882,376.43,254.42)"
style="fill:#9c27b0;fill-opacity:1;filter:url(#filter1214)"
class="st0"
d="m 57.5,63.1 c 0.3,-11.5 4,-21.3 11.4,-29.6 2.7,-3 5.7,-4.5 9.1,-1.6 3.4,2.9 2.5,6.3 -0.1,9.2 -6.5,7.4 -9.3,15.8 -8.2,25.6 0.7,6.1 3.1,11.4 7,16.1 2.8,3.3 5.6,7 1.2,10.6 -4.7,3.9 -7.7,0 -10.6,-3.5 -6.5,-7.8 -9.5,-17 -9.8,-26.8 z"
id="path1513" />
<path
inkscape:connector-curvature="0"
transform="matrix(0.48882,0,0,0.48882,374.37,254.42)"
style="fill:#9c27b0;fill-opacity:1;filter:url(#filter1214)"
class="st0"
d="m 144.1,63.6 c -0.3,10.2 -3.9,19.9 -11.4,28.3 -2.7,3 -5.7,4.5 -9.1,1.7 -3.4,-2.8 -2.3,-6.1 0,-9.3 11.7,-15.9 11.7,-27.2 0,-43.1 -2.3,-3.2 -3.5,-6.4 -0.1,-9.3 3.4,-2.9 6.4,-1.4 9.1,1.5 7.1,7.8 11.5,18.7 11.5,30.2 z"
id="path1515" />
<path
inkscape:connector-curvature="0"
style="opacity:1;fill:#7b1fa2;fill-opacity:1;stroke:none;stroke-width:0.93546373;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 419.95,269.15 -2.37,10.16 c 1.09,0.97 2.19,1.9 3.27,2.86 a 4.76,4.76 0 1 1 -1,2.95 v -0.02 -0.02 -0.02 l -3.54,0.02 a 8.3,8.3 0 1 0 5.44,-7.8 l 1.21,-4.44 h 7.37 l 1.93,-3.69 z"
id="path1517" />
<path
inkscape:connector-curvature="0"
id="path1519"
d="m 392.57,285.23 c 0.05,-8.26 2.64,-15.4 7.97,-21.45 1.42,-1.62 2.93,-3.57 5.23,-1.52 2.06,1.86 0.64,3.62 -0.73,5.23 -6.7,7.82 -8.36,16.67 -5.18,26.4 a 25.03,25.03 0 0 0 5.37,8.94 c 1.37,1.57 2.35,3.33 0.44,4.99 -1.95,1.7 -3.47,0.39 -4.83,-1.18 a 31.07,31.07 0 0 1 -8.27,-21.4 z"
class="st0"
style="fill:#ce93d8;fill-opacity:1;stroke-width:0.48881707" />
<path
inkscape:connector-curvature="0"
id="path1521"
d="m 456.76,285.48 a 31.51,31.51 0 0 1 -8.5,21.36 c -1.33,1.47 -2.8,2.64 -4.65,1.12 -1.96,-1.6 -1.18,-3.42 0.29,-4.98 8.36,-8.8 9.04,-22.3 3.23,-31.53 a 55.58,55.58 0 0 0 -3.23,-4.35 c -1.37,-1.61 -2.2,-3.37 -0.3,-4.99 1.86,-1.56 3.33,-0.34 4.65,1.08 a 32,32 0 0 1 8.5,22.29 z"
class="st0"
style="fill:#ce93d8;fill-opacity:1;stroke-width:0.48881707" />
<path
inkscape:connector-curvature="0"
id="path1523"
d="m 403.47,285.23 c 0.15,-5.62 1.96,-10.4 5.58,-14.46 1.32,-1.47 2.78,-2.2 4.45,-0.79 1.66,1.42 1.22,3.08 -0.05,4.5 a 15.5,15.5 0 0 0 -4.01,12.51 14.7,14.7 0 0 0 3.42,7.87 c 1.37,1.62 2.74,3.43 0.59,5.19 -2.3,1.9 -3.77,0 -5.18,-1.71 a 20.98,20.98 0 0 1 -4.8,-13.1 z"
class="st0"
style="fill:#9c27b0;fill-opacity:1;stroke-width:0.48881707" />
<path
inkscape:connector-curvature="0"
id="path1525"
d="m 445.8,285.48 a 21.3,21.3 0 0 1 -5.57,13.83 c -1.32,1.47 -2.78,2.2 -4.44,0.83 -1.67,-1.37 -1.13,-2.98 0,-4.54 5.71,-7.77 5.71,-13.3 0,-21.07 -1.13,-1.56 -1.72,-3.13 -0.05,-4.55 1.66,-1.41 3.13,-0.68 4.44,0.74 a 22.12,22.12 0 0 1 5.63,14.76 z"
class="st0"
style="fill:#9c27b0;fill-opacity:1;stroke-width:0.48881707" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
clip-rule="evenodd"
fill-rule="evenodd"
stroke-linejoin="round"
stroke-miterlimit="1.4142"
version="1.1"
viewBox="0 0 24 24"
xml:space="preserve"
id="svg6"
sodipodi:docname="folder-ios.svg"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"><metadata
id="metadata12"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs10" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="794"
inkscape:window-height="480"
id="namedview8"
showgrid="false"
inkscape:zoom="9.8333333"
inkscape:cx="12"
inkscape:cy="12"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="svg6" /><path
d="m10 4h-6c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2v-10c0-1.11-.9-2-2-2h-8l-2-2z"
fill="#e57373"
fill-rule="nonzero"
style="fill:#78909c"
id="path2" /></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1,3 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="m8.9803 14.538 3.0197-8.0313 3.007 8.0313m-4.2757-11.419-6.9782 17.763h2.8547l1.421-3.8063h7.9298l1.4337 3.8063h2.8547l-6.9782-17.763z" fill="#f44336" stroke-width="1.2688"/>
</svg>

After

Width:  |  Height:  |  Size: 266 B

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="m2.6 10.59l5.78-5.79 1.69 1.7c-0.24 0.85 0.15 1.78 0.93 2.23v5.54c-0.6 0.34-1 0.99-1 1.73a2 2 0 0 0 2 2 2 2 0 0 0 2 -2c0-0.74-0.4-1.39-1-1.73v-4.86l2.07 2.09c-0.07 0.15-0.07 0.32-0.07 0.5a2 2 0 0 0 2 2 2 2 0 0 0 2 -2 2 2 0 0 0 -2 -2c-0.18 0-0.35 0-0.5 0.07l-2.57-2.57c0.26-0.93-0.22-1.95-1.15-2.34-0.43-0.16-0.88-0.2-1.28-0.09l-1.7-1.69 0.79-0.78c0.78-0.79 2.04-0.79 2.82 0l7.99 7.99c0.79 0.78 0.79 2.04 0 2.82l-7.99 7.99c-0.78 0.79-2.04 0.79-2.82 0l-7.99-7.99c-0.79-0.78-0.79-2.04 0-2.82z" fill="#e64a19"/>
</svg>

After

Width:  |  Height:  |  Size: 662 B

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<g fill="#0277bd" aria-label="h">
<path d="m16.745 19.818h-3.0066v-5.8824q0-2.381-1.7367-2.381-0.86836 0-1.4379 0.66294-0.56023 0.66294-0.56023 1.718v5.8824h-3.0159v-15.285h3.0159v6.508h0.03735q1.1858-1.8021 3.1933-1.8021 3.5108 0 3.5108 4.2391z" fill="#0277bd" stroke-width=".47806"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 439 B

View File

@@ -0,0 +1,3 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="m12 17.56l4.07-1.13.55-6.1h-7.24l-.18-2.03h7.6l.2-1.99h-10l.56 6.01h6.89l-.23 2.58-2.22.6-2.22-.6-.14-1.66h-2l.29 3.19 4.07 1.13m-7.93-14.56h15.86l-1.43 16.2-6.5 1.8-6.5-1.8-1.43-16.2z" fill="#e44d26"/>
</svg>

After

Width:  |  Height:  |  Size: 294 B

View File

@@ -0,0 +1,3 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="m12.976 9.0724h5.3677l-5.3677-5.3677v5.3677m-6.8316-6.8316h7.8075l5.8557 5.8557v11.711a1.9519 1.9519 0 0 1 -1.9519 1.9519h-11.711c-1.0833 0-1.9519-.87835-1.9519-1.9519v-15.615c0-1.0833.86859-1.9519 1.9519-1.9519m0 17.567h11.711v-7.8075l-3.9038 3.9038-1.9519-1.9519-5.8557 5.8557m1.9519-10.735a1.9519 1.9519 0 0 0 -1.9519 1.9519 1.9519 1.9519 0 0 0 1.9519 1.9519 1.9519 1.9519 0 0 0 1.9519 -1.9519 1.9519 1.9519 0 0 0 -1.9519 -1.9519z" fill="#26a69a" stroke-width=".97594"/>
</svg>

After

Width:  |  Height:  |  Size: 565 B

View File

@@ -0,0 +1,3 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="m2 21h18v-2h-18m18-11h-2v-3h2m0-2h-16v10a4 4 0 0 0 4 4h6a4 4 0 0 0 4 -4v-3h2a2 2 0 0 0 2 -2v-3c0-1.11-.9-2-2-2z" fill="#f44336"/>
</svg>

After

Width:  |  Height:  |  Size: 221 B

View File

@@ -0,0 +1,3 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="m3 3h18v18h-18v-18m4.73 15.04c.4.85 1.19 1.55 2.54 1.55 1.5 0 2.53-.8 2.53-2.55v-5.78h-1.7v5.74c0 .86-.35 1.08-.9 1.08-.58 0-.82-.4-1.09-.87l-1.38.83m5.98-.18c.5.98 1.51 1.73 3.09 1.73 1.6 0 2.8-.83 2.8-2.36 0-1.41-.81-2.04-2.25-2.66l-.42-.18c-.73-.31-1.04-.52-1.04-1.02 0-.41.31-.73.81-.73.48 0 .8.21 1.09.73l1.31-.87c-.55-.96-1.33-1.33-2.4-1.33-1.51 0-2.48.96-2.48 2.23 0 1.38.81 2.03 2.03 2.55l.42.18c.78.34 1.24.55 1.24 1.13 0 .48-.45.83-1.15.83-.83 0-1.31-.43-1.67-1.03l-1.38.8z" fill="#ffca28"/>
</svg>

After

Width:  |  Height:  |  Size: 593 B

View File

@@ -0,0 +1 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m5 3h2v2h-2v5a2 2 0 0 1 -2 2 2 2 0 0 1 2 2v5h2v2h-2c-1.07-.27-2-.9-2-2v-4a2 2 0 0 0 -2 -2h-1v-2h1a2 2 0 0 0 2 -2v-4a2 2 0 0 1 2 -2m14 0a2 2 0 0 1 2 2v4a2 2 0 0 0 2 2h1v2h-1a2 2 0 0 0 -2 2v4a2 2 0 0 1 -2 2h-2v-2h2v-5a2 2 0 0 1 2 -2 2 2 0 0 1 -2 -2v-5h-2v-2h2m-7 12a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1 -1 1 1 0 0 1 1 -1m-4 0a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1 -1 1 1 0 0 1 1 -1m8 0a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1 -1 1 1 0 0 1 1 -1z" style="fill:#fbc02d"/></svg>

After

Width:  |  Height:  |  Size: 567 B

View File

@@ -0,0 +1,3 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="m7 14a2 2 0 0 1 -2 -2 2 2 0 0 1 2 -2 2 2 0 0 1 2 2 2 2 0 0 1 -2 2m5.65-4c-.82-2.33-3.04-4-5.65-4a6 6 0 0 0 -6 6 6 6 0 0 0 6 6c2.61 0 4.83-1.67 5.65-4h4.35v4h4v-4h2v-4z" fill="#26a69a"/>
</svg>

After

Width:  |  Height:  |  Size: 277 B

View File

@@ -0,0 +1 @@
<svg version="1.1" viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g transform="translate(130.53 -446.84)"><g transform="matrix(1.1065 0 0 1.1065 -22.624 -62.89)"></g><g transform="translate(-40.058 5e-6)"><path transform="translate(-56.769)" d="m72.489 479.59v.026c-2.4065-.0133-4.585-.0221-6.3269-.0177-7.537-.0658-13.846 4.0527-19.333 8.3466-5.9882 4.7034-11.114 10.842-12.72 19.065-.91522 4.8224-.72156 9.0372-.72156 13.248v33.184c0 11.717-4.3603 20.424-10.274 26.123-3.3311 3.2996-10.442 6.3131-18.529 9.0366v14.99c7.1674 1.976 14.067 4.6508 17.894 8.0478 6.3357 5.5351 10.902 13.499 10.902 23.904v38.754c0 12.875 3.0716 22.682 12.007 29.409 8.9364 6.7231 19.351 10.067 31.244 10.392l7.9592-.0531v-19.324c-6.2085-1.8172-9.6574-3.9248-12.144-6.3097-4.4749-4.0527-7.0091-10.635-7.0091-19.777v-31.292c-.17153-10.643-1.8874-18.968-5.7636-24.992-3.8761-6.0104-11.44-11.281-22.695-15.822 12.421-5.6889 20.755-13.108 25.005-22.259 2.5039-5.4426 3.4539-12.782 3.4539-22.012v-28.692c0-9.4776 2.1995-16.117 6.0104-19.909 2.0678-2.059 5.7459-3.7533 10.855-5.1256l8.0782.0564v-18.998h-17.894v.001z" style="fill:#0277bd"/><path transform="translate(-56.769)" d="m160.1 479.59v.026c2.4065-.0133 4.585-.0221 6.3269-.0177 7.5372-.0658 13.846 4.0527 19.333 8.3466 5.9883 4.7034 11.114 10.842 12.72 19.065.91522 4.8224.72155 9.0372.72155 13.248v33.184c0 11.717 4.3603 20.424 10.274 26.123 3.3311 3.2996 10.442 6.3131 18.529 9.0366v14.99c-7.1674 1.976-14.067 4.6508-17.894 8.0478-6.3358 5.5351-10.902 13.499-10.902 23.904v38.754c0 12.875-3.0716 22.682-12.008 29.409-8.9366 6.7231-19.351 10.067-31.244 10.392l-7.9592-.0531v-19.324c6.2085-1.8172 9.6574-3.9248 12.144-6.3097 4.4749-4.0527 7.0092-10.635 7.0092-19.777v-31.292c.17154-10.643 1.8875-18.968 5.7637-24.992 3.8762-6.0104 11.44-11.282 22.695-15.822-12.421-5.6889-20.755-13.108-25.005-22.259-2.5039-5.4426-3.454-12.782-3.454-22.012v-28.692c0-9.4776-2.1996-16.117-6.0104-19.909-2.0678-2.059-5.7459-3.7533-10.855-5.1256l-8.0782.0564v-18.998h17.894v.001z" style="fill:#0277bd"/></g></g></svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -0,0 +1,3 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="m2.25 15.75v-8h2l3 3 3-3h2v8h-2v-5.17l-3 3-3-3v5.17h-2m14-8h3v4h2.5l-4 4.5-4-4.5h2.5z" fill="#42a5f5"/>
</svg>

After

Width:  |  Height:  |  Size: 195 B

View File

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 24 24">
<path fill="#8bc34a" d="m12 1.85c-.27 0-.55.07-.78.2l-7.44 4.3c-.48.28-.78.8-.78 1.36v8.58c0 .56.3 1.08.78 1.36l1.95 1.12c.95.46 1.27.47 1.71.47 1.4 0 2.21-.85 2.21-2.33v-8.47c0-.12-.1-.22-.22-.22h-.93c-.13 0-.23.1-.23.22v8.47c0 .66-.68 1.31-1.77.76l-2.05-1.17c-.07-.05-.11-.13-.11-.21v-8.58c0-.09.04-.17.11-.21l7.44-4.29c.06-.04.16-.04.22 0l7.44 4.29c.07.04.11.12.11.21v8.58c0 .08-.04.16-.11.21l-7.44 4.29c-.06.04-.16.04-.23 0l-1.88-1.14c-.08-.03-.16-.04-.21-.01-.53.3-.63.36-1.12.51-.12.04-.31.11.07.32l2.48 1.47c.24.14.5.21.78.21s.54-.07.78-.21l7.44-4.29c.48-.28.78-.8.78-1.36v-8.58c0-.56-.3-1.08-.78-1.36l-7.44-4.3c-.23-.13-.5-.2-.78-.2m2 6.15c-2.12 0-3.39.89-3.39 2.39 0 1.61 1.26 2.08 3.3 2.28 2.43.24 2.62.6 2.62 1.08 0 .83-.67 1.18-2.23 1.18-1.98 0-2.4-.49-2.55-1.47-.02-.1-.11-.18-.22-.18h-.96c-.12 0-.21.09-.21.22 0 1.24.68 2.74 3.94 2.74 2.35 0 3.7-.93 3.7-2.55 0-1.61-1.08-2.03-3.37-2.34-2.31-.3-2.54-.46-2.54-1 0-.45.2-1.05 1.91-1.05 1.5 0 2.09.33 2.32 1.36.02.1.11.17.21.17h.97c.05 0 .11-.02.15-.07.04-.04.07-.1.05-.16-.14-1.78-1.32-2.6-3.7-2.6z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg data-name="Layer 1" version="1.1" viewBox="0 0 990 990" xmlns="http://www.w3.org/2000/svg">
<defs>
<style>.cls-1{fill:#cb3837;}.cls-2{fill:#fff;}</style>
</defs>
<title>n</title>
<path class="cls-1" d="m113.26 876.74v-763.47h763.47v763.47zm143.59-620.4v476.18h240.61v-376.89h140.21v376.96h95.457v-476.25z" fill="#e53935" stroke-width=".77119"/>
</svg>

After

Width:  |  Height:  |  Size: 402 B

View File

@@ -0,0 +1 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m13 9h5.5l-5.5-5.5v5.5m-7-7h8l6 6v12a2 2 0 0 1 -2 2h-12c-1.11 0-2-.9-2-2v-16a2 2 0 0 1 2 -2m4.93 10.44c.41.9.93 1.64 1.53 2.15l.41.32c-.87.16-2.07.44-3.34.93l-.11.04.5-1.04c.45-.87.78-1.66 1.01-2.4m6.48 3.81c.18-.18.27-.41.28-.66.03-.2-.02-.39-.12-.55-.29-.47-1.04-.69-2.28-.69l-1.29.07-.87-.58c-.63-.52-1.2-1.43-1.6-2.56l.04-.14c.33-1.33.64-2.94-.02-3.6-.16-.16-.38-.24-.61-.24h-.24c-.37 0-.7.39-.79.77-.37 1.33-.15 2.06.22 3.27v.01c-.25.88-.57 1.9-1.08 2.93l-.96 1.8-.89.49c-1.2.75-1.77 1.59-1.88 2.12-.04.19-.02.36.05.54l.03.05.48.31.44.11c.81 0 1.73-.95 2.97-3.07l.18-.07c1.03-.33 2.31-.56 4.03-.75 1.03.51 2.24.74 3 .74.44 0 .74-.11.91-.3m-.41-.71l.09.11c-.01.1-.04.11-.09.13h-.04l-.19.02c-.46 0-1.17-.19-1.9-.51.09-.1.13-.1.23-.1 1.4 0 1.8.25 1.9.35m-9.17 1.46c-.65 1.19-1.24 1.85-1.69 2 .05-.38.5-1.04 1.21-1.69l.48-.31m3.02-6.91c-.23-.9-.24-1.63-.07-2.05l.07-.12.15.05c.17.24.19.56.09 1.1l-.03.16-.16.82z" style="fill:#f44336"/></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M12,18.08C5.37,18.08 0,15.36 0,12C0,8.64 5.37,5.92 12,5.92C18.63,5.92 24,8.64 24,12C24,15.36 18.63,18.08 12,18.08M6.81,10.13C7.35,10.13 7.72,10.23 7.9,10.44C8.08,10.64 8.12,11 8.03,11.47C7.93,12 7.74,12.34 7.45,12.56C7.17,12.78 6.74,12.89 6.16,12.89H5.29L5.82,10.13H6.81M3.31,15.68H4.75L5.09,13.93H6.32C6.86,13.93 7.3,13.87 7.65,13.76C8,13.64 8.32,13.45 8.61,13.18C8.85,12.96 9.04,12.72 9.19,12.45C9.34,12.19 9.45,11.89 9.5,11.57C9.66,10.79 9.55,10.18 9.17,9.75C8.78,9.31 8.18,9.1 7.35,9.1H4.59L3.31,15.68M10.56,7.35L9.28,13.93H10.7L11.44,10.16H12.58C12.94,10.16 13.18,10.22 13.29,10.34C13.4,10.46 13.42,10.68 13.36,11L12.79,13.93H14.24L14.83,10.86C14.96,10.24 14.86,9.79 14.56,9.5C14.26,9.23 13.71,9.1 12.91,9.1H11.64L12,7.35H10.56M18,10.13C18.55,10.13 18.91,10.23 19.09,10.44C19.27,10.64 19.31,11 19.22,11.47C19.12,12 18.93,12.34 18.65,12.56C18.36,12.78 17.93,12.89 17.35,12.89H16.5L17,10.13H18M14.5,15.68H15.94L16.28,13.93H17.5C18.05,13.93 18.5,13.87 18.85,13.76C19.2,13.64 19.5,13.45 19.8,13.18C20.04,12.96 20.24,12.72 20.38,12.45C20.53,12.19 20.64,11.89 20.7,11.57C20.85,10.79 20.74,10.18 20.36,9.75C20,9.31 19.37,9.1 18.54,9.1H15.79L14.5,15.68Z" fill="#1E88E5" /></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -0,0 +1,35 @@
<svg version="1.1" viewBox="0 0 210 210" xmlns="http://www.w3.org/2000/svg">
<title>prettier-icon-dark</title>
<desc>Created with Sketch.</desc>
<g fill="none" fill-rule="evenodd">
<g id="prettier-icon-dark">
<g id="Icon-(Dark)">
<g id="Group" transform="translate(10.5 10.5) scale(.9)">
<rect id="Rectangle" x="165" y="40" width="20" height="10" rx="5" fill="#56B3B4"/>
<rect x="15" y="200" width="60" height="10" rx="5" fill="#EA5E5E"/>
<rect x="135" y="120" width="40" height="10" rx="5" fill="#BF85BF"/>
<rect x="75" y="120" width="50" height="10" rx="5" fill="#EA5E5E"/>
<rect x="15" y="120" width="50" height="10" rx="5" fill="#56B3B4"/>
<rect x="15" y="160" width="60" height="10" rx="5" fill="#BF85BF"/>
<rect x="15" y="80" width="60" height="10" rx="5" fill="#BF85BF"/>
<rect x="65" y="20" width="110" height="10" rx="5" fill="#F7BA3E"/>
<rect x="15" y="20" width="40" height="10" rx="5" fill="#EA5E5E"/>
<rect x="55" y="180" width="20" height="10" rx="5" fill="#F7BA3E"/>
<rect x="55" y="60" width="20" height="10" rx="5" fill="#56B3B4"/>
<rect x="15" y="180" width="30" height="10" rx="5" fill="#56B3B4"/>
<rect x="15" y="60" width="30" height="10" rx="5" fill="#F7BA3E"/>
<rect x="95" y="100" width="90" height="10" rx="5" fill="#56B3B4"/>
<rect x="45" y="100" width="40" height="10" rx="5" fill="#F7BA3E"/>
<rect x="15" y="100" width="20" height="10" rx="5" fill="#EA5E5E"/>
<rect x="105" y="40" width="50" height="10" rx="5" fill="#BF85BF"/>
<rect x="15" y="40" width="80" height="10" rx="5" fill="#56B3B4"/>
<rect x="45" y="140" width="100" height="10" rx="5" fill="#F7BA3E"/>
<rect x="15" y="140" width="20" height="10" rx="5" fill="#BF85BF"/>
<rect x="135" y="60" width="60" height="10" rx="5" fill="#EA5E5E"/>
<rect x="135" y="80" width="60" height="10" rx="5" fill="#F7BA3E"/>
<rect x="15" width="130" height="10" rx="5" fill="#56B3B4"/>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -0,0 +1,3 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="m12 10.11c1.03 0 1.87.84 1.87 1.89 0 1-.84 1.85-1.87 1.85s-1.87-.85-1.87-1.85c0-1.05.84-1.89 1.87-1.89m-4.63 9.89c.63.38 2.01-.2 3.6-1.7-.52-.59-1.03-1.23-1.51-1.9-.82-.08-1.63-.2-2.4-.36-.51 2.14-.32 3.61.31 3.96m.71-5.74l-.29-.51c-.11.29-.22.58-.29.86.27.06.57.11.88.16l-.3-.51m6.54-.76l.81-1.5-.81-1.5c-.3-.53-.62-1-.91-1.47-.54-.03-1.11-.03-1.71-.03s-1.17 0-1.71.03c-.29.47-.61.94-.91 1.47l-.81 1.5.81 1.5c.3.53.62 1 .91 1.47.54.03 1.11.03 1.71.03s1.17 0 1.71-.03c.29-.47.61-.94.91-1.47m-2.62-6.72c-.19.22-.39.45-.59.72h.59.59c-.2-.27-.4-.5-.59-.72m0 10.44c.19-.22.39-.45.59-.72h-.59-.59c.2.27.4.5.59.72m4.62-13.22c-.62-.38-2 .2-3.59 1.7.52.59 1.03 1.23 1.51 1.9.82.08 1.63.2 2.4.36.51-2.14.32-3.61-.32-3.96m-.7 5.74l.29.51c.11-.29.22-.58.29-.86-.27-.06-.57-.11-.88-.16l.3.51m1.45-7.05c1.47.84 1.63 3.05 1.01 5.63 2.54.75 4.37 1.99 4.37 3.68s-1.83 2.93-4.37 3.68c.62 2.58.46 4.79-1.01 5.63-1.46.84-3.45-.12-5.37-1.95-1.92 1.83-3.91 2.79-5.38 1.95-1.46-.84-1.62-3.05-1-5.63-2.54-.75-4.37-1.99-4.37-3.68s1.83-2.93 4.37-3.68c-.62-2.58-.46-4.79 1-5.63 1.47-.84 3.46.12 5.38 1.95 1.92-1.83 3.91-2.79 5.37-1.95m-.29 9.31c.34.75.64 1.5.89 2.26 2.1-.63 3.28-1.53 3.28-2.26s-1.18-1.63-3.28-2.26c-.25.76-.55 1.51-.89 2.26m-10.16 0c-.34-.75-.64-1.5-.89-2.26-2.1.63-3.28 1.53-3.28 2.26s1.18 1.63 3.28 2.26c.25-.76.55-1.51.89-2.26m9 2.26l-.3.51c.31-.05.61-.1.88-.16-.07-.28-.18-.57-.29-.86l-.29.51m-2.89 4.04c1.59 1.5 2.97 2.08 3.59 1.7.64-.35.83-1.82.32-3.96-.77.16-1.58.28-2.4.36-.48.67-.99 1.31-1.51 1.9m-4.95-8.56l.3-.51c-.31.05-.61.1-.88.16.07.28.18.57.29.86l.29-.51m2.89-4.04c-1.59-1.5-2.97-2.08-3.6-1.7-.63.35-.82 1.82-.31 3.96.77-.16 1.58-.28 2.4-.36.48-.67.99-1.31 1.51-1.9z" fill="#00bcd4"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -0,0 +1 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m12 10.11c1.03 0 1.87.84 1.87 1.89 0 1-.84 1.85-1.87 1.85s-1.87-.85-1.87-1.85c0-1.05.84-1.89 1.87-1.89m-4.63 9.89c.63.38 2.01-.2 3.6-1.7-.52-.59-1.03-1.23-1.51-1.9-.82-.08-1.63-.2-2.4-.36-.51 2.14-.32 3.61.31 3.96m.71-5.74l-.29-.51c-.11.29-.22.58-.29.86.27.06.57.11.88.16l-.3-.51m6.54-.76l.81-1.5-.81-1.5c-.3-.53-.62-1-.91-1.47-.54-.03-1.11-.03-1.71-.03s-1.17 0-1.71.03c-.29.47-.61.94-.91 1.47l-.81 1.5.81 1.5c.3.53.62 1 .91 1.47.54.03 1.11.03 1.71.03s1.17 0 1.71-.03c.29-.47.61-.94.91-1.47m-2.62-6.72c-.19.22-.39.45-.59.72h1.18c-.2-.27-.4-.5-.59-.72m0 10.44c.19-.22.39-.45.59-.72h-1.18c.2.27.4.5.59.72m4.62-13.22c-.62-.38-2 .2-3.59 1.7.52.59 1.03 1.23 1.51 1.9.82.08 1.63.2 2.4.36.51-2.14.32-3.61-.32-3.96m-.7 5.74l.29.51c.11-.29.22-.58.29-.86-.27-.06-.57-.11-.88-.16l.3.51m1.45-7.05c1.47.84 1.63 3.05 1.01 5.63 2.54.75 4.37 1.99 4.37 3.68s-1.83 2.93-4.37 3.68c.62 2.58.46 4.79-1.01 5.63-1.46.84-3.45-.12-5.37-1.95-1.92 1.83-3.91 2.79-5.38 1.95-1.46-.84-1.62-3.05-1-5.63-2.54-.75-4.37-1.99-4.37-3.68s1.83-2.93 4.37-3.68c-.62-2.58-.46-4.79 1-5.63 1.47-.84 3.46.12 5.38 1.95 1.92-1.83 3.91-2.79 5.37-1.95m-.29 9.31c.34.75.64 1.5.89 2.26 2.1-.63 3.28-1.53 3.28-2.26s-1.18-1.63-3.28-2.26c-.25.76-.55 1.51-.89 2.26m-10.16 0c-.34-.75-.64-1.5-.89-2.26-2.1.63-3.28 1.53-3.28 2.26s1.18 1.63 3.28 2.26c.25-.76.55-1.51.89-2.26m9 2.26l-.3.51c.31-.05.61-.1.88-.16-.07-.28-.18-.57-.29-.86l-.29.51m-2.89 4.04c1.59 1.5 2.97 2.08 3.59 1.7.64-.35.83-1.82.32-3.96-.77.16-1.58.28-2.4.36-.48.67-.99 1.31-1.51 1.9m-4.95-8.56l.3-.51c-.31.05-.61.1-.88.16.07.28.18.57.29.86l.29-.51m2.89-4.04c-1.59-1.5-2.97-2.08-3.6-1.7-.63.35-.82 1.82-.31 3.96.77-.16 1.58-.28 2.4-.36.48-.67.99-1.31 1.51-1.9z" fill="#00bcd4" style="fill:#0288d1"/></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -0,0 +1,3 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="M13,9H11V7H13M13,17H11V11H13M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z" fill="#42a5f5"/>
</svg>

After

Width:  |  Height:  |  Size: 214 B

View File

@@ -0,0 +1 @@
<svg enable-background="new 0 0 612 792" version="1.1" viewBox="0 0 500 500" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><g transform="matrix(1.311 0 0 1.311 -150.32 -269.45)" fill="#ec407a" stroke="#ec407a" stroke-width="12.423"><path d="m434.3 278.93c-9.3-36.49-69.8-48.48-127.06-28.14-34.08 12.11-70.96 31.11-97.49 55.92-31.54 29.5-36.57 55.17-34.49 65.9 7.31 37.85 59.18 62.6 80.5 80.95v.11c-6.29 3.09-52.3 26.38-63.07 50.19-11.36 25.12 1.81 43.14 10.53 45.57 27.02 7.52 54.74-6 69.65-28.23 14.38-21.45 13.18-49.14 6.93-62.92 8.62-2.27 18.67-3.29 31.44-1.8 36.04 4.21 43.11 26.71 41.76 36.13s-8.91 14.6-11.44 16.16-3.3 2.11-3.09 3.27c.31 1.69 1.48 1.63 3.63 1.26 2.97-.5 18.92-7.66 19.61-25.04.87-22.07-20.28-46.76-57.73-46.11-15.42.27-25.12 1.73-32.13 4.34-.52-.59-1.04-1.18-1.59-1.76-23.15-24.7-65.95-42.17-64.14-75.38.66-12.07 4.86-43.86 82.24-82.42 63.39-31.59 114.14-22.89 122.91-3.63 12.53 27.52-27.12 78.67-92.95 86.05-25.08 2.81-38.29-6.91-41.57-10.53-3.46-3.81-3.97-3.98-5.27-3.27-2.1 1.17-.77 4.53 0 6.54 1.97 5.12 10.03 14.19 23.78 18.7 12.1 3.97 41.54 6.15 77.16-7.62 39.88-15.45 71.03-58.37 61.88-94.24zm-169.69 185.94c2.99 11.06 2.66 21.37-.43 30.7-.34 1.04-.72 2.06-1.13 3.08-.41 1.01-.85 2.01-1.33 3-2.38 4.94-5.58 9.56-9.49 13.83-11.94 13.02-28.61 17.95-35.76 13.8-7.72-4.48-3.85-22.84 9.98-37.46 14.89-15.74 36.31-25.86 36.31-25.86l-.03-.06c.62-.34 1.24-.68 1.88-1.03z" fill="#ec407a" stroke="#ec407a" stroke-width="12.423"/></g></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -0,0 +1,3 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="m12.002 15.5a3.5 3.5 0 0 1 -3.5 -3.5 3.5 3.5 0 0 1 3.5 -3.5 3.5 3.5 0 0 1 3.5 3.5 3.5 3.5 0 0 1 -3.5 3.5m7.43-2.53c.04-.32.07-.64.07-.97s-.03-.66-.07-1l2.11-1.63c.19-.15.24-.42.12-.64l-2-3.46c-.12-.22-.39-.31-.61-.22l-2.49 1c-.52-.39-1.06-.73-1.69-.98l-.37-2.65c-.04-.24-.25-.42-.5-.42h-4c-.25 0-.46.18-.5.42l-.37 2.65c-.63.25-1.17.59-1.69.98l-2.49-1c-.22-.09-.49 0-.61.22l-2 3.46c-.13.22-.07.49.12.64l2.11 1.63c-.04.34-.07.67-.07 1s.03.65.07.97l-2.11 1.66c-.19.15-.25.42-.12.64l2 3.46c.12.22.39.3.61.22l2.49-1.01c.52.4 1.06.74 1.69.99l.37 2.65c.04.24.25.42.5.42h4c.25 0 .46-.18.5-.42l.37-2.65c.63-.26 1.17-.59 1.69-.99l2.49 1.01c.22.08.49 0 .61-.22l2-3.46c.12-.22.07-.49-.12-.64z" fill="#42a5f5"/>
</svg>

After

Width:  |  Height:  |  Size: 790 B

View File

@@ -0,0 +1 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m5.13 10.71h3.74l-2.65-2.65c-1.01 0-1.83-.82-1.83-1.84a1.83 1.83 0 0 1 1.83-1.83c1.02 0 1.84.82 1.84 1.83l2.65 2.65v-3.74c-.71-.72-.71-1.88 0-2.59.71-.72 1.87-.72 2.58 0 .71.71.71 1.87 0 2.59v3.74l2.66-2.65c0-1.01.81-1.83 1.83-1.83 1.01 0 1.83.82 1.83 1.83 0 1.02-.82 1.84-1.83 1.84l-2.65 2.65h3.74c.72-.71 1.88-.71 2.59 0 .72.71.72 1.87 0 2.58-.71.71-1.87.71-2.59 0h-3.74l2.65 2.66c1.01 0 1.83.81 1.83 1.83a1.83 1.83 0 0 1-1.83 1.83c-1.02 0-1.83-.82-1.83-1.83l-2.66-2.65v3.74c.71.72.71 1.88 0 2.59-.71.72-1.87.72-2.58 0-.71-.71-.71-1.87 0-2.59v-3.74l-2.65 2.65c0 1.01-.82 1.83-1.84 1.83-1.01 0-1.83-.82-1.83-1.83 0-1.02.82-1.83 1.83-1.83l2.65-2.66h-3.74c-.72.71-1.88.71-2.59 0-.72-.71-.72-1.87 0-2.58.71-.71 1.87-.71 2.59 0z" style="fill:#ffb300"/></svg>

After

Width:  |  Height:  |  Size: 839 B

View File

@@ -0,0 +1 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m5 19a1 1 0 0 0 1 1h12a1 1 0 0 0 1 -1c0-.21-.07-.41-.18-.57l-5.82-10.08v-4.35h-2v4.35l-5.82 10.08c-.11.16-.18.36-.18.57m1 3a3 3 0 0 1 -3 -3c0-.6.18-1.16.5-1.63l5.5-9.56v-1.81a1 1 0 0 1 -1 -1v-1a2 2 0 0 1 2 -2h4a2 2 0 0 1 2 2v1a1 1 0 0 1 -1 1v1.81l5.5 9.56c.32.47.5 1.03.5 1.63a3 3 0 0 1 -3 3h-12m7-6l1.34-1.34 1.93 3.34h-8.54l2.66-4.61 2.61 2.61m-.5-4a.5 .5 0 0 1 .5 .5 .5 .5 0 0 1 -.5 .5 .5 .5 0 0 1 -.5 -.5 .5 .5 0 0 1 .5 -.5z" style="fill:#ffca28"/></svg>

After

Width:  |  Height:  |  Size: 542 B

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="M5,19A1,1 0 0,0 6,20H18A1,1 0 0,0 19,19C19,18.79 18.93,18.59 18.82,18.43L13,8.35V4H11V8.35L5.18,18.43C5.07,18.59 5,18.79 5,19M6,22A3,3 0 0,1 3,19C3,18.4 3.18,17.84 3.5,17.37L9,7.81V6A1,1 0 0,1 8,5V4A2,2 0 0,1 10,2H14A2,2 0 0,1 16,4V5A1,1 0 0,1 15,6V7.81L20.5,17.37C20.82,17.84 21,18.4 21,19A3,3 0 0,1 18,22H6M13,16L14.34,14.66L16.27,18H7.73L10.39,13.39L13,16M12.5,12A0.5,0.5 0 0,1 13,12.5A0.5,0.5 0 0,1 12.5,13A0.5,0.5 0 0,1 12,12.5A0.5,0.5 0 0,1 12.5,12Z" fill="#00bcd4"/>
</svg>

After

Width:  |  Height:  |  Size: 628 B

View File

@@ -0,0 +1 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m5 19a1 1 0 0 0 1 1h12a1 1 0 0 0 1 -1c0-.21-.07-.41-.18-.57l-5.82-10.08v-4.35h-2v4.35l-5.82 10.08c-.11.16-.18.36-.18.57m1 3a3 3 0 0 1 -3 -3c0-.6.18-1.16.5-1.63l5.5-9.56v-1.81a1 1 0 0 1 -1 -1v-1a2 2 0 0 1 2 -2h4a2 2 0 0 1 2 2v1a1 1 0 0 1 -1 1v1.81l5.5 9.56c.32.47.5 1.03.5 1.63a3 3 0 0 1 -3 3h-12m7-6l1.34-1.34 1.93 3.34h-8.54l2.66-4.61 2.61 2.61m-.5-4a.5 .5 0 0 1 .5 .5 .5 .5 0 0 1 -.5 .5 .5 .5 0 0 1 -.5 -.5 .5 .5 0 0 1 .5 -.5z" style="fill:#0288D1"/></svg>

After

Width:  |  Height:  |  Size: 542 B

View File

@@ -0,0 +1,6 @@
<svg clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" version="1.1" viewBox="0 0 500 500" xmlns="http://www.w3.org/2000/svg">
<g transform="translate(-3,-5)" fill="#0288d1">
<path d="m457 459h-408v-408h408zm-388-388v368h368v-368z"/>
<path d="m352.8 242.85c-2.3473-.007-4.5031.0525-6.1139.20494-12.593 1.0948-24.356 6.5951-32.407 15.153-4.0336 4.2878-7.6869 10.436-9.4719 15.939-1.9673 6.0654-1.9531 5.9489-1.943 15.451.01 12.138.6271 15.145 4.757 23.218 4.1524 8.1182 10.479 14.749 19.608 20.55 4.0005 2.5424 14.245 7.651 22.611 11.275 18.211 7.8886 23.972 11.528 26.645 16.835l1.1036 2.1907v4.5892c0 4.4272-.0175 4.6548-.91789 6.4802-2.0542 4.2242-6.9029 7.6825-13.112 9.3538-2.3476.63061-3.4235.71994-8.671.7217-5.1361 0-6.3831-.10511-8.7371-.69191-4.1102-1.0388-7.5727-2.478-10.28-4.2708-3.3144-2.1949-9.8319-8.7747-12.483-12.603-1.1701-1.6904-2.345-3.0747-2.6084-3.0747-.43618 0-22.907 12.847-26.829 15.338-1.3225.84082-1.6571 1.2227-1.6571 1.8962 0 1.3961 5.2502 9.3316 9.363 14.152 8.3785 9.8214 25.182 18.481 40.066 20.649 5.8834.85658 15.657 1.1334 22.485.63061 4.4736-.32756 8.9956-1.1771 13.855-2.602 17.58-5.1566 29.575-16.112 34.02-31.074 1.8125-6.1034 2.5461-13.61 1.947-19.943-1.2279-12.994-5.2221-22.18-13.106-30.137-7.3213-7.3883-17.372-13.341-37.209-22.039-17.199-7.5414-21.688-10.47-24.167-15.768-2.14-4.5731-1.7324-10.867.95992-14.778 3.1497-4.5782 9.5805-6.8398 16.751-5.8902 6.6678.88109 10.98 3.5237 15.205 9.3128 2.1936 3.0066 3.7166 4.5724 4.447 4.5724.71995 0 3.822-1.9144 13.451-8.3065 9.8017-6.5068 12.884-8.7143 13.095-9.3799.32756-1.0317-1.2087-3.4457-5.7021-8.9586-9.0231-11.067-19.631-16.942-33.25-18.416-3.3445-.3626-7.7899-.56404-11.702-.5763zm-108.35 1.8778c-8.0854-.005-17.321-.00034-27.583.01-53.219.0525-65.571.14013-65.904.48347-.32406.32406-.40814 3.5866-.40814 15.766v15.357l24.201.0876 24.201.0876.005 68.503c.002 37.677.0875 68.822.20495 69.212l.18217.71119h17.588c15.747 0 17.607-.035 17.779-.49749.1051-.27502.18217-31.42.18217-69.212v-68.714l24.201-.0875 24.201-.0876v-15.542c0-13.471-.0526-15.581-.47296-15.842-.22246-.14014-14.127-.22422-38.383-.23648z" clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" stroke-width=".31533"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -0,0 +1,3 @@
<svg clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" version="1.1" viewBox="0 0 500 500" xmlns="http://www.w3.org/2000/svg">
<path d="m46 46v408h408v-408h-408zm310.02 198.17v.00586c3.9124.01226 8.3586.21357 11.703.57617 13.619 1.4734 24.225 7.349 33.248 18.416 4.4934 5.5129 6.0307 7.9253 5.7031 8.957-.21108.66564-3.294 2.874-13.096 9.3809-9.6287 6.3921-12.731 8.3066-13.451 8.3066-.73045 0-2.2517-1.5657-4.4453-4.5723-4.2244-5.7892-8.5373-8.4314-15.205-9.3125-7.1704-.9496-13.602 1.3105-16.752 5.8887-2.6923 3.9112-3.099 10.206-.95899 14.779 2.4792 5.2976 6.9671 8.2262 24.166 15.768 19.836 8.6975 29.888 14.651 37.209 22.039 7.8838 7.9563 11.878 17.143 13.105 30.137.59907 6.3332-.13284 13.84-1.9453 19.943-4.4447 14.961-16.439 25.916-34.02 31.072-4.8597 1.4248-9.3818 2.276-13.855 2.6035-6.8282.50274-16.603.22572-22.486-.63086-14.884-2.1677-31.686-10.829-40.064-20.65-4.1128-4.8205-9.3633-12.754-9.3633-14.15 0-.67351.33372-1.0557 1.6562-1.8965 3.9213-2.4911 26.394-15.338 26.83-15.338.26345 0 1.4373 1.3838 2.6074 3.0742 2.6512 3.8278 9.17 10.407 12.484 12.602 2.7074 1.7928 6.1691 3.2327 10.279 4.2715 2.3539.5868 3.6002.69141 8.7363.69141 5.2475-.00176 6.3243-.0901 8.6719-.72071 6.2096-1.6713 11.057-5.1293 13.111-9.3535.90039-1.8254.91797-2.0533.91797-6.4805v-4.5898l-1.1035-2.1894c-2.6734-5.3067-8.4338-8.9474-26.645-16.836-8.3655-3.6237-18.611-8.733-22.611-11.275-9.1282-5.801-15.455-12.433-19.607-20.551-4.13-8.073-4.7459-11.078-4.7559-23.217-.01017-9.5024-.02592-9.3858 1.9414-15.451 1.785-5.5038 5.439-11.652 9.4727-15.939 8.0511-8.5582 19.813-14.058 32.406-15.152 1.6108-.15244 3.768-.21208 6.1152-.20508zm-108.36 1.877h.00391c24.253.01227 38.156.0962 38.379.23633.42036.2603.47265 2.3708.47265 15.842v15.541l-24.201.08789-24.201.08789v68.713c0 37.793-.07654 68.938-.18164 69.213-.17115.46249-2.0325.49805-17.779.49805h-17.588l-.18164-.71094c-.11745-.39011-.20308-31.536-.20508-69.213l-.00586-68.504-24.201-.08594-24.201-.08789v-15.357c0-12.18.08414-15.442.4082-15.766.333-.34334 12.684-.43187 65.902-.48437 10.261-.01034 19.495-.01477 27.58-.00977z" fill="#0288d1"/>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="M18,4L20,8H17L15,4H13L15,8H12L10,4H8L10,8H7L5,4H4A2,2 0 0,0 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V4H18Z" fill="#ff9800"/>
</svg>

After

Width:  |  Height:  |  Size: 279 B

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="m13 9h5.5l-5.5-5.5v5.5m-7-7h8l6 6v12a2 2 0 0 1 -2 2h-12c-1.11 0-2-0.9-2-2v-16c0-1.11 0.89-2 2-2m0.12 13.5l3.74 3.74 1.42-1.41-2.33-2.33 2.33-2.33-1.42-1.41-3.74 3.74m11.16 0l-3.74-3.74-1.42 1.41 2.33 2.33-2.33 2.33 1.42 1.41 3.74-3.74z" fill="#8bc34a"/>
</svg>

After

Width:  |  Height:  |  Size: 408 B

View File

@@ -0,0 +1 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m5 3h2v2h-2v5a2 2 0 0 1 -2 2 2 2 0 0 1 2 2v5h2v2h-2c-1.07-.27-2-.9-2-2v-4a2 2 0 0 0 -2 -2h-1v-2h1a2 2 0 0 0 2 -2v-4a2 2 0 0 1 2 -2m14 0a2 2 0 0 1 2 2v4a2 2 0 0 0 2 2h1v2h-1a2 2 0 0 0 -2 2v4a2 2 0 0 1 -2 2h-2v-2h2v-5a2 2 0 0 1 2 -2 2 2 0 0 1 -2 -2v-5h-2v-2h2m-7 12a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1 -1 1 1 0 0 1 1 -1m-4 0a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1 -1 1 1 0 0 1 1 -1m8 0a1 1 0 0 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 -1 -1 1 1 0 0 1 1 -1z" style="fill:#f44336"/></svg>

After

Width:  |  Height:  |  Size: 567 B

View File

@@ -0,0 +1,3 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="m14 17h-2v-2h-2v-2h2v2h2m0-6h-2v2h2v2h-2v-2h-2v-2h2v-2h-2v-2h2v2h2m5-4h-14c-1.11 0-2 .89-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2 -2v-14c0-1.11-.9-2-2-2z" fill="#afb42b"/>
</svg>

After

Width:  |  Height:  |  Size: 258 B

View File

@@ -0,0 +1,201 @@
ul#files {
width: 100%;
height: 100%;
overflow: hidden;
column-count: 3;
}
ul#files li {
margin-bottom: 6px;
line-height: 30px;
}
ul#files li a {
display: block;
height: 30px;
border: 1px solid #e9e9e9;
border-radius: 5px;
padding: 2px;
/* overflow: hidden; */
/* white-space: nowrap; */
}
ul#files li a:focus,
ul#files li a:hover {
background: rgba(255, 255, 255, 0.65);
border: 1px solid #dadada;
}
ul#files li a.highlight {
transition: background 0.4s ease-in-out;
background: #add6ff66;
border-color: #add6ff8c;
}
ul#files li a span {
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
ul#files li.hidden {
display: none;
}
#search {
display: block;
position: fixed;
top: 20px;
right: 20px;
width: 90px;
transition: width ease 0.2s, opacity ease 0.4s;
/* border-radius: 4px; */
-webkit-font-smoothing: antialiased;
text-align: left;
font: 14px 'Helvetica Neue', Arial, sans-serif;
padding: 6px 12px;
border: none;
background: #f1f1f1;
margin-bottom: 0;
outline: none;
opacity: 0.7;
color: #888;
}
#search:focus {
width: 120px;
opacity: 1;
}
@media (min-width: 1024px) {
input#search {
right: max(100px, calc(100vw / 2 - 512px));
}
}
/*views*/
#files span {
display: inline-block;
overflow: hidden;
text-overflow: ellipsis;
text-indent: 10px;
}
#files .name {
background-repeat: no-repeat;
background-position: 6px center;
}
#files .icon .name {
text-indent: 28px;
background-size: 16px 16px;
}
/*tiles*/
.view-tiles .name {
width: 100%;
background-position: 8px 5px;
}
.view-tiles .size,
.view-tiles .date {
display: none;
}
/*details*/
ul#files.view-details li {
float: none;
display: block;
width: 90%;
}
ul#files.view-details li.header {
height: 25px;
background: #000;
color: #fff;
font-weight: bold;
}
.view-details .header {
border-radius: 5px;
}
.view-details .name {
width: 60%;
background-position: 8px 5px;
}
.view-details .size {
width: 10%;
}
.view-details .date {
width: 30%;
}
.view-details .size,
.view-details .date {
text-align: right;
direction: rtl;
}
/*small*/
@media (max-width: 768px) {
}
/*smaller*/
@media (max-width: 640px) {
ul#files {
column-count: 2;
}
}
/*mobile*/
@media (max-width: 480px) {
body {
font-size: 14px;
line-height: 16px;
}
#search {
position: static;
width: 100%;
font-size: 2em;
line-height: 1.8em;
text-indent: 10px;
border: 0;
border-radius: 0;
padding: 10px 0;
margin: 0;
}
#search:focus {
width: 100%;
border: 0;
opacity: 1;
}
ul#files {
border-top: 1px solid #cacaca;
column-count: 1;
}
ul#files li {
float: none;
width: auto !important;
display: block;
border-bottom: 1px solid #cacaca;
font-size: 2em;
line-height: 1.2em;
text-indent: 0;
margin: 0;
}
ul#files li a {
height: auto;
border: 0;
border-radius: 0;
padding: 15px 10px;
}
ul#files li a span {
vertical-align: middle;
}
ul#files li a:focus,
ul#files li a:hover {
border: 0;
}
#files .header,
#files .size,
#files .date {
display: none !important;
}
#files .name {
float: none;
display: inline-block;
width: 100%;
text-indent: 0;
background-position: 0 50%;
}
#files .icon .name {
text-indent: 41px;
background-size: 28px 28px;
background-position: 2px center;
}
}

View File

@@ -0,0 +1 @@
Files used by execPHP.ts

View File

@@ -0,0 +1,54 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>PHP ERROR</title>
<script
async
data-id="five-server"
data-file="{filePath}"
type="application/javascript"
src="/fiveserver.js"
></script>
<link rel="stylesheet" href="/fiveserver/serve-preview/vs.min.css" />
<script src="/fiveserver/serve-preview/highlight.min.js"></script>
</head>
<body>
<style>
html,
body {
font-family: Arial, Helvetica, sans-serif;
color: #555;
background-color: #efecec;
}
body {
text-align: center;
}
#content {
text-align: left;
display: inline-block;
}
.is-code {
background: #e0e0e0;
padding: 2px 5px;
border-radius: 2px;
}
</style>
<div id="content">
<h2>PHP ERROR</h2>
<div style="margin-right: 8px">
<pre
margin="0px;"
><code style="padding: 16px; border: 1px gray solid; font-size: 16px;" class="language-bash">{msg}</code></pre>
</div>
</div>
<script>
hljs.highlightAll();
</script>
</body>
</html>

View File

@@ -0,0 +1,64 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>PHP ERROR</title>
<link rel="stylesheet" href="/fiveserver/serve-preview/vs.min.css" />
<script src="/fiveserver/serve-preview/highlight.min.js"></script>
</head>
<body>
<style>
html,
body {
font-family: Arial, Helvetica, sans-serif;
color: #555;
background-color: #efecec;
}
body {
text-align: center;
}
#content {
text-align: left;
display: inline-block;
}
.is-code {
background: #e0e0e0;
padding: 2px 5px;
border-radius: 2px;
}
</style>
<div id="content">
<h2>PHP ERROR</h2>
<p>{msg}</p>
<h3>Install PHP</h3>
<p>Download and install <a href="https://www.apachefriends.org/index.html">XAMPP</a>.</p>
<h3>Get PHP Path</h3>
<p>Follow the steps below to get the path to the PHP executable:</p>
<ul>
<li><b>Ubuntu:</b> Enter <code class="is-code">which php</code> in your Terminal.</li>
<li><b>macOS:</b> Enter <code class="is-code">which php</code> in your Terminal.</li>
<li><b>Windows:</b> Search for php.exe.</li>
</ul>
<h3>Config File Example</h3>
<div style="margin-right: 8px">
<pre
margin="0px;"
><code style="padding: 16px; border: 1px gray solid; font-size: 16px;" class="language-php">// fiveserver.config.js
module.exports = {
php: "/usr/bin/php" // macOS/Ubuntu
php: "C:\\xampp\\php\\php.exe" // Windows
}</code></pre>
</div>
</div>
<script>
hljs.highlightAll();
</script>
</body>
</html>

View File

@@ -0,0 +1,5 @@
/**
* @copyright Copyright (c) 2006-2021, Ivan Sagalaev
* @license ${link https://github.com/highlightjs/highlight.js/blob/main/LICENSE|BSD-3-Clause}
* @description highlight.min.js, vs.min.css and vs2015.min.css are from Highlight.js 10.7.2 (00233d63) (https://github.com/highlightjs/highlight.js)
*/

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,77 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Preview</title>
<script
async
data-id="five-server"
data-file="${filePath}"
type="application/javascript"
src="/fiveserver.js"
></script>
<link rel="stylesheet" href="/fiveserver/serve-preview/vs.min.css" />
<script src="/fiveserver/serve-preview/highlight.min.js"></script>
<link rel="stylesheet" href="/fiveserver/scripts/directory.css" />
<style>
html {
background: white !important;
}
body {
padding: 0;
margin: 0;
min-height: unset;
max-width: unset;
/* overflow: hidden; */
}
.preview-fullscreen iframe {
min-height: 100vh !important;
}
.preview-fullscreen img,
.preview-fullscreen video {
width: 100%;
max-height: 100vh;
margin: 0 auto;
}
.preview-fullscreen code {
min-height: calc(100vh - 64px) !important;
margin: 16px !important;
margin-bottom: 32px !important;
}
</style>
</head>
<body>
<div class="preview-fullscreen">{preview}</div>
<script>
let fileName = "{fileName}";
let ext = "{ext}";
let lang = hljs.getLanguage(ext);
if (ext === "pdf") document.body.style.overflow = "hidden";
if (lang && lang.aliases && typeof lang.aliases[0] === "string") {
lang = lang.aliases[0];
} else if (lang && lang.name) {
if (/,/gm.test(lang.name)) {
lang.name = lang.name.split(",")[0];
}
ext = lang.name.toLowerCase();
} else {
ext = "txt";
}
const pre = document.querySelector("pre");
if (pre) {
console.log("language-" + ext);
pre.classList.add("language-" + ext);
hljs.highlightAll();
}
</script>
</body>
</html>

View File

@@ -0,0 +1,65 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Preview</title>
<script
async
data-id="five-server"
data-file="${filePath}"
type="application/javascript"
src="/fiveserver.js"
></script>
<link rel="stylesheet" href="/fiveserver/serve-preview/vs.min.css" />
<script src="/fiveserver/serve-preview/highlight.min.js"></script>
<link rel="stylesheet" href="/fiveserver/scripts/directory.css" />
</head>
<body>
<div id="wrapper">
<div class="directory">
<h1>
<a href="/">~</a>{linked-path}<small style="margin-left: 12px">
<a href="{fileName}{ext}.fullscreen">[fullscreen]</a>
</small>
</h1>
{phpMsg}
<div class="preview">{preview}</div>
</div>
<div class="footer">
<p>Preview Developed by <a href="https://github.com/yandeu">@yandeu</a></p>
</div>
</div>
<script>
let fileName = "{fileName}";
let ext = "{ext}";
let lang = hljs.getLanguage(ext);
if (lang && lang.aliases && typeof lang.aliases[0] === "string") {
lang = lang.aliases[0];
} else if (lang && lang.name) {
if (/,/gm.test(lang.name)) {
lang.name = lang.name.split(",")[0];
}
ext = lang.name.toLowerCase();
} else {
ext = "txt";
}
const pre = document.querySelector("pre");
if (pre) {
console.log("language-" + ext);
pre.classList.add("language-" + ext);
hljs.highlightAll();
}
</script>
</body>
</html>

View File

@@ -0,0 +1,62 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>404</title>
<script
async
data-id="five-server"
data-file="${filePath}"
type="application/javascript"
src="/fiveserver.js"
></script>
<link rel="stylesheet" href="/fiveserver/scripts/directory.css" />
</head>
<body>
<style>
.not-found {
align-items: center;
display: flex;
flex-wrap: wrap;
justify-content: center;
margin: 8px;
padding-top: 64px;
}
.not-found > :first-child {
border-right: 1px #555 solid;
display: inline-block;
font-size: 36px;
font-weight: bold;
height: 54px;
margin-bottom: 12px;
margin-right: 22px;
padding-right: 22px;
padding-top: 6px;
}
.not-found > :last-child {
font-size: 18px;
margin-bottom: 12px;
}
</style>
<div id="wrapper">
<div class="directory">
<h1><a href="/">~</a>{linked-path}</h1>
<div class="not-found">
<div><span>{status}</span></div>
<span>{message}</span>
</div>
</div>
<div class="footer">
<p>Page Developed by <a href="https://github.com/yandeu">@yandeu</a></p>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1 @@
.hljs{display:block;overflow-x:auto;padding:.5em;background:#fff;color:#000}.hljs-comment,.hljs-quote,.hljs-variable{color:green}.hljs-built_in,.hljs-keyword,.hljs-name,.hljs-selector-tag,.hljs-tag{color:#00f}.hljs-addition,.hljs-attribute,.hljs-literal,.hljs-section,.hljs-string,.hljs-template-tag,.hljs-template-variable,.hljs-title,.hljs-type{color:#a31515}.hljs-deletion,.hljs-meta,.hljs-selector-attr,.hljs-selector-pseudo{color:#2b91af}.hljs-doctag{color:grey}.hljs-attr{color:red}.hljs-bullet,.hljs-link,.hljs-symbol{color:#00b0e8}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}

View File

@@ -0,0 +1 @@
.hljs{display:block;overflow-x:auto;padding:.5em;background:#1e1e1e;color:#dcdcdc}.hljs-keyword,.hljs-literal,.hljs-name,.hljs-symbol{color:#569cd6}.hljs-link{color:#569cd6;text-decoration:underline}.hljs-built_in,.hljs-type{color:#4ec9b0}.hljs-class,.hljs-number{color:#b8d7a3}.hljs-meta-string,.hljs-string{color:#d69d85}.hljs-regexp,.hljs-template-tag{color:#9a5334}.hljs-formula,.hljs-function,.hljs-params,.hljs-subst,.hljs-title{color:#dcdcdc}.hljs-comment,.hljs-quote{color:#57a64a;font-style:italic}.hljs-doctag{color:#608b4e}.hljs-meta,.hljs-meta-keyword,.hljs-tag{color:#9b9b9b}.hljs-template-variable,.hljs-variable{color:#bd63c5}.hljs-attr,.hljs-attribute,.hljs-builtin-name{color:#9cdcfe}.hljs-section{color:gold}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-bullet,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-selector-pseudo,.hljs-selector-tag{color:#d7ba7d}.hljs-addition{background-color:#144212;display:inline-block;width:100%}.hljs-deletion{background-color:#600;display:inline-block;width:100%}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,407 @@
/* eslint-disable prefer-object-spread */
/* eslint-disable prefer-template */
/**
* @copyright
* Copyright (c) 2012 - present Adobe Systems Incorporated. All rights reserved. (https://github.com/adobe)
* Copyright (c) 2021 Yannick Deubel (https://github.com/yandeu)
*
* @license {@link https://github.com/yandeu/five-server/blob/main/LICENSE LICENSE}
*
* @description
* copied from https://github.com/adobe/brackets/blob/master/src/LiveDevelopment/Agents/RemoteFunctions.js
* previously licensed under MIT (https://github.com/adobe/brackets/blob/master/LICENSE)
*/
let _remoteHighlight
const HIGHLIGHT_CLASS_NAME = '__brackets-ld-highlight'
const config = {
experimental: false, // enable experimental features
debug: true, // enable debug output and helpers
autoConnect: false, // go live automatically after startup?
highlight: true, // enable highlighting?
highlightConfig: {
// the highlight configuration for the Inspector
borderColor: { r: 255, g: 229, b: 153, a: 0.66 },
contentColor: { r: 111, g: 168, b: 220, a: 0.55 },
marginColor: { r: 246, g: 178, b: 107, a: 0.66 },
paddingColor: { r: 147, g: 196, b: 125, a: 0.66 },
showInfo: true
},
remoteHighlight: {
animateStartValue: {
'background-color': 'rgba(0, 162, 255, 0.5)',
opacity: 0
},
animateEndValue: {
'background-color': 'rgb(106, 171, 233)', //'rgba(0, 162, 255, 0)',
opacity: 0.6
},
paddingStyling: {
//'border-width': '1px',
//'border-style': 'dashed',
//'border-color': 'rgba(0, 162, 255, 0.5)',
'background-color': 'rgb(156, 221, 156)'
},
marginStyling: {
'background-color': 'rgb(255 ,177 ,95)' // 'rgba(21, 165, 255, 0.58)'
},
borderColor: 'rgba(21, 165, 255, 0.85)',
showPaddingMargin: true
}
}
// Checks if the element is in Viewport in the client browser
function isInViewport(element) {
const rect = element.getBoundingClientRect()
const html = window.document.documentElement
return (
rect.top >= 0 &&
rect.left >= 0 &&
rect.bottom <= (window.innerHeight || html.clientHeight) &&
rect.right <= (window.innerWidth || html.clientWidth)
)
}
// set an event on a element
function _trigger(element, name, value, autoRemove?) {
// MOD(yandeu): Do not automatically remove the highlight.
/*
const key = 'data-ld-' + name
if (value !== undefined && value !== null) {
element.setAttribute(key, value)
if (autoRemove) {
window.setTimeout(element.removeAttribute.bind(element, key))
}
} else {
element.removeAttribute(key)
}
*/
}
// compute the screen offset of an element
function _screenOffset(element) {
const elemBounds = element.getBoundingClientRect(),
body = window.document.body
let offsetTop, offsetLeft
if (window.getComputedStyle(body).position === 'static') {
offsetLeft = elemBounds.left + window.pageXOffset
offsetTop = elemBounds.top + window.pageYOffset
} else {
const bodyBounds = body.getBoundingClientRect()
offsetLeft = elemBounds.left - bodyBounds.left
offsetTop = elemBounds.top - bodyBounds.top
}
return { left: offsetLeft, top: offsetTop }
}
// returns the distance from the top of the closest relatively positioned parent element
function getDocumentOffsetTop(element) {
return element.offsetTop + (element.offsetParent ? getDocumentOffsetTop(element.offsetParent) : 0)
}
// redraw active highlights
function redrawHighlights() {
if (_remoteHighlight) {
_remoteHighlight.redraw()
}
}
let req, timeout
const animateHighlight = function (time) {
if (req) {
window.cancelAnimationFrame(req)
window.clearTimeout(timeout)
}
req = window.requestAnimationFrame(redrawHighlights)
timeout = setTimeout(function () {
window.cancelAnimationFrame(req)
req = null
}, time * 1000)
}
export class Highlight {
trigger: boolean
elements: any[] = []
selector = '[data-highlight="true"]'
constructor(trigger: boolean) {
this.trigger = !!trigger
}
elementExists(element) {
let i
for (i in this.elements) {
if (this.elements[i] === element) {
return true
}
}
return false
}
makeHighlightDiv(element, doAnimation) {
const elementBounds = element.getBoundingClientRect(),
highlight = window.document.createElement('div'),
elementStyling = window.getComputedStyle(element),
transitionDuration = parseFloat(elementStyling.getPropertyValue('transition-duration')),
animationDuration = parseFloat(elementStyling.getPropertyValue('animation-duration'))
if (transitionDuration) {
animateHighlight(transitionDuration)
}
if (animationDuration) {
animateHighlight(animationDuration)
}
// Don't highlight elements with 0 width & height
if (elementBounds.width === 0 && elementBounds.height === 0) {
return
}
const realElBorder = {
right: elementStyling.getPropertyValue('border-right-width'),
left: elementStyling.getPropertyValue('border-left-width'),
top: elementStyling.getPropertyValue('border-top-width'),
bottom: elementStyling.getPropertyValue('border-bottom-width')
}
const borderBox = elementStyling.boxSizing === 'border-box'
let innerWidth = parseFloat(elementStyling.width),
innerHeight = parseFloat(elementStyling.height),
outerHeight = innerHeight,
outerWidth = innerWidth
if (!borderBox) {
innerWidth += parseFloat(elementStyling.paddingLeft) + parseFloat(elementStyling.paddingRight)
innerHeight += parseFloat(elementStyling.paddingTop) + parseFloat(elementStyling.paddingBottom)
;(outerWidth = innerWidth + parseFloat(realElBorder.right) + parseFloat(realElBorder.left)),
(outerHeight = innerHeight + parseFloat(realElBorder.bottom) + parseFloat(realElBorder.top))
}
const visualizations = {
horizontal: 'left, right',
vertical: 'top, bottom'
}
const drawPaddingRect = function (side) {
const elStyling = {}
if (visualizations.horizontal.indexOf(side) >= 0) {
elStyling['width'] = elementStyling.getPropertyValue('padding-' + side)
elStyling['height'] = innerHeight + 'px'
elStyling['top'] = 0
if (borderBox) {
elStyling['height'] = innerHeight - parseFloat(realElBorder.top) - parseFloat(realElBorder.bottom) + 'px'
}
} else {
elStyling['height'] = elementStyling.getPropertyValue('padding-' + side)
elStyling['width'] = innerWidth + 'px'
elStyling['left'] = 0
if (borderBox) {
elStyling['width'] = innerWidth - parseFloat(realElBorder.left) - parseFloat(realElBorder.right) + 'px'
}
}
elStyling[side] = 0
elStyling['position'] = 'absolute'
return elStyling
}
const drawMarginRect = function (side) {
const elStyling = {}
const margin = []
margin['right'] = parseFloat(elementStyling.getPropertyValue('margin-right'))
margin['top'] = parseFloat(elementStyling.getPropertyValue('margin-top'))
margin['bottom'] = parseFloat(elementStyling.getPropertyValue('margin-bottom'))
margin['left'] = parseFloat(elementStyling.getPropertyValue('margin-left'))
if (visualizations['horizontal'].indexOf(side) >= 0) {
elStyling['width'] = elementStyling.getPropertyValue('margin-' + side)
elStyling['height'] = outerHeight + margin['top'] + margin['bottom'] + 'px'
elStyling['top'] = '-' + (margin['top'] + parseFloat(realElBorder.top)) + 'px'
} else {
elStyling['height'] = elementStyling.getPropertyValue('margin-' + side)
elStyling['width'] = outerWidth + 'px'
elStyling['left'] = '-' + realElBorder.left
}
elStyling[side] = '-' + (margin[side] + parseFloat(realElBorder[side])) + 'px'
elStyling['position'] = 'absolute'
return elStyling
}
const setVisibility = function (el) {
if (!config.remoteHighlight.showPaddingMargin || parseInt(el.height, 10) <= 0 || parseInt(el.width, 10) <= 0) {
el.display = 'none'
} else {
el.display = 'block'
}
}
const paddingVisualizations = [
drawPaddingRect('top'),
drawPaddingRect('right'),
drawPaddingRect('bottom'),
drawPaddingRect('left')
]
const marginVisualizations = [
drawMarginRect('top'),
drawMarginRect('right'),
drawMarginRect('bottom'),
drawMarginRect('left')
]
const setupVisualizations = function (arr, config) {
let i
for (i = 0; i < arr.length; i++) {
setVisibility(arr[i])
// Applies to every visualisationElement (padding or margin div)
arr[i]['transform'] = 'none'
const el = window.document.createElement('div'),
styles = Object.assign({}, config, arr[i])
_setStyleValues(styles, el.style)
highlight.appendChild(el)
}
}
setupVisualizations(marginVisualizations, config.remoteHighlight.marginStyling)
setupVisualizations(paddingVisualizations, config.remoteHighlight.paddingStyling)
highlight.className = HIGHLIGHT_CLASS_NAME
const offset = _screenOffset(element)
let el = element,
offsetLeft = 0,
offsetTop = 0
// Probably the easiest way to get elements position without including transform
do {
offsetLeft += el.offsetLeft
offsetTop += el.offsetTop
el = el.offsetParent
} while (el)
const stylesToSet = {
left: offsetLeft + 'px',
top: offsetTop + 'px',
width: innerWidth + 'px',
height: innerHeight + 'px',
'z-index': 2000000,
margin: 0,
padding: 0,
position: 'absolute',
'pointer-events': 'none',
'box-shadow': '0 0 1px #fff',
'box-sizing': elementStyling.getPropertyValue('box-sizing'),
'border-right': elementStyling.getPropertyValue('border-right'),
'border-left': elementStyling.getPropertyValue('border-left'),
'border-top': elementStyling.getPropertyValue('border-top'),
'border-bottom': elementStyling.getPropertyValue('border-bottom'),
transform: elementStyling.getPropertyValue('transform'),
'transform-origin': elementStyling.getPropertyValue('transform-origin'),
'border-color': config.remoteHighlight.borderColor
}
const mergedStyles = Object.assign({}, stylesToSet)
const animateStartValues = config.remoteHighlight.animateStartValue
const animateEndValues = config.remoteHighlight.animateEndValue
const transitionValues = {
'transition-property': 'opacity, background-color, transform',
'transition-duration': '300ms, 2.3s'
}
function _setStyleValues(styleValues, obj) {
let prop
for (prop in styleValues) {
obj.setProperty(prop, styleValues[prop])
}
}
_setStyleValues(mergedStyles, highlight.style)
_setStyleValues(doAnimation ? animateStartValues : animateEndValues, highlight.style)
if (doAnimation) {
_setStyleValues(transitionValues, highlight.style)
window.setTimeout(function () {
_setStyleValues(animateEndValues, highlight.style)
}, 20)
}
window.document.body.appendChild(highlight)
}
add(element, doAnimation) {
if (this.elementExists(element) || element === window.document) {
return
}
if (this.trigger) {
_trigger(element, 'highlight', 1)
}
if ((!window.event || window.event instanceof MessageEvent) && !isInViewport(element)) {
let top = getDocumentOffsetTop(element)
if (top) {
top -= window.innerHeight / 2
window.scrollTo(0, top)
}
}
this.elements.push(element)
this.makeHighlightDiv(element, doAnimation)
}
clear() {
let i
const highlights = window.document.querySelectorAll('.' + HIGHLIGHT_CLASS_NAME),
body = window.document.body
for (i = 0; i < highlights.length; i++) {
body.removeChild(highlights[i])
}
if (this.trigger) {
for (i = 0; i < this.elements.length; i++) {
_trigger(this.elements[i], 'highlight', 0)
}
}
this.elements = []
}
redraw() {
let i, highlighted
// When redrawing a selector-based highlight, run a new selector
// query to ensure we have the latest set of elements to highlight.
if (this.selector) {
highlighted = window.document.querySelectorAll(this.selector)
} else {
highlighted = this.elements.slice(0)
}
this.clear()
for (i = 0; i < highlighted.length; i++) {
this.add(highlighted[i], false)
}
}
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,432 @@
declare const diffDOM: any
import { Highlight } from './highlight'
import { appendPathToUrl } from '../src/helpers'
// clone the current state of the body before any javascript
// manipulates it inside window.addEventListener('load', (...))
let _internalDOMBody
const block = (document.body) ? document.body.hasAttribute('data-server-no-reload') : false;
if (block) {
console.info('[Five Server] Reload disabled due to \'data-server-no-reload\' attribute on BODY element')
}
if ('WebSocket' in window && !block) {
window.addEventListener('load', () => {
console.log('[Five Server] connecting...')
const script = document.querySelector('[data-id="five-server"]') as HTMLScriptElement
const protocol = window.location.protocol === 'http:' ? 'ws://' : 'wss://'
const address = appendPathToUrl(`${protocol}${new URL(script.src).host}`, 'fsws')
// check if we need to clone the body for the "injectBody" feature or not
const optionsInjectBody = script.getAttribute('data-inject-body')
if (optionsInjectBody && optionsInjectBody.toString() === 'true')
_internalDOMBody = document.body ? document.body.cloneNode(true) : undefined
let timer: any = null
const highlight = new Highlight(true)
highlight.redraw()
window.addEventListener('resize', () => {
highlight.redraw()
})
const CONNECTED_MSG = '[Five Server] connected.'
const MAX_ATTEMPTS = 25
let wait = 1000
let attempts = 0
let socket!: WebSocket
let lastPopUp = ''
const popup = (
message: string,
type: 'info' | 'success' | 'error' | 'warn',
options: { time?: number; animation?: boolean } = {}
) => {
const str = JSON.stringify({ message, type, options })
// block identical popups, except "css update"
if (lastPopUp === str && message !== 'css updated') return
lastPopUp = str
let wrapper = document.getElementById('fiveserver-info-wrapper')
if (wrapper) wrapper.remove()
const { time = 3, animation = true } = options
wrapper = document.createElement('div')
wrapper.id = 'fiveserver-info-wrapper'
wrapper.classList.add(`fiveserver-info-wrapper_${type}`)
wrapper.style.zIndex = '100'
wrapper.style.display = 'flex'
wrapper.style.justifyContent = 'center'
wrapper.style.position = 'fixed'
wrapper.style.top = 'flex'
wrapper.style.left = '50%'
wrapper.style.transform = 'translateX(-50%)'
wrapper.style.width = '100%'
wrapper.style.maxWidth = '80%'
const el = document.createElement('div')
el.id = 'fiveserver-info'
el.style.fontSize = '16px'
el.style.fontFamily = 'Arial, Helvetica, sans-serif'
el.style.color = 'white'
el.style.backgroundColor = 'black'
el.style.padding = '4px 12px'
el.style.borderRadius = '4px'
el.style.whiteSpace = 'pre-wrap'
wrapper.appendChild(el)
document.body.appendChild(wrapper)
// remove popup from DOM after 'time'
if (timer) {
clearTimeout(timer)
timer = null
}
timer = setTimeout(() => {
if (wrapper && wrapper.isConnected) wrapper.remove()
}, time * 1000)
if (type === 'error') {
wrapper.style.top = '4px'
wrapper.style.animation = ''
el.style.color = 'black'
el.style.backgroundColor = 'red'
} else {
if (animation) {
wrapper.style.top = '-40px'
wrapper.style.animation = `fiveserverInfoPopup ${time}s forwards`
} else {
wrapper.style.top = '4px'
wrapper.style.animation = ''
}
}
if (type === 'success') {
el.style.color = '#498d76'
el.style.backgroundColor = '#00ffa9'
} else if (type === 'info') {
el.style.color = '#d2e1f0'
el.style.backgroundColor = '#2996ff'
}
el.innerHTML = message.replace(/</gm, '&lt;')
}
const send = (type: string, ...message: string[]) => {
if (socket && socket?.readyState === 1) {
socket.send(JSON.stringify({ console: { type, message } }))
}
}
const overwriteLogs = () => {
// log
const oldLog = console.log
console.log = function (...message) {
if (message[0] === CONNECTED_MSG) {
popup('connected', 'success')
} else {
send('log', ...message)
}
oldLog.apply(console, message)
}
// warn
const oldWarn = console.warn
console.warn = function (...message) {
send('warn', ...message)
oldWarn.apply(console, message)
}
// error
const oldError = console.error
console.error = function (...message) {
send('error', ...message)
oldError.apply(console, message)
}
}
const refreshCSS = (showPopup: boolean) => {
const head = document.getElementsByTagName('head')[0]
let sheets = Array.from(document.getElementsByTagName('link'))
sheets = sheets.filter(sheet => /\.css/gm.test(sheet.href) || sheet.rel.toLowerCase() == 'stylesheet')
for (let i = 0; i < sheets.length; ++i) {
const el = sheets[i]
const newEl = el.cloneNode(true) as HTMLLinkElement
// changing the href of the css file will make the browser refetch it
const url = newEl.href.replace(/(&|\?)_cacheOverride=\d+/, '')
newEl.href = `${url}${url.indexOf('?') >= 0 ? '&' : '?'}_cacheOverride=${new Date().valueOf()}`
newEl.onload = () => {
setTimeout(() => el.remove(), 0)
}
head.appendChild(newEl)
}
if (sheets.length > 0 && showPopup) popup('css updated', 'info')
}
const injectBody = body => {
document.body.innerHTML = body
}
let _diffDOMStatus = ''
let _dd
const addDiffDOM = (): Promise<void> => {
_diffDOMStatus = 'loading'
return new Promise(resolve => {
const url = `//${new URL(script.src).host}/fiveserver/scripts/diffDOM.js`
const s = document.createElement('script')
s.type = 'text/javascript'
s.src = url
s.onload = () => {
setTimeout(() => {
_dd = new diffDOM.DiffDOM()
_diffDOMStatus = 'ready'
resolve()
})
}
document.getElementsByTagName('head')[0].appendChild(s)
})
}
const domParser = new DOMParser()
let diffError = false
const updateBody = async (d: any) => {
if (_diffDOMStatus === '') await addDiffDOM()
if (_diffDOMStatus === 'ready') {
try {
const body = _internalDOMBody
const newBody = domParser.parseFromString(d, 'text/html').querySelector('body')
const tmp = document.createElement('body')
tmp.innerHTML = d
// copy all attributes
if (newBody) {
if (newBody.attributes.length > 0)
for (let i = 0; i < newBody.attributes.length; i++) {
const attr = newBody.attributes.item(i)
if (attr) {
const newAttr = document.createAttribute(attr.name)
newAttr.value = attr.value
tmp.attributes.setNamedItem(newAttr)
}
}
}
const diff = _dd.diff(body, tmp)
const testBody = document.body.cloneNode(true)
const testSuccess = _dd.apply(testBody, diff)
if (testSuccess) {
const success = _dd.apply(document.body, diff)
if (success) {
_internalDOMBody = tmp
if (diffError) {
diffError = false
appendMessage('HIDE')
}
// scroll element into view (center of page)
const el = document.querySelector(`[data-highlight="true"]`)
if (el) {
const documentOffsetTop = el => {
return el.offsetTop + (el.offsetParent ? documentOffsetTop(el.offsetParent) : 0)
}
const pos = documentOffsetTop(el) - window.innerHeight / 2
window.scrollTo(0, pos)
}
}
}
} catch (error) {
diffError = true
appendMessage('Having issues parsing the DOM.\nPlease verify that your HTML is valid...')
}
}
}
const appendMessages = (msg: string[]) => {
appendMessage(msg.join('\n\n'))
}
const appendMessage = (msg: string) => {
if (msg === 'HIDE' || msg === 'HIDE_MESSAGE' || msg === 'HIDE_MESSAGES') {
const wrapper = document.getElementById('fiveserver-info-wrapper')
if (wrapper) wrapper.remove()
} else {
popup(msg, 'info', { animation: false })
}
}
const connect = () => {
socket = new WebSocket(address)
socket.onmessage = function (msg) {
wait = 1000
attempts = 0
if (msg.data === 'reload') window.location.reload()
else if (msg.data === 'refreshcss') refreshCSS(true)
else if (msg.data === 'refreshcss-silent') refreshCSS(false)
else if (msg.data === 'connected') {
console.log(CONNECTED_MSG)
// dispatch "connected" event when client is connected
const script = document.querySelector('[data-id="five-server"]')
if (script) script.dispatchEvent(new Event('connected'))
} else if (msg.data === 'initRemoteLogs') overwriteLogs()
else {
const d = JSON.parse(msg.data)
if (d.navigate) window.location.replace(d.navigate)
// hot body injection
if (d.body && d.hot) updateBody(d.body)
// simple body replacement
else if (d.body) injectBody(d.body)
// message and messages 🤣
if (d.messages) appendMessages(d.messages)
if (d.message) appendMessage(d.message)
// redraw the highlight on body update
if (d.body) highlight.redraw()
}
}
socket.onopen = function () {
// reload page on successful reconnection
if (attempts > 0) {
window.location.reload()
return
}
const scripts = document.querySelectorAll('script')
for (let i = 0; i < scripts.length; i++) {
const script = scripts[i]
if (script.dataset && script.dataset.file) {
socket.send(JSON.stringify({ file: script.dataset.file }))
}
}
// add styles to body
const style = document.createElement('style')
style.innerHTML = `
/* Injected by five-server */
/*[data-highlight="true"] {
border: 1px rgb(90,170,255) solid !important;
background-color: rgba(155,215,255,0.5);
animation: fadeOutHighlight 1s forwards 0.5s;
}
img[data-highlight="true"] {
filter: sepia(100%) hue-rotate(180deg) saturate(200%);
animation: fadeOutHighlightIMG 0.5s forwards 0.5s;
}*/
@keyframes fadeOutHighlight {
from {background-color: rgba(155,215,255,0.5);}
to {background-color: rgba(155,215,255,0);}
}
@keyframes fadeOutHighlightIMG {
0% {filter: sepia(100%) hue-rotate(180deg) saturate(200%);}
33% {filter: sepia(66%) hue-rotate(180deg) saturate(100%);}
50% {filter: sepia(50%) hue-rotate(90deg) saturate(50%);}
66% {filter: sepia(33%) hue-rotate(0deg) saturate(100%);}
100% {filter: sepia(0%) hue-rotate(0deg) saturate(100%);}
}
@keyframes fiveserverInfoPopup {
0% {top:-40px;}
15% {top:4px;}
85% {top:4px;}
100% {top:-40px;}
}
/*smaller*/
@media (max-width: 640px) {
#fiveserver-info-wrapper {
max-width: 98%;
}
#fiveserver-info {
border-radius: 0px;
}
}
`
document.head.appendChild(style)
}
socket.onclose = function (e) {
setTimeout(function () {
popup('lost connection to dev server', 'error')
}, 300)
if (attempts === 0) console.log('Socket is closed. Reconnect will be attempted in 1 second.', e.reason)
setTimeout(function () {
attempts++
if (attempts > 1) console.log('connecting...')
if (attempts <= MAX_ATTEMPTS) connect()
wait = Math.floor(wait * 1.1)
}, wait)
}
socket.onerror = function (event) {
// console.error('Socket encountered error: ', event, 'Closing socket')
socket.close()
}
}
const MAX_STATUS_CHECK = 10
let statusChecks = 0
const reCheckStatus = () => {
if (statusChecks > MAX_STATUS_CHECK) {
console.error('[Five Server] status check failed')
console.log('[Five Server] browser reloads in 5 seconds')
setTimeout(() => {
window.location.reload()
}, 5000)
return
}
console.log('[Five Server] status check...')
setTimeout(() => {
checkStatus()
}, 1000)
}
const checkStatus = async () => {
statusChecks++
const p = new URL(script.src).protocol
const h = new URL(script.src).host
const url = `${p}//${h}/fiveserver/status`
try {
const res = await fetch(url)
const json = await res.json()
if (json && json.status && json.status === 'online') {
connect()
statusChecks = 0
} else {
reCheckStatus()
}
} catch (error) {
reCheckStatus()
}
}
checkStatus()
})
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,168 @@
html,
body,
h1,
h2,
h3,
h4,
ul,
li,
pre,
code {
margin: 0;
padding: 0;
outline: 0;
}
html {
background: rgb(255, 255, 255);
background: linear-gradient(
0deg,
rgba(255, 255, 255, 1) 0%,
rgba(255, 255, 255, 1) 25%,
rgba(255, 255, 255, 1) 75%,
rgba(246, 246, 246, 1) 100%
);
background-size: 100vw 100vh;
background-repeat: repeat-x;
}
body {
padding: 80px 100px 20px 100px;
font: 14px 'Helvetica Neue', 'Lucida Grande', 'Arial';
color: #555;
max-width: 1024px;
margin: 0 auto;
min-height: calc(100vh - 120px);
}
h1,
h2,
h3 {
font-size: 22px;
color: #343434;
}
h1 em,
h2 em {
padding: 0 5px;
font-weight: normal;
}
h1 {
font-size: 60px;
}
h2 {
margin-top: 10px;
}
h3 {
margin: 5px 0 10px 0;
padding-bottom: 5px;
border-bottom: 1px solid #eee;
font-size: 18px;
}
ul li {
list-style: none;
}
ul li:hover {
cursor: pointer;
color: #2e2e2e;
}
ul li .path {
padding-left: 5px;
font-weight: bold;
}
ul li .line {
padding-right: 5px;
font-style: italic;
}
ul li:first-child .path {
padding-left: 0;
}
p {
line-height: 1.5;
}
a {
color: #555;
text-decoration: none;
}
a:hover {
color: #303030;
}
#stacktrace {
margin-top: 15px;
}
#wrapper {
display: flex;
flex-direction: column;
justify-content: space-between;
min-height: calc(100vh - 120px);
}
.directory h1 {
margin-bottom: 15px;
font-size: 18px;
}
.preview .image,
.preview code {
/* min-width: calc(100vw - 200px - 32px); */
min-height: 160px;
padding: 16px;
font-size: 14px;
border: 1px solid #e9e9e9;
border-radius: 5px;
box-shadow: 1px 1px 4px 1px rgb(0 0 0 / 10%);
}
.preview .image {
padding: 0;
text-align: center;
}
.footer {
text-align: right;
padding-top: 32px;
color: #d6d6d6;
}
.footer a {
color: #ababab;
}
/*small*/
@media (max-width: 768px) {
body {
padding: 80px 24px 40px 24px;
}
}
/*smaller*/
@media (max-width: 640px) {
}
/*mobile*/
@media (max-width: 480px) {
body {
padding: 0;
}
.directory h1 {
font-size: 2em;
line-height: 1.5em;
color: rgb(0, 0, 0);
background: rgb(255, 255, 255);
padding: 15px 10px;
margin: 0;
}
.message {
border-top: 1px solid #cacaca;
border-bottom: 1px solid #cacaca;
padding: 0px 10px;
}
.preview .image,
.preview code {
min-width: calc(100vw - 200px - 32px);
min-height: 160px;
padding: 16px;
padding-bottom: 0px;
font-size: 14px;
border: none;
margin: 0;
border-radius: 0px;
box-shadow: none;
}
.footer {
text-align: center;
}
}

View File

@@ -0,0 +1,40 @@
function $(id) {
const el = 'string' == typeof id ? document.getElementById(id) : id
el.on = function (event, fn) {
if ('content loaded' == event) {
event = window.attachEvent ? 'load' : 'DOMContentLoaded'
}
el.addEventListener ? el.addEventListener(event, fn, false) : el.attachEvent(`on${event}`, fn)
}
el.all = function (selector) {
return $(el.querySelectorAll(selector))
}
el.each = function (fn) {
for (let i = 0, len = el.length; i < len; ++i) {
fn($(el[i]), i)
}
}
el.getClasses = function () {
const c = this.getAttribute('class')
if (c) return c.split(/\s+/)
return []
}
el.addClass = function (name) {
const classes = this.getAttribute('class')
if (!el.getAttribute(name)) el.setAttribute('class', classes ? `${classes} ${name}` : name)
}
el.removeClass = function (name) {
const classes = this.getClasses().filter(function (curr) {
return curr != name
})
this.setAttribute('class', classes.join(' '))
}
return el
}

View File

@@ -0,0 +1,3 @@
Files used by server-explorer
.svg icons are from https://github.com/PKief/vscode-material-icon-theme/tree/master/icons

View File

@@ -0,0 +1,72 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<title>listing directory {directory}</title>
<link rel="stylesheet" href="/fiveserver/scripts/directory.css" />
<style>
{style}
</style>
<script
async
data-id="five-server"
data-file="{filePath}"
type="application/javascript"
src="/fiveserver.js"
></script>
<script src="/fiveserver/scripts/query.js"></script>
<script>
function search() {
var str = $("search").value.toLowerCase();
// var links = $("files").all("a"); // for highlight
var list = $("files").all("li");
list.each(function (li) {
var link = $(li.firstChild);
var text = link.textContent.toLowerCase();
if (".." == text) return;
const match = str.length && ~text.indexOf(str);
// highlight
// if (match) {
// link.addClass("highlight");
// } else {
// link.removeClass("highlight");
// }
// hide
if (match) {
li.removeClass("hidden");
} else {
li.addClass("hidden");
}
if (str.length === 0) li.removeClass("hidden");
});
}
$(window).on("content loaded", function () {
$("search").on("keyup", search);
});
</script>
</head>
<body>
<input id="search" type="text" placeholder="Search" autocomplete="off" />
<div id="wrapper">
<div class="directory">
<h1><a href="/">~</a>{linked-path}</h1>
{files}
</div>
<div class="footer">
<p>Explorer Developed by <a href="https://github.com/yandeu">@yandeu</a></p>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="M16,9V7H12V12.5C11.58,12.19 11.07,12 10.5,12A2.5,2.5 0 0,0 8,14.5A2.5,2.5 0 0,0 10.5,17A2.5,2.5 0 0,0 13,14.5V9H16M12,2A10,10 0 0,1 22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12A10,10 0 0,1 12,2Z" fill="#ef5350"/>
</svg>

After

Width:  |  Height:  |  Size: 363 B

View File

@@ -0,0 +1 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m16.45 15.97.42 2.44c-.26.14-.68.27-1.24.39-.57.13-1.24.2-2.01.2-2.21-.04-3.87-.7-4.98-1.96-1.14-1.27-1.68-2.88-1.68-4.83.04-2.31.72-4.08 2.04-5.32 1.28-1.25 2.92-1.89 4.9-1.89.75 0 1.4.07 1.94.19s.94.25 1.2.4l-.6 2.49-1.04-.34c-.4-.1-.87-.15-1.4-.15-1.15-.01-2.11.36-2.86 1.1-.76.73-1.14 1.85-1.18 3.34.01 1.36.37 2.42 1.08 3.2.71.77 1.7 1.17 2.99 1.18l1.33-.12c.43-.08.79-.19 1.09-.32z" style="fill:#0277bd"/></svg>

After

Width:  |  Height:  |  Size: 501 B

View File

@@ -0,0 +1,3 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="m4 2.5c-1.11 0-2 .89-2 2v10a2 2 0 0 0 2 2h8v5l3-3 3 3v-5h2a2 2 0 0 0 2 -2v-10a2 2 0 0 0 -2 -2h-16m8 2 3 2 3-2v3.5l3 1.5-3 1.5v3.5l-3-2-3 2v-3.5l-3-1.5 3-1.5v-3.5m-8 0h5v2h-5v-2m0 4h3v2h-3v-2m0 4h5v2h-5z" fill="#ff5722"/>
</svg>

After

Width:  |  Height:  |  Size: 312 B

View File

@@ -0,0 +1 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m11 7.5v5.11l4.71 2.79.79-1.28-4-2.37v-4.25m0-5c-3.53 0-6.59 1.92-8.23 4.77l-2.27-2.27v6.5h6.5l-2.75-2.75c1.21-2.52 3.75-4.25 6.75-4.25a7.5 7.5 0 0 1 7.5 7.5 7.5 7.5 0 0 1 -7.5 7.5c-3.27 0-6.03-2.09-7.06-5h-2.1c1.1 4.03 4.77 7 9.16 7 5.24 0 9.5-4.25 9.5-9.5a9.5 9.5 0 0 0 -9.5 -9.5z" style="fill:#8bc34a"/></svg>

After

Width:  |  Height:  |  Size: 396 B

View File

@@ -0,0 +1,3 @@
<svg width="25.6" height="25.6" version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="m20 19v-12h-16v12h16m0-16a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-16a2 2 0 0 1 -2 -2v-14c0-1.11.9-2 2-2h16m-7 14v-2h5v2h-5m-3.42-4-4.01-4h2.83l3.3 3.3c.39.39.39 1.03 0 1.42l-3.28 3.28h-2.83z" fill="#ff7043"/>
</svg>

After

Width:  |  Height:  |  Size: 320 B

View File

@@ -0,0 +1 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m10 15.97.41 2.44c-.26.14-.68.27-1.24.39-.57.13-1.24.2-2.01.2-2.21-.04-3.87-.7-4.98-1.96-1.12-1.27-1.68-2.88-1.68-4.83.05-2.31.72-4.08 2-5.32 1.32-1.25 2.96-1.89 4.94-1.89.75 0 1.4.07 1.94.19s.94.25 1.2.4l-.58 2.49-1.06-.34c-.4-.1-.86-.15-1.39-.15-1.16-.01-2.12.36-2.87 1.1-.76.73-1.15 1.85-1.18 3.34 0 1.36.37 2.42 1.08 3.2.71.77 1.71 1.17 2.99 1.18l1.33-.12c.43-.08.79-.19 1.1-.32m.5-4.97h2v-2h2v2h2v2h-2v2h-2v-2h-2v-2m7 0h2v-2h2v2h2v2h-2v2h-2v-2h-2z" style="fill:#0277bd"/></svg>

After

Width:  |  Height:  |  Size: 566 B

View File

@@ -0,0 +1,3 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="m5 3l-.65 3.34h13.59l-.44 2.16h-13.58l-.66 3.33h13.59l-.76 3.81-5.48 1.81-4.75-1.81.33-1.64h-3.34l-.79 4 7.85 3 9.05-3 1.2-6.03.24-1.21 1.54-7.76h-16.94z" fill="#42a5f5"/>
</svg>

After

Width:  |  Height:  |  Size: 263 B

View File

@@ -0,0 +1 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m12 3c-4.42 0-8 1.79-8 4s3.58 4 8 4 8-1.79 8-4-3.58-4-8-4m-8 6v3c0 2.21 3.58 4 8 4s8-1.79 8-4v-3c0 2.21-3.58 4-8 4s-8-1.79-8-4m0 5v3c0 2.21 3.58 4 8 4s8-1.79 8-4v-3c0 2.21-3.58 4-8 4s-8-1.79-8-4z" style="fill:#ffca28"/></svg>

After

Width:  |  Height:  |  Size: 309 B

View File

@@ -0,0 +1 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m12 14.5c-1.3875 0-2.5-1.125-2.5-2.5 0-1.3875 1.1125-2.5 2.5-2.5s2.5 1.1125 2.5 2.5a2.5 2.5 0 0 1-2.5 2.5m0-12.5a10 10 0 0 0-10 10 10 10 0 0 0 10 10 10 10 0 0 0 10-10 10 10 0 0 0-10-10z" style="fill:#b0bec5;stroke-width:1.25"/></svg>

After

Width:  |  Height:  |  Size: 317 B

View File

@@ -0,0 +1,3 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="m13 9h5.5l-5.5-5.5v5.5m-7-7h8l6 6v12a2 2 0 0 1 -2 2h-12c-1.11 0-2-.9-2-2v-16c0-1.11.89-2 2-2m9 16v-2h-9v2h9m3-4v-2h-12v2h12z" fill="#42a5f5"/>
</svg>

After

Width:  |  Height:  |  Size: 234 B

View File

@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg width="300" height="300" version="1.1" viewBox="0 0 299.99999 300.00001" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><metadata><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/><dc:title/></cc:Work></rdf:RDF></metadata><g transform="matrix(1.0344 0 0 1.0344 -2.8803 18.438)"><path d="m97.021 99.016 48.432-27.962c1.212-0.7 2.706-0.7 3.918 0l48.433 27.962c1.211 0.7 1.959 1.993 1.959 3.393v55.924c0 1.399-0.748 2.693-1.959 3.394l-48.433 27.962c-1.212 0.7-2.706 0.7-3.918 0l-48.432-27.962c-1.212-0.7-1.959-1.994-1.959-3.394v-55.924c1e-3 -1.4 0.748-2.693 1.959-3.393" fill="#7986cb"/><path d="m273.34 124.49-57.867-100.67c-2.102-3.64-5.985-6.325-10.188-6.325h-115.74c-4.204 0-8.088 2.685-10.19 6.325l-57.867 100.45c-2.102 3.641-2.102 8.236 0 11.877l57.867 99.847c2.102 3.64 5.986 5.501 10.19 5.501h115.74c4.203 0 8.087-1.805 10.188-5.446l57.867-100.01c2.104-3.639 2.104-7.907 1e-3 -11.547m-47.917 48.41c0 1.48-0.891 2.849-2.174 3.59l-73.71 42.527c-1.282 0.74-2.888 0.74-4.17 0l-73.767-42.527c-1.282-0.741-2.179-2.109-2.179-3.59v-85.055c0-1.481 0.884-2.849 2.167-3.59l73.707-42.527c1.282-0.741 2.886-0.741 4.168 0l73.772 42.527c1.283 0.741 2.186 2.109 2.186 3.59z" fill="#3f51b5"/></g></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1,3 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="m13 9h5.5l-5.5-5.5v5.5m-7-7h8l6 6v12a2 2 0 0 1 -2 2h-12c-1.11 0-2-.9-2-2v-16c0-1.11.89-2 2-2m5 2h-5v16h5 7v-9h-7v-7z" fill="#42a5f5"/>
</svg>

After

Width:  |  Height:  |  Size: 226 B

View File

@@ -0,0 +1,326 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
viewBox="0 0 24 24"
id="svg4"
sodipodi:docname="fiveserver.svg"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8">
<filter
style="color-interpolation-filters:sRGB"
id="filter1214">
<feComponentTransfer
result="fbSourceGraphic"
id="feComponentTransfer1212">
<feFuncR
type="gamma"
amplitude=".86"
exponent="2.09"
offset=".05"
id="feFuncR1206" />
<feFuncG
type="gamma"
amplitude=".86"
exponent="2.09"
offset=".05"
id="feFuncG1208" />
<feFuncB
type="gamma"
amplitude=".86"
exponent="2.09"
offset=".05"
id="feFuncB1210" />
</feComponentTransfer>
<feColorMatrix
result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
id="feColorMatrix1310" />
<feColorMatrix
id="feColorMatrix1312"
values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 -1 0.5 0.5 1 0"
in="fbSourceGraphic"
result="colormatrix" />
<feComposite
in2="fbSourceGraphic"
id="feComposite1314"
in="colormatrix"
operator="in"
result="composite1" />
</filter>
<filter
style="color-interpolation-filters:sRGB"
id="filter4568">
<feComponentTransfer
result="fbSourceGraphic"
id="feComponentTransfer4560">
<feFuncR
type="gamma"
amplitude=".86"
exponent="2.09"
offset=".05"
id="feFuncR4554" />
<feFuncG
type="gamma"
amplitude=".86"
exponent="2.09"
offset=".05"
id="feFuncG4556" />
<feFuncB
type="gamma"
amplitude=".86"
exponent="2.09"
offset=".05"
id="feFuncB4558" />
</feComponentTransfer>
<feColorMatrix
result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
id="feColorMatrix4562" />
<feColorMatrix
id="feColorMatrix4564"
values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 -1 0.5 0.5 1 0"
in="fbSourceGraphic"
result="colormatrix" />
<feComposite
in2="fbSourceGraphic"
id="feComposite4566"
in="colormatrix"
operator="in"
result="composite1" />
</filter>
<filter
style="color-interpolation-filters:sRGB"
id="filter4584">
<feComponentTransfer
result="fbSourceGraphic"
id="feComponentTransfer4576">
<feFuncR
type="gamma"
amplitude=".86"
exponent="2.09"
offset=".05"
id="feFuncR4570" />
<feFuncG
type="gamma"
amplitude=".86"
exponent="2.09"
offset=".05"
id="feFuncG4572" />
<feFuncB
type="gamma"
amplitude=".86"
exponent="2.09"
offset=".05"
id="feFuncB4574" />
</feComponentTransfer>
<feColorMatrix
result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
id="feColorMatrix4578" />
<feColorMatrix
id="feColorMatrix4580"
values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 -1 0.5 0.5 1 0"
in="fbSourceGraphic"
result="colormatrix" />
<feComposite
in2="fbSourceGraphic"
id="feComposite4582"
in="colormatrix"
operator="in"
result="composite1" />
</filter>
<filter
style="color-interpolation-filters:sRGB"
id="filter4600">
<feComponentTransfer
result="fbSourceGraphic"
id="feComponentTransfer4592">
<feFuncR
type="gamma"
amplitude=".86"
exponent="2.09"
offset=".05"
id="feFuncR4586" />
<feFuncG
type="gamma"
amplitude=".86"
exponent="2.09"
offset=".05"
id="feFuncG4588" />
<feFuncB
type="gamma"
amplitude=".86"
exponent="2.09"
offset=".05"
id="feFuncB4590" />
</feComponentTransfer>
<feColorMatrix
result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
id="feColorMatrix4594" />
<feColorMatrix
id="feColorMatrix4596"
values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 -1 0.5 0.5 1 0"
in="fbSourceGraphic"
result="colormatrix" />
<feComposite
in2="fbSourceGraphic"
id="feComposite4598"
in="colormatrix"
operator="in"
result="composite1" />
</filter>
<filter
style="color-interpolation-filters:sRGB"
id="filter4616">
<feComponentTransfer
result="fbSourceGraphic"
id="feComponentTransfer4608">
<feFuncR
type="gamma"
amplitude=".86"
exponent="2.09"
offset=".05"
id="feFuncR4602" />
<feFuncG
type="gamma"
amplitude=".86"
exponent="2.09"
offset=".05"
id="feFuncG4604" />
<feFuncB
type="gamma"
amplitude=".86"
exponent="2.09"
offset=".05"
id="feFuncB4606" />
</feComponentTransfer>
<feColorMatrix
result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
id="feColorMatrix4610" />
<feColorMatrix
id="feColorMatrix4612"
values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 -1 0.5 0.5 1 0"
in="fbSourceGraphic"
result="colormatrix" />
<feComposite
in2="fbSourceGraphic"
id="feComposite4614"
in="colormatrix"
operator="in"
result="composite1" />
</filter>
</defs>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="2560"
inkscape:window-height="1346"
id="namedview6"
showgrid="false"
inkscape:zoom="13.906433"
inkscape:cx="3.7439381"
inkscape:cy="12.69948"
inkscape:window-x="-11"
inkscape:window-y="49"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" />
<g
id="g1527"
transform="matrix(0.34104959,0,0,0.34104959,-132.83244,-85.218532)">
<path
inkscape:connector-curvature="0"
id="path1507"
d="m 420.18,269.92 -2.36,10.16 c 1.08,0.96 2.19,1.9 3.27,2.86 a 4.76,4.76 0 1 1 -1,2.95 v -0.02 -0.03 -0.01 l -3.54,0.01 a 8.3,8.3 0 1 0 5.44,-7.78 l 1.21,-4.45 h 7.36 l 1.94,-3.69 z"
style="opacity:1;fill:#7b1fa2;fill-opacity:1;stroke:none;stroke-width:0.93546373;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter1214)" />
<path
inkscape:connector-curvature="0"
transform="matrix(0.48882,0,0,0.48882,376.63,254.42)"
style="fill:#ce93d8;fill-opacity:1;filter:url(#filter1214)"
class="st0"
d="m 35.2,63.1 c 0.1,-16.9 5.4,-31.5 16.3,-43.9 2.9,-3.3 6,-7.3 10.7,-3.1 4.2,3.8 1.3,7.4 -1.5,10.7 -13.7,16 -17.1,34.1 -10.6,54 2.2,6.9 6.2,12.9 11,18.3 2.8,3.2 4.8,6.8 0.9,10.2 -4,3.5 -7.1,0.8 -9.9,-2.4 C 40.8,94.4 35.2,79.6 35.2,63.1 Z"
id="path1509" />
<path
inkscape:connector-curvature="0"
transform="matrix(0.48882,0,0,0.48882,374.1,254.42)"
style="fill:#ce93d8;fill-opacity:1;filter:url(#filter1214)"
class="st0"
d="m 166.5,63.6 c -0.2,16.4 -6,31.2 -17.4,43.7 -2.7,3 -5.7,5.4 -9.5,2.3 -4,-3.3 -2.4,-7 0.6,-10.2 17.1,-18 18.5,-45.6 6.6,-64.5 -2,-3.1 -4.3,-6 -6.6,-8.9 -2.8,-3.3 -4.5,-6.9 -0.6,-10.2 3.8,-3.2 6.8,-0.7 9.5,2.2 11.6,12.9 17.4,27.8 17.4,45.6 z"
id="path1511" />
<path
inkscape:connector-curvature="0"
transform="matrix(0.48882,0,0,0.48882,376.43,254.42)"
style="fill:#9c27b0;fill-opacity:1;filter:url(#filter1214)"
class="st0"
d="m 57.5,63.1 c 0.3,-11.5 4,-21.3 11.4,-29.6 2.7,-3 5.7,-4.5 9.1,-1.6 3.4,2.9 2.5,6.3 -0.1,9.2 -6.5,7.4 -9.3,15.8 -8.2,25.6 0.7,6.1 3.1,11.4 7,16.1 2.8,3.3 5.6,7 1.2,10.6 -4.7,3.9 -7.7,0 -10.6,-3.5 -6.5,-7.8 -9.5,-17 -9.8,-26.8 z"
id="path1513" />
<path
inkscape:connector-curvature="0"
transform="matrix(0.48882,0,0,0.48882,374.37,254.42)"
style="fill:#9c27b0;fill-opacity:1;filter:url(#filter1214)"
class="st0"
d="m 144.1,63.6 c -0.3,10.2 -3.9,19.9 -11.4,28.3 -2.7,3 -5.7,4.5 -9.1,1.7 -3.4,-2.8 -2.3,-6.1 0,-9.3 11.7,-15.9 11.7,-27.2 0,-43.1 -2.3,-3.2 -3.5,-6.4 -0.1,-9.3 3.4,-2.9 6.4,-1.4 9.1,1.5 7.1,7.8 11.5,18.7 11.5,30.2 z"
id="path1515" />
<path
inkscape:connector-curvature="0"
style="opacity:1;fill:#7b1fa2;fill-opacity:1;stroke:none;stroke-width:0.93546373;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 419.95,269.15 -2.37,10.16 c 1.09,0.97 2.19,1.9 3.27,2.86 a 4.76,4.76 0 1 1 -1,2.95 v -0.02 -0.02 -0.02 l -3.54,0.02 a 8.3,8.3 0 1 0 5.44,-7.8 l 1.21,-4.44 h 7.37 l 1.93,-3.69 z"
id="path1517" />
<path
inkscape:connector-curvature="0"
id="path1519"
d="m 392.57,285.23 c 0.05,-8.26 2.64,-15.4 7.97,-21.45 1.42,-1.62 2.93,-3.57 5.23,-1.52 2.06,1.86 0.64,3.62 -0.73,5.23 -6.7,7.82 -8.36,16.67 -5.18,26.4 a 25.03,25.03 0 0 0 5.37,8.94 c 1.37,1.57 2.35,3.33 0.44,4.99 -1.95,1.7 -3.47,0.39 -4.83,-1.18 a 31.07,31.07 0 0 1 -8.27,-21.4 z"
class="st0"
style="fill:#ce93d8;fill-opacity:1;stroke-width:0.48881707" />
<path
inkscape:connector-curvature="0"
id="path1521"
d="m 456.76,285.48 a 31.51,31.51 0 0 1 -8.5,21.36 c -1.33,1.47 -2.8,2.64 -4.65,1.12 -1.96,-1.6 -1.18,-3.42 0.29,-4.98 8.36,-8.8 9.04,-22.3 3.23,-31.53 a 55.58,55.58 0 0 0 -3.23,-4.35 c -1.37,-1.61 -2.2,-3.37 -0.3,-4.99 1.86,-1.56 3.33,-0.34 4.65,1.08 a 32,32 0 0 1 8.5,22.29 z"
class="st0"
style="fill:#ce93d8;fill-opacity:1;stroke-width:0.48881707" />
<path
inkscape:connector-curvature="0"
id="path1523"
d="m 403.47,285.23 c 0.15,-5.62 1.96,-10.4 5.58,-14.46 1.32,-1.47 2.78,-2.2 4.45,-0.79 1.66,1.42 1.22,3.08 -0.05,4.5 a 15.5,15.5 0 0 0 -4.01,12.51 14.7,14.7 0 0 0 3.42,7.87 c 1.37,1.62 2.74,3.43 0.59,5.19 -2.3,1.9 -3.77,0 -5.18,-1.71 a 20.98,20.98 0 0 1 -4.8,-13.1 z"
class="st0"
style="fill:#9c27b0;fill-opacity:1;stroke-width:0.48881707" />
<path
inkscape:connector-curvature="0"
id="path1525"
d="m 445.8,285.48 a 21.3,21.3 0 0 1 -5.57,13.83 c -1.32,1.47 -2.78,2.2 -4.44,0.83 -1.67,-1.37 -1.13,-2.98 0,-4.54 5.71,-7.77 5.71,-13.3 0,-21.07 -1.13,-1.56 -1.72,-3.13 -0.05,-4.55 1.66,-1.41 3.13,-0.68 4.44,0.74 a 22.12,22.12 0 0 1 5.63,14.76 z"
class="st0"
style="fill:#9c27b0;fill-opacity:1;stroke-width:0.48881707" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
clip-rule="evenodd"
fill-rule="evenodd"
stroke-linejoin="round"
stroke-miterlimit="1.4142"
version="1.1"
viewBox="0 0 24 24"
xml:space="preserve"
id="svg6"
sodipodi:docname="folder-ios.svg"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"><metadata
id="metadata12"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs10" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="794"
inkscape:window-height="480"
id="namedview8"
showgrid="false"
inkscape:zoom="9.8333333"
inkscape:cx="12"
inkscape:cy="12"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="svg6" /><path
d="m10 4h-6c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2v-10c0-1.11-.9-2-2-2h-8l-2-2z"
fill="#e57373"
fill-rule="nonzero"
style="fill:#78909c"
id="path2" /></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1,3 @@
<svg version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="m8.9803 14.538 3.0197-8.0313 3.007 8.0313m-4.2757-11.419-6.9782 17.763h2.8547l1.421-3.8063h7.9298l1.4337 3.8063h2.8547l-6.9782-17.763z" fill="#f44336" stroke-width="1.2688"/>
</svg>

After

Width:  |  Height:  |  Size: 266 B

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="m2.6 10.59l5.78-5.79 1.69 1.7c-0.24 0.85 0.15 1.78 0.93 2.23v5.54c-0.6 0.34-1 0.99-1 1.73a2 2 0 0 0 2 2 2 2 0 0 0 2 -2c0-0.74-0.4-1.39-1-1.73v-4.86l2.07 2.09c-0.07 0.15-0.07 0.32-0.07 0.5a2 2 0 0 0 2 2 2 2 0 0 0 2 -2 2 2 0 0 0 -2 -2c-0.18 0-0.35 0-0.5 0.07l-2.57-2.57c0.26-0.93-0.22-1.95-1.15-2.34-0.43-0.16-0.88-0.2-1.28-0.09l-1.7-1.69 0.79-0.78c0.78-0.79 2.04-0.79 2.82 0l7.99 7.99c0.79 0.78 0.79 2.04 0 2.82l-7.99 7.99c-0.78 0.79-2.04 0.79-2.82 0l-7.99-7.99c-0.79-0.78-0.79-2.04 0-2.82z" fill="#e64a19"/>
</svg>

After

Width:  |  Height:  |  Size: 662 B

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<g fill="#0277bd" aria-label="h">
<path d="m16.745 19.818h-3.0066v-5.8824q0-2.381-1.7367-2.381-0.86836 0-1.4379 0.66294-0.56023 0.66294-0.56023 1.718v5.8824h-3.0159v-15.285h3.0159v6.508h0.03735q1.1858-1.8021 3.1933-1.8021 3.5108 0 3.5108 4.2391z" fill="#0277bd" stroke-width=".47806"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 439 B

Some files were not shown because too many files have changed in this diff Show More