feat: group collapsing

This commit is contained in:
surunzi
2019-09-26 15:50:32 +08:00
parent 00acada6b5
commit 44ccd024e8
10 changed files with 293 additions and 108 deletions

View File

@@ -24,8 +24,8 @@ function genCssFile(fontData) {
data = data.split('\n')
data.splice(
2,
5,
1,
6,
" src: url('data:application/x-font-woff;charset=utf-8;base64," +
fontData +
"') format('woff');"

View File

@@ -1,47 +1,85 @@
@font-face {font-family: "eruda-icon";
src: url('iconfont.eot?t=1530274816100'); /* IE9*/
src: url('iconfont.eot?t=1530274816100#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff'),
url('iconfont.ttf?t=1530274816100') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
url('iconfont.svg?t=1530274816100#eruda-icon') format('svg'); /* iOS 4.1- */
src: url('iconfont.eot?t=1569469177808'); /* IE9 */
src: url('iconfont.eot?t=1569469177808#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAApwAAsAAAAAEzAAAAohAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCFQAqVYJEGATYCJANICyYABCAFhQUHgUEb5Q8jEWZ0VUn2Vwe28zRaAKnNCgbhCPUpIqGBIGBowFCYjcC943fNFu6Z98HTu/bvTSZZfB8YZYkkILg63l9C3fp6IMcKyAGpnikrsjtFm7YUIkgcDmlCTLQS57iaQtX5+ULrR+tI5JMaekSdVDRiSFIxe7F91/wRGNMP9lDOfvLoszaFHaQvzVEDBAyVRXDX+g+FC4B592tVxKOdrxESj1puO925YaYRT4RoofyPiUSxaI1eiQWL5ayztCfKQog5VrNXuj0MkNBskJkzbzYHRDikyKDM3l38pSBqqHET/oZIFgws61rNKTyRPWMHgUvZz5ufjGcNFi/IHS3cnr0CzFC+rZEsz1grE0zEMwJvZCDAIHBv0i+Dis9AbH4ChaSw4waAVg5zoCeLtVSd1Et9NEMX6Cbdpi+/zv365pv/tibPJ11L4pjfcojNTthwbY/dmQVFlB4z51JtRYgICCkmpUyBEuID/uMFSHEBzh9zyqBogCLQGKAUWgJgQUsBPGgFgAHtBHCg3QACOgsgAp0PEIAuAAhBNwEUg24DSEFfApTh61wEzdc3ACiBb15JnEnWwESCFJebZTpBL2QluMVAujfLFgwhIfYXLGog4Wfw62hscLDbUNzaRMBLwbmgpKSwDqurZTAJ4ra5qdOp9ix7ijx4X2Hr5ayh51afgt7paxI16wfEt/1lJLRH2CvW40TzxMZVxBgZHTW4o6aIcZJ4wmxYKDaTUFR/lCbUMGoQGseM61GIx5eLtULqipVSoUagC8Q1RVRHKdoCsCZXeQWkuhMjU1DLOgx32DIVVeGVJymrqqL2x0naIJWC0RAGpDRlJ638PEOimPgIoBGuilW3+msbnSXltNszyM3mbLGUpvUnD8xSV1ZX0/WJ8tZWNb05EjfchMhXmEyI2QwbjcBg4JCQ6jqfrgQsoARjVXfFFKdxqxqvd/qPFWuZVZ3ZJfVibocfJJ/OcCvPxK+im1Wk8dNU+WtbA3WBpZAM8UdSOFyYS/UXGJ5zjC9g8yvE9HIBCZ+axKT7eMjKFVyBkMqRoBBXJtKR7c5ptwo/DGdRSUyDpWuNRngfCplMXLMZySFBsJG5BNnO4c/D8LlRkii2jngVIndI5E8TaqLxQqrpSFw7m5YNtSgIuWBPExq2q8EIO5jNO6DSAu+pMRys6hPpxb3CHsHoTdThyIc0CRc1JMEU/LIJ87X+hNAgGDTkoBAkU5kkUwZ0xVp5Tr4HGD1SIimZnBnTaVIarVxkGmGa1LvC3p9KpXe4QupLdW18kT10LNRnmgmpfIoFfGJUJMhgmK04X9vqO3Ij0XyeqmyEwWUjIKGSQ78IOR2Ry0gCW0UPg1De620j1okwEsWX2Ewr1uHwV/pWIQ8SGQnVACBV0hFYOpoICbbIOnD2xWrJYvpWnWgxrlLnSw6Vq8nkc0paMFmpZQKhhGSPynYTfhuNsm0bZ1uI5LctUbpOhIXhBu7J/OoW+aNFGh8ZBlUEIilcrFrX6g9LaXREd5tZ7sehwlqGRENVBHBl0IZ7ZT9cw/OvJf/7eFToyjI7dGgmquvIHkAmHRnu4bxuB4b1WWfO8cjt+Uvn5uc/Y7GeFxQumbe9sFNQcyJyd+GyeR8E16jUqwX5y+buzsd8pemhxR4PPIoWeRTfL/ZcqA4y6Fm8yLNoqNgDjKc7PWhubml54N3t/WDr1i1b8qcDkjYPTzxm6Covuwy82zWw6yftwLJjU+QrR2M/vZoJfJ/EHNk8dU9jOHP60HzwSWXxgl+3bQ1qHxYeKNu4h5XEKJAtWGtfz0obs/H8z1aZIMXywTvM0AUOkVa3s4PtGF2dlocubJvn+vFGLit+UaWO0T9Azk3Rqyqt9COgyurMkP4sKLe8OlBmIblxVYKnaEf4hqGvIX8PVTrs6jj5lfksLTYjerje8/Bu3E7NOZxfmUdfGO7p4ZHGX8Om3ZieFnC8or2rwivPE5amd+nmZDlmKzKrDneUvp41M7dgxQb7j8D1qtBMYLMJSYaZ7WK2YKWLCwjMLmzFd144byVPEgH+L8sW52RrlVqFmQJEFH+0w/7PMTZV4dgBOw7Ys7dtrGDDDSPMruitCP5/dBZ/8yb+LLMNTBpUBZbrCX/9RYBQLyAEosA/k/Pmsdl6UvCHlzXc21NcomVnR0Kxf4ldUVLc0wvbwWlpcO+LVic7yyrg/3m2sAv27sex45iy7bLHwjEX2HZI3Sareld2diQg5TGVlRn0J+dPU+h+WGEGCFPVC1M2QgNBA9A8ZEf8OB8ZwxVA5OOM/y9mthHh3r2ZF+evw5/q7z+FB1to8KeqT+QKoj4ePZqXt3mzjbBNnReI3FTquMWj3+5Lf2Pj04tNl65eKzG+wqV5voraF7grYy4h2lH60NEqudwHTtH4eflBJ/ucxBWrRj96ZKRzvff/sHj+7Fnr2Nip08J8cDooLahg063frfxnz3mQuhrPhYtzeCUQ7erzr8oD4dRN+eBM8N/5m279UeCw2aPBAZwevdJ45eqW5wY32DshG3cxSLArhxjlEgfaaQwBxO5P+/x4p+1n252P/7DLYmfZ/fH5c05ku9OZwOPt3trwxa5xr58psXI+v7sbc4adK0HEhbrAWVKKAxc0AK4DRRY4My0BpJrj8FjYY68F622f265f4PU4DMPHkR6QijRpFOAdsYaFaULY+kjHbrSa62lbB2cH237TK72+dt/gRwgMr5y8RnWJj9i2/fDMmTj6f5vsV63OisHWr4P3LUjIWL1GvWMnfDw5/clZzzVromJwWYQpN7cpwiTB3Y2QCqcIT2IhNzcQ+7daBvk9mSazNxFHnJeJQm/sf3lFJkmXdUJFe9BehfyBMJ6BiCdyV2Knfi3XJCz/np9wFDkQY9AVmWXDADJTwFlTmr2wT0cSZH8W95R/0XVhn/buRumfGYxjOuIe7j6ZCDuGzS/nZVzpT07Y/RX88iUu/8vCn4TM2/mWaeiPaNhbeT7MiRpV7jFhpgUSHgT5bvQ+71paZY0MThrcN4olpIUiJHTbO+dRiidlEiUgYS4lYcCCgikV9iNwd7G13wVQDJXuUizFPMMy5PwOOzj/pniqwwkDeEenJCw3A+tM6U6ULHljBEGj7osKmnqrqsgFeTCQ1Uf7Rje0wO8Niox/5BQwQlV52aP8wkl+rAXS6GoRqyxTpz6D7gzbllRkeqCW3IvEW1HYoQVzTd3qYowghtEo9yVm0NTbteTiPBjIJqb6Rje0EKGZyWa74v93nAQSE1cqudLK/ovr3+ShVU6jqwljSzNZpk75PFgjtpRNShye6oFact4jM94U1JW1Fee7lXbPBH9J34xcvDwrpDJMy15gXoDjetqvrPIqbL/gHphp2glRuwu3utKeg/Ny0Te4pGSGpv5acvoKX99aBE6aRPsDzhF6c7pKZJExpd0E3O+LQihHRrvO9IeE7W0tvIstLAfzX1Vw9xnadrUCAAA=') format('woff2'),
url('iconfont.woff?t=1569469177808') format('woff'),
url('iconfont.ttf?t=1569469177808') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
url('iconfont.svg?t=1569469177808#eruda-icon') format('svg'); /* iOS 4.1- */
}
.eruda-icon {
font-family:"eruda-icon" !important;
font-size:16px;
font-style:normal;
font-family: "eruda-icon" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-eye:before { content: "\e613"; }
.icon-eye:before {
content: "\e613";
}
.icon-arrow:before { content: "\e60f"; }
.icon-arrow:before {
content: "\e60f";
}
.icon-tool:before { content: "\e626"; }
.icon-tool:before {
content: "\e626";
}
.icon-info:before { content: "\e624"; }
.icon-info:before {
content: "\e624";
}
.icon-right:before { content: "\e610"; }
.icon-right:before {
content: "\e610";
}
.icon-Clearsearch:before { content: "\e642"; }
.icon-caret-down:before {
content: "\e64e";
}
.icon-expand:before { content: "\e805"; }
.icon-caret-right:before {
content: "\e64f";
}
.icon-compress:before { content: "\e85b"; }
.icon-Clearsearch:before {
content: "\e642";
}
.icon-warn:before { content: "\e665"; }
.icon-expand:before {
content: "\e805";
}
.icon-reset:before { content: "\e745"; }
.icon-compress:before {
content: "\e85b";
}
.icon-refresh:before { content: "\e600"; }
.icon-warn:before {
content: "\e665";
}
.icon-select:before { content: "\e661"; }
.icon-reset:before {
content: "\e745";
}
.icon-play:before { content: "\e7d7"; }
.icon-refresh:before {
content: "\e600";
}
.icon-delete:before { content: "\e609"; }
.icon-select:before {
content: "\e661";
}
.icon-Fill:before { content: "\e6ce"; }
.icon-play:before {
content: "\e7d7";
}
.icon-delete:before {
content: "\e609";
}
.icon-Fill:before {
content: "\e6ce";
}

Binary file not shown.

View File

@@ -29,11 +29,6 @@ export default class Console extends Tool {
this._initCfg()
this._bindEvent()
}
show() {
super.show()
this._logger.render()
}
overrideConsole() {
const origConsole = (this._origConsole = {})
const winConsole = window.console
@@ -126,7 +121,7 @@ export default class Console extends Tool {
}
_initLogger() {
const $filter = this._$control.find('.eruda-filter')
const logger = (this._logger = new Logger(this._$logs, this))
const logger = (this._logger = new Logger(this._$logs))
logger.on('filter', filter =>
$filter.each(function() {

View File

@@ -1,10 +1,15 @@
<li>
<li class="eruda-log" data-id="{{id}}" data-type="{{type}}">
{{#if displayHeader}}
<div class="eruda-header">
<span data-mark="time">{{time}}</span> <span>{{from}}</span>
{{#repeat group.indentLevel}}
<div class="eruda-nesting-level"></div>
{{/repeat}}
<div class="eruda-time-container">
<span data-mark="time">{{time}}</span> <span>{{from}}</span>
</div>
</div>
{{/if}}
<div class="eruda-{{type}} eruda-log-item" data-id="{{id}}" data-type="{{type}}">
<div class="eruda-{{type}} eruda-log-item">
{{#repeat group.indentLevel}}
<div class="eruda-nesting-level"></div>
{{/repeat}}

View File

@@ -46,6 +46,7 @@ export default class Log {
this.id = id
this.displayHeader = displayHeader
this.ignoreFilter = ignoreFilter
this.collapsed = false
if (displayHeader) {
this.time = getCurTime()
@@ -53,6 +54,60 @@ export default class Log {
}
this._formatMsg()
if (this.group) {
this.checkGroup()
}
}
// If state changed, return true.
checkGroup() {
let { group } = this
let collapsed = false
while (group) {
if (group.collapsed) {
collapsed = true
break
}
group = group.parent
}
if (collapsed !== this.collapsed) {
this.collapsed = collapsed
if (collapsed) {
this.hide()
} else {
this.show()
}
return true
} else {
return false
}
}
hide() {
let msg = this._formattedMsg
msg = msg.replace('"eruda-log"', '"eruda-log eruda-hidden"')
this._formattedMsg = msg
}
show() {
let msg = this._formattedMsg
msg = msg.replace('"eruda-log eruda-hidden"', '"eruda-log"')
this._formattedMsg = msg
}
updateIcon(icon) {
let msg = this._formattedMsg
msg = msg.replace(
/"eruda-icon eruda-icon-[\w-]+"/,
`"eruda-icon eruda-icon-${icon}"`
)
this._formattedMsg = msg
return this
}
addCount() {
this.count++
@@ -142,6 +197,12 @@ export default class Log {
let icon
let err
if (type === 'group' || type === 'groupCollapsed') {
if (args.length === 0) {
args = ['console.group']
}
}
switch (type) {
case 'log':
msg = formatMsg(args)
@@ -182,8 +243,13 @@ export default class Log {
msg = formatMsg(args)
icon = 'arrow-left'
break
case 'groupCollapsed':
msg = formatMsg(args)
icon = 'caret-right'
break
case 'group':
msg = formatMsg(args.length === 0 ? 'console.group' : args)
msg = formatMsg(args)
icon = 'caret-down'
break
}

View File

@@ -19,12 +19,11 @@ import {
} from '../lib/util'
export default class Logger extends Emitter {
constructor($el, container) {
constructor($el) {
super()
this._style = evalCss(require('./Logger.scss'))
this._$el = $el
this._container = container
this._logs = []
this._timer = {}
this._count = {}
@@ -124,6 +123,7 @@ export default class Logger extends Emitter {
clear() {
this._logs = []
this._lastLog = {}
this._groupStack = new Stack()
return this.render()
}
@@ -139,18 +139,14 @@ export default class Logger extends Emitter {
group(...args) {
return this.insert('group', args)
}
groupCollapsed() {}
groupCollapsed(...args) {
return this.insert('groupCollapsed', args)
}
groupEnd() {
const lastLog = this._lastLog
const $el = this._$el
lastLog.groupEnd()
this._groupStack.pop()
const $container = $el.find(`div[data-id="${lastLog.id}"]`)
if ($container.length > 0) {
$container.parent().remove()
$el.append(lastLog.content())
}
this._refreshLogUi(lastLog)
}
input(jsCode) {
if (startWith(jsCode, ':')) {
@@ -197,8 +193,8 @@ export default class Logger extends Emitter {
})
}
render() {
let html = '',
logs = this._logs
let html = ''
let logs = this._logs
logs = this._filterLogs(logs)
@@ -228,13 +224,14 @@ export default class Logger extends Emitter {
displayHeader: this._displayHeader
})
if (type === 'group') {
if (type === 'group' || type === 'groupCollapsed') {
const group = {
id: uniqId('group'),
collapsed: false,
parent: groupStack.peek(),
indentLevel: groupStack.size + 1
}
if (type === 'groupCollapsed') group.collapsed = true
options.targetGroup = group
groupStack.push(group)
}
@@ -252,10 +249,7 @@ export default class Logger extends Emitter {
lastLog.addCount()
if (log.time) lastLog.updateTime(log.time)
log = lastLog
const $container = $el.find(`div[data-id="${lastLog.id}"]`)
if ($container.length > 0) {
$container.parent().remove()
}
this._rmLogUi(lastLog)
} else {
logs.push(log)
this._lastLog = log
@@ -263,14 +257,11 @@ export default class Logger extends Emitter {
if (this._maxNum !== 'infinite' && logs.length > this._maxNum) {
const firstLog = logs[0]
const $container = $el.find(`div[data-id="${firstLog.id}"]`)
if ($container.length > 0) {
$container.parent().remove()
}
this._rmLogUi(firstLog)
logs.shift()
}
if (this._filterLog(log) && this._container.active) {
if (this._filterLog(log)) {
$el.append(log.content())
}
@@ -285,6 +276,19 @@ export default class Logger extends Emitter {
el.scrollTop = el.scrollHeight - el.offsetHeight
}
_rmLogUi(log) {
const $container = this._$el.find(`li[data-id="${log.id}"]`)
if ($container.length > 0) {
$container.remove()
}
}
_refreshLogUi(log) {
const $container = this._$el.find(`li[data-id="${log.id}"]`)
if ($container.length > 0) {
$container.after(log.content())
$container.remove()
}
}
_filterLogs(logs) {
const filter = this._filter
@@ -331,24 +335,83 @@ export default class Logger extends Emitter {
this.warn('Unknown command').help()
}
}
_getLog(id) {
const logs = this._logs
let log
for (let i = 0, len = logs.length; i < len; i++) {
log = logs[i]
if (log.id === id) break
}
return log
}
_collapseGroup(log) {
const { targetGroup } = log
targetGroup.collapsed = true
log.updateIcon('caret-right')
this._refreshLogUi(log)
this._updateGroup(log)
}
_openGroup(log) {
const { targetGroup } = log
targetGroup.collapsed = false
log.updateIcon('caret-down')
this._refreshLogUi(log)
this._updateGroup(log)
}
_updateGroup(log) {
const logs = this._logs
const len = logs.length
let i = logs.indexOf(log) + 1
while (i < len) {
const log = logs[i]
if (log.checkGroup()) {
this._refreshLogUi(log)
} else {
break
}
i++
}
}
_bindEvent() {
const self = this
const $el = this._$el
this._$el.on('click', '.eruda-log-item', function() {
const $el = $(this)
const id = $el.data('id')
const type = $el.data('type')
const logs = self._logs
let log
$el
.on('click', '.eruda-log', function() {
const $el = $(this)
const id = $el.data('id')
const type = $el.data('type')
const log = self._getLog(id)
if (!log) return
for (let i = 0, len = logs.length; i < len; i++) {
log = logs[i]
if (log.id === id) break
}
if (!log) return
Log.click(type, log, $el, self)
})
.on('click', '.eruda-icon-caret-down', function() {
const $el = $(this)
.parent()
.parent()
.parent()
const id = $el.data('id')
const log = self._getLog(id)
if (!log) return
Log.click(type, log, $el, self)
})
self._collapseGroup(log)
})
.on('click', '.eruda-icon-caret-right', function() {
const $el = $(this)
.parent()
.parent()
.parent()
const id = $el.data('id')
const log = self._getLog(id)
if (!log) return
self._openGroup(log)
})
}
}

View File

@@ -4,65 +4,72 @@
.dev-tools {
.tools {
.console {
background: #fff;
.logs {
@include overflow-auto(y);
height: 100%;
font-size: $font-size;
padding-top: 1px;
& > li:last-child {
border-bottom: 1px solid $gray-light;
.log-item {
border-bottom-width: 1px;
}
.log {
box-sizing: content-box;
}
.header {
@include overflow-auto(x);
white-space: nowrap;
margin: 5px 0;
padding: 0 $padding;
display: flex;
font-size: $font-size-s;
color: $gray;
border-top: 1px solid transparent;
border-bottom: 1px solid $gray-light;
.time-container {
@include overflow-auto(x);
padding: 3px $padding;
}
}
.nesting-level {
width: 14px;
flex-shrink: 0;
margin-top: -1px;
margin-bottom: -1px;
position: relative;
border-right: 1px solid $gray;
&.group-closed::before {
content: '';
}
&::before {
border-bottom: 1px solid #a5a5a5;
position: absolute;
top: 0;
left: 0;
margin-left: 100%;
width: 5px;
height: 100%;
box-sizing: border-box;
}
}
.log-item {
position: relative;
display: flex;
@include clear-float();
background: #fff;
border-top: 1px solid $gray-light;
border-bottom: 2px solid transparent;
border-top: 1px solid transparent;
border-bottom: 1px solid $gray-light;
margin-top: -1px;
a {
color: $blue !important;
}
.nesting-level {
width: 14px;
flex-shrink: 0;
margin-top: -1px;
margin-bottom: -2px;
position: relative;
border-right: 1px solid $gray;
&.group-closed::before {
content: '';
}
&::before {
border-bottom: 1px solid #a5a5a5;
position: absolute;
top: 0;
left: 0;
margin-left: 100%;
width: 5px;
height: calc(100% - 1px);
box-sizing: border-box;
}
}
.icon-container {
margin-right: -6px;
padding-top: 3px;
padding-top: 4px;
margin: 0 -6px 0 $padding;
.icon {
line-height: 20px;
font-size: 12px;
color: $gray-dark;
position: relative;
}
.icon-caret-right,
.icon-caret-down {
left: -2px;
color: $gray;
}
.icon-arrow-right {
color: $blue;
@@ -74,6 +81,7 @@
color: $red;
}
.icon-warn {
top: -1px;
color: $yellow-dark;
}
}
@@ -141,9 +149,10 @@
color: $blue;
}
&.warn {
z-index: 40;
background: #fffbe6;
border-top: 1px solid $yellow;
border-bottom: 2px solid $yellow;
border-bottom: 1px solid $yellow;
}
&.info {
z-index: 30;
@@ -152,7 +161,8 @@
&.output {
color: $gray-dark;
}
&.group {
&.group,
&.groupCollapsed {
color: #222;
font-weight: bold;
}

View File

@@ -1,6 +1,6 @@
@font-face {
font-family: 'eruda-icon';
src: url('data:application/x-font-woff;charset=utf-8;base64,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')
src: url('data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAAz0AAsAAAAAEzAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAARAAAAFY8d0puY21hcAAAAYAAAADhAAACwIbkLalnbHlmAAACZAAAB/AAAArgAPdRjGhlYWQAAApUAAAAMQAAADYXOOvvaGhlYQAACogAAAAgAAAAJAiUBQ1obXR4AAAKqAAAACEAAABISkD/82xvY2EAAArMAAAAJgAAACYaVBbEbWF4cAAACvQAAAAfAAAAIAEjAM9uYW1lAAALFAAAAVAAAAKFm37NL3Bvc3QAAAxkAAAAjwAAAMELyVPTeJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2BkUWCcwMDKwMHUyXSGgYGhH0IzvmYwYuRgYGBiYGVmwAoC0lxTGByeMbyIZm7438AQw9zI0AgUZgTJAQDuggxieJzlkkFqAkEQRV9nHBONyYx4AQmDq5xCcKsHcOXCC+Ygbt2ErMKfuYX53SVCCCQHSBWvoYuC+tQvoAYq82pGkD5J5PhwNZV6xbTUR7z5v3S6T2iiVgt1WmmtnQ466tRv+vNQD/vL5drR3Dq2Pzt+jVQmLXm5Zfct4YmWO+tP1lPxwJh7nnlkzoyGSVE9/mPKf4hZed+vv3l2JvAG7VHgXaIm8FZRG+T70CLI96AuKDewCvL9aB3YB7QN7AjaBfYGHQK7hI6B/UKnIGvrN0FW3Z8Du8lQB/aVYR8w/QKi/1b6AAAAeJx1VmuMFMcR7uqe6Znd2Z252Z3H7Xt39m73Fo7bu33MHvfYe2FAAgM+kCNztuXEMXZMyAMrhBiiXBRFQpZjxzZEUR7+g4iiREr8I3YcycaHZclEiiykWMrBDwNOlCh/LKJEiAh2LtW7cMRKWM3WVHVVdX3dU1XdhBGy9kvpHD1EUsQn2wgBx7Z06o3QRpvWHLdU9Ljl1Pxmg9WyUt3TJW9EKtbaUrzWpo0R6unUylL6z77kxomFqY2JxMap+6YdPdZfLI55J/e9cORzu2aSyZndnz3yws9ffPbx3dOWNb378Wdf3FddbBeL7cVHFqcHBqYXYW++5E0OJxLDkwv4SveHvDHP61ch09i1f1ejuWdpT6OBpNkVO2eL7Qce7Xk++kC7SBA2ruMso2yB6ITIXjkEfs2xlBA4Fqd/jOvBTnhdH0zrwfPwjJ6e1+E3KKcHUQ6+h+NEQf9vSTL7NjlEjpEfkzfJW+Qd8i5O7LeapXJJ4aXyCLR8QcslruhUcAo3QIcsvoUeh7liO24WXActoCc5LV8MKRxZt94Gt9Zl/FYbxIQtP4shMIgQxAhaZMFG72JLhCqXqtAN6irlLHOFL85f9mtlrpSFowha8ssCglC1/Bn0armtslJ2y4rL3s/mUsmol6n2Z/r7aEhJtAvRhGRUd9QNKaFms5N6OBzihapWMNyU6iYkKb5BUalE7bDjplJ6QXi6OtWU6elE/JGGEpXjZv/UlBnSVO5Vo4OexZOp6UxECmZ/sgLqByd/9B5//1Tkb5KbGS3mMxMxNVIZrVXnZGt6Y3zzuKlqG8bqSe+dQi4UjaiSGY3ZrBKeSifjctzZYKdTvky32q8O79u5/Qmagw8sEc3TI5FEenOZ2yyajLCwmu+Hfk8J0XAkIce9cmQsr3CuGvbkZB/QiNuXmsyEDCUa6Zudu+Or2FImNRuTwjybTyUV1xvURnOKqoWNqan+wtR2I3hIvfDqKyug/OGHp96TfudV9XgunZ2KJSp5NtEYL/pG3hqfiPVX8nRzZSwWV/tihsmUiJnKpsZTKbtiOTyWSm+W2RnrROXvO3Z/GXKYm6LGTrAbbJloxCBxzClOFIe4PmmVCCua9WaxWYdbq8FVWYbc6ipkOQ8+PnMAf2xZDq6urgYfcw5Z1OQ6Gow9caCX73+i19kAkQkJQSsEZfpU8NNt8IvgwW3wTXhsa7A/WNoq7BDAII2LugBLAe6VodTw64Wawwa1NaJlBXEMSgwHPjGEoAGO2nbPlx6nZ+76lppmw6+54NBjaBnOOk42jNawbNydRXDdNa+wFTaLvIu9hWCVuJjUmMhtaCGDIjIjILdAoeTkeUk6f7JHV27K8s2VLg3YEs0t0SvrupPnP39Hh/TiUufqEkLEWL9nv2Ut0k9GBVIDC9DixcJtuDksCiQOmBYmLFYiklJDlElvH+Df/OyiZhtrCB7Xs/dtbvA5Dmfv8j09iC0aVPnbe8XChWhri2e5sP3r2l3BuG3QxXWBvcZGcQcErnuFvxdeSpyM1kMgy4jA0bsIft3ju2jX9bC0RnQHEchyD4GWcRz4qnKbQ7DrWsLW/rX2XSnCjnW/TZ6QQSh5+HUdt9AGQACOLaCWmu5IV7I4+yR4OL8vHzycHVtgowtjnXOZ4Qw+9dTAgD8wYLHhiYlbH07vAdhDv+Kk007wM0Gvg9D6A+v9+V02342nAx4wzfqdHCh7XHELJgq1LMVo7dnTb5xe3vJF6dxLL52TkG47Xn0uePNwb3jL/OyWLcunl3oqpM3qc7D9cHfwjdMiZdfW1k5Jr2O9bSHf6UYriy1ff8pFpCPQrNd8lDwDVz4JloM7/r+PACgaNTR6ziNwexpaKpYxjUX3Fy279iknGzs4HpzIYjf2S0XWqj0zbfRFIxFDi2jRKNcNmKtKleGHJIn+gCr4l9j+TcM0FFZ0gy18JtRnGoaR1vVwMrHr5TlbzYyCinpNY6XHWjwWixp9qYplqbtemRVKu3Z4yjTDejQSjaqGzh6c3Ljpv+aW9haLQIFSxpiEpxxXB8bl+jfmObvM2EcSv//7M1JEC5kGmy9JnMuSxCmaA2zaZIxVVNiwEw2MqDSyzWUKFxPIqBwZ1scqIcMrApri2Ssx7F+lrVA/Pq/gxEAvM6XbQtZ7QZKMYCoUcN9M/PaFmt8oFQtmwezeMEzcZXHA4sZlcFdnsCjQoMyOdvpyQwBDObhh2LYRqPSanbVhKPjzk6oa+YdhgxV+6i0t7YTZLFp1rdGAXgtUYQ83ckOdm0+GLbCNa1FVRVMnHSG9nMTeOIetyhA9VFx1BK56rQV+g23ofBiOmA6AY0bCdNiGX8FO7pqdPaarwA5zgojOu7aM61omCVIhTTJH7ick3sSMqWNKTEINc0HkuN2rbdnEdRcw281e3cuNksft3trj9+BnIWVdiXNX/4vu8vgVKwV6+NZrYR1X6lc6KxUfZXohrHeuxNIxfFY+9aKr4+gxGNX16CBONB7W9QOdo+iEzvQESi/rsZgezAoKK/+fv/39liWC6xwiDXF6Kbx7C5oBUQ9+N+MxzfFqYlDX6V58RJUN3jniypzAdd93s9EYlayvVXaYND8U+4IsaV9yNnPJflr7uhOSbCMZPyhJnUCGwqWL4Mly8NHFS8FlqPq+E5JtPRk/MrQjhmlgPi0r2iEnnknFD6pHnawupj0oK/ehtSy8L0EBvS8j9P8ADmnvd3icY2BkYGAAYim2hs/x/DZfGbhZGEDg5qbgnzD6/5f/9SwHmRuBXA4GJpAoAFysDbYAAAB4nGNgZGBgbvjfwBDD2vb/y/8vLAcZgCIoQAgAul0HqXicY2FgYGBtY2BgAdIsrFAaJ/7/BUxv+f8fXQ4AkWgFegAAAAAAAAAAZACEAbIB3AHwAg4CLAJiAq4C+gM0A2oEMgR+BJ4FEgVwAAB4nGNgZGBgEGI4zMDOAAJMQMwFhAwM/8F8BgAd3AHzAHicbZLLTsJAFIb/4aKxJC4UdemsWEgolyVbIixNWLAvZcolbaeZDiS48wF8Hh/CJ3DjG/gO/rSjJIQ2c/Kdb86cOUkL4AbfECifO66SBTxmJVdwiUfHVfqW4xq557iOBoaOL+ifHXto48VxA7d4ZQdRu2L2hHfHAk18OK7gGp+Oq/RfjmvkH8d13Avh+AJN8eDYw0y0HTfQEm/eyKjAqoWc7+U61GmkU+sps10EnUM6VcttHJijONJMmXytU9n3e0c5Uaz465fvlgNrIxkZncgxG6s41jIzeqNC66+szYbdbuS8H+qE441goBDAMi4gMceecY0QGimiIlrWKdZtWRGg8787pV3SxrTmbMU5NytszvyQSfTh85Odq5zQlj1O58ux480DWssZJZfhiYQ0dhMrThWTJbJib0MT0vtYFacy/hpdvtFJvV/cnfwCEldyzXicbchtCoMwFETRjCbRaj/tOrqKQvcR4rMKMZGXgHX3DfVvLwwcRhRirxH/61CghISCRoUaBzRoccQJZ1xwxQ0d7qKkjZRhDqtMITg5+SEont5jaqxhSo8+rL7d+bvbpyPDMc+Omj6L8X1tw7wwxShXw15lUaqYhoxRR3Jkk1yc2XSfnUi+JueE+ALsNyvcAA==')
format('woff');
}
@@ -33,6 +33,14 @@
content: '\e610';
}
.icon-caret-down:before {
content: '\e64e';
}
.icon-caret-right:before {
content: '\e64f';
}
.icon-clear:before {
content: '\e642';
}

View File

@@ -121,7 +121,7 @@
});
addClickEvent('stringify-timing', function () {
console.time('stringify window')
eruda.Console.stringify(window)
eruda.util.stringifyAll(window)
console.timeEnd('stringify window')
})
</script>