1
0
mirror of https://shylinux.com/x/volcanos synced 2025-04-25 00:38:05 +08:00

add portal

This commit is contained in:
IT 老营长 @云轩领航-创始人 2023-06-28 21:55:06 +08:00
parent 899fab6bf6
commit 98be025830
23 changed files with 338 additions and 375 deletions

View File

@ -117,6 +117,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
var action = can.page.SelectOne(can, field, html.DIV_ACTION) var action = can.page.SelectOne(can, field, html.DIV_ACTION)
var output = can.page.SelectOne(can, field, html.DIV_OUTPUT) var output = can.page.SelectOne(can, field, html.DIV_OUTPUT)
var status = can.page.SelectOne(can, field, html.DIV_STATUS) var status = can.page.SelectOne(can, field, html.DIV_STATUS)
can.base.isIn(meta.index, web.WIKI_PORTAL) && can.onappend.style(can, html.OUTPUT, field)
var sub = Volcanos(meta.name, {_root: can._root||can, _follow: can.core.Keys(can._follow, meta.name), _target: field, var sub = Volcanos(meta.name, {_root: can._root||can, _follow: can.core.Keys(can._follow, meta.name), _target: field,
_legend: legend, _option: option, _action: action, _output: output, _status: status, _history: [], _legend: legend, _option: option, _action: action, _output: output, _status: status, _history: [],
Status: function(key, value) { if (can.base.isObject(key)) { return can.core.Item(key, sub.Status), key } Status: function(key, value) { if (can.base.isObject(key)) { return can.core.Item(key, sub.Status), key }
@ -150,7 +151,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
sub.isCmdMode() && can.onappend.style(sub, can.misc.Search(can, ctx.STYLE)), sub.isCmdMode() && sub.Conf(can.misc.Search(can)) sub.isCmdMode() && can.onappend.style(sub, can.misc.Search(can, ctx.STYLE)), sub.isCmdMode() && sub.Conf(can.misc.Search(can))
can.base.isFunc(cb) && cb(sub) can.base.isFunc(cb) && cb(sub)
if (can.user.isMobile && !can.user.isLandscape()) { return } if (can.page.ClassList.has(can, sub._target, html.OUTPUT)) { return } if (can.user.isMobile && !can.user.isLandscape()) { return } if (can.page.ClassList.has(can, sub._target, html.OUTPUT)) { return }
sub.isCmdMode() && !can.base.isIn(meta.index, web.CODE_VIMER, web.CODE_INNER, web.CHAT_MACOS_DESKTOP) && can.page.insertBefore(can, can.user.header(can), sub._output, sub._fields) // sub.isCmdMode() && !can.base.isIn(meta.index, web.CODE_VIMER, web.CODE_INNER, web.CHAT_MACOS_DESKTOP) && can.page.insertBefore(can, can.user.header(can), sub._output, sub._fields)
}); return sub }); return sub
}, },
_option: function(can, meta, option, skip) { var index = -1, args = can.base.Obj(meta.args||meta.arg, []), opts = can.base.Obj(meta.opts, {}) _option: function(can, meta, option, skip) { var index = -1, args = can.base.Obj(meta.args||meta.arg, []), opts = can.base.Obj(meta.opts, {})
@ -350,7 +351,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
field: function(can, type, item, target) { type = type||html.STORY, item = item||{} field: function(can, type, item, target) { type = type||html.STORY, item = item||{}
var name = can.core.Split(item.nick||item.name||"").pop()||""; name = can.core.Keys(item.space, name) var name = can.core.Split(item.nick||item.name||"").pop()||""; name = can.core.Keys(item.space, name)
var title = !item.help || item.help == name || can.user.language(can) == "en"? name: name+"("+can.core.Split(item.help)[0]+")" var title = !item.help || item.help == name || can.user.language(can) == "en"? name: name+"("+can.core.Split(item.help)[0]+")"
return can.page.Append(can, target||can._output, [{view: [type, html.FIELDSET], list: [{text: [title, html.LEGEND]}, {view: [html.OPTION, html.FORM]}, html.ACTION, html.OUTPUT, html.STATUS]}]) return can.page.Append(can, target||can._output, [{view: [type, html.FIELDSET], list: [{type: html.LEGEND, list: [{icon: item.icon}, {text: title}]}, {view: [html.OPTION, html.FORM]}, html.ACTION, html.OUTPUT, html.STATUS]}])
}, },
input: function(can, item, value, target, style) { if ([html.BR, html.HR].indexOf(item.type) > -1) { return can.page.Append(can, target, [item]) } input: function(can, item, value, target, style) { if ([html.BR, html.HR].indexOf(item.type) > -1) { return can.page.Append(can, target, [item]) }
var icon = [], _item = can.base.Copy({className: "", type: "", name: ""}, item), input = can.page.input(can, _item, value) var icon = [], _item = can.base.Copy({className: "", type: "", name: ""}, item), input = can.page.input(can, _item, value)
@ -365,7 +366,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
}).length+" lines") } } }).length+" lines") } }
icon.push({icon: mdb.DELETE, onclick: function(event) { _input.value = "", item.name == html.FILTER && can.page.Select(can, can._output, html.TR, function(tr) { can.page.ClassList.del(can, tr, html.HIDE) }) }}) icon.push({icon: mdb.DELETE, onclick: function(event) { _input.value = "", item.name == html.FILTER && can.page.Select(can, can._output, html.TR, function(tr) { can.page.ClassList.del(can, tr, html.HIDE) }) }})
} if (item.range) { input._init = function(target) { can.onappend.figure(can, item, target, function(sub, value, old) { target.value = value, can.core.CallFunc([can.onaction, item.name], [event, can, item.name]) }) } } } if (item.range) { input._init = function(target) { can.onappend.figure(can, item, target, function(sub, value, old) { target.value = value, can.core.CallFunc([can.onaction, item.name], [event, can, item.name]) }) } }
var _input = can.page.Append(can, target, [{view: [[html.ITEM].concat(style, [item.type, item.name])], list: [input].concat(icon), _init: function(target, _input) { var _input = can.page.Append(can, target, [{view: [[html.ITEM].concat(style, [item.type, item.name])], list: [{icon: item.icon}, input].concat(icon), _init: function(target, _input) {
if (item.type == html.SELECT) { _input.select.value = value||_item.value||_item.values[0], can.onappend.select(can, _input.select, _item) } if (item.type == html.SELECT) { _input.select.value = value||_item.value||_item.values[0], can.onappend.select(can, _input.select, _item) }
item.style && can.onappend.style(can, item.style, target) item.style && can.onappend.style(can, item.style, target)
}}])[item.name]; return _input }}])[item.name]; return _input

101
index.css
View File

@ -70,7 +70,7 @@ body>div.upload div.status div.cost { float:left; }
body>div.upload div.status div.show { float:right; } body>div.upload div.status div.show { float:right; }
body>div.upload div.status div.size { text-align:center; } body>div.upload div.status div.size { text-align:center; }
/* font */ /* font */
legend { font-size:1.2rem; line-height:30px; height:32px; } legend { font-size:1.2rem; line-height:32px; height:32px; }
select, input { font-size:1rem; height:32px; } textarea::placeholder, input::placeholder { font-style:italic; } select, input { font-size:1rem; height:32px; } textarea::placeholder, input::placeholder { font-style:italic; }
textarea { font-size:1rem; tab-size:2; padding:5px; height:96px; width:100%; resize:vertical; } textarea { font-size:1rem; tab-size:2; padding:5px; height:96px; width:100%; resize:vertical; }
table.content, div.item, div.code, div.story[data-type=spark] { font-family:monospace; } table.content, div.item, div.code, div.story[data-type=spark] { font-family:monospace; }
@ -128,6 +128,7 @@ fieldset.float>div.action>div.button.icons>input { display:none; }
fieldset.full>div.action>div.button.icons>input { display:none; } fieldset.full>div.action>div.button.icons>input { display:none; }
fieldset.cmd>div.action>div.button.icons>input { display:none; } fieldset.cmd>div.action>div.button.icons>input { display:none; }
body.windows form.option>div.icon { font-size:21px; } body.windows form.option>div.icon { font-size:21px; }
legend>i:first-child { margin-right:10px; } div.item>i:first-child { margin-right:10px; }
fieldset.float div.text:hover>span.icon.delete { visibility:hidden; } fieldset.float div.text:hover>span.icon.delete { visibility:hidden; }
fieldset.float>form.option>div.text>input { display:none; } fieldset.float>form.option>div.text>input { display:none; }
fieldset.float>form.option>div.text>span { display:none; } fieldset.float>form.option>div.text>span { display:none; }
@ -179,13 +180,14 @@ fieldset.output>legend { display:none; }
fieldset.output>form.option { display:none; } fieldset.output>form.option { display:none; }
fieldset.output>div.action { display:none; } fieldset.output>div.action { display:none; }
fieldset.output>div.status { display:none; } fieldset.output>div.status { display:none; }
fieldset.output>div.item { display:none; }
fieldset>form.option>div.item.select, fieldset>div.action>div.item.select { border-radius:5px; } fieldset>form.option>div.item.select, fieldset>div.action>div.item.select { border-radius:5px; }
fieldset>form.option, fieldset>div.action { display:contents; } form.option.hide, div.action.hide, .hidden, .hide { display:none; } fieldset>form.option, fieldset>div.action { display:contents; } form.option.hide, div.action.hide, .hidden, .hide { display:none; }
div.action, div.output, div.status, div.project, div.content, div.profile, div.display, table.content, table.content td, div.list, div.code, div.story, div.float, fieldset.float { overflow:auto; } div.action, div.output, div.status, div.project, div.content, div.profile, div.display, table.content, table.content td, div.list, div.code, div.story, div.float, fieldset.float { overflow:auto; }
legend, form.option, form.option>div.item, div.action, div.action>div.item, div.action>div.tabs, fieldset>div.status>div.item { float:left; } legend, form.option, form.option>div.item, div.action, div.action>div.item, div.action>div.tabs, fieldset>div.status>div.item { float:left; }
fieldset.story, div.output, fieldset>div.status, div.project div.item, div.content:not(.item), div.code, div.story[data-type=spark] { clear:both; } fieldset.story, div.output, fieldset>div.status, div.project div.item, div.content:not(.item), div.code, div.story[data-type=spark] { clear:both; }
div.output { position:relative; } div.layout.flex>* { float:left; clear:none; } div.output { position:relative; } div.layout.flex>* { float:left; clear:none; }
fieldset.auto, fieldset.full, fieldset.float, div.float { position:fixed; z-index:10; } fieldset.auto, fieldset.full, fieldset.float, div.float { position:fixed; z-index:100; }
fieldset.cmd fieldset.plug { position:fixed; bottom:32px; right:0; } fieldset.cmd fieldset.plug { position:fixed; bottom:32px; right:0; }
fieldset.plug { position:absolute; bottom:0; right:0; } fieldset.plug { position:absolute; bottom:0; right:0; }
fieldset.full { position:fixed; left:0; top:0; } fieldset.full { position:fixed; left:0; top:0; }
@ -214,51 +216,60 @@ body {
--danger-bg-color:red; --danger-fg-color:white; --danger-bg-color:red; --danger-fg-color:white;
--create-bg-color:blue; --create-fg-color:white; --create-bg-color:blue; --create-fg-color:white;
--disable-fg-color:gray; --disable-fg-color:gray;
--code-comment:darkgray;
--code-keyword:darkblue;
--code-package:blue;
--code-datatype:cornflowerblue;
--code-function:darkcyan;
--code-constant:gray;
--code-string:brown;
--code-object:purple;
} }
body { background-color:var(--body-bg-color); color:var(--body-fg-color); } body { background-color:var(--body-bg-color); color:var(--body-fg-color); }
body legend { background-color:var(--legend-bg-color); border-radius:var(--input-radius); } legend { background-color:var(--legend-bg-color); border-radius:var(--input-radius); }
body legend:hover { color:var(--hover-fg-color) } legend:hover { color:var(--hover-fg-color) }
body select { border-radius:var(--input-radius); } select { border-radius:var(--input-radius); }
body input { background-color:var(--input-bg-color); color:var(--input-fg-color); border-radius:var(--input-radius); } input { background-color:var(--input-bg-color); color:var(--input-fg-color); border-radius:var(--input-radius); }
body input:hover { color:var(--hover-fg-color) } input:hover { color:var(--hover-fg-color) }
body input:not([type=button]) { border-radius:0; } input:not([type=button]) { border-radius:0; }
body input:not([type=button]):hover { border:var(--input-border); } input:not([type=button]):hover { border:var(--input-border); }
body input:not([type=button]):focus { border:var(--input-border); outline:none; } input:not([type=button]):focus { border:var(--input-border); outline:none; }
body textarea { background-color:var(--input-bg-color); color:var(--input-fg-color); } textarea { background-color:var(--input-bg-color); color:var(--input-fg-color); }
body table.content tr:hover { background-color:var(--tr-hover-bg-color); color:var(--hover-fg-color); } table.content tr:hover { background-color:var(--tr-hover-bg-color); color:var(--hover-fg-color); }
body table.content th { background-color:var(--th-bg-color); color:var(--th-fg-color); } table.content th { background-color:var(--th-bg-color); color:var(--th-fg-color); }
body table.content td:hover { background-color:var(--td-hover-bg-color); } table.content td:hover { background-color:var(--td-hover-bg-color); }
body table.content td.select { background-color:var(--td-hover-bg-color); } table.content td.select { background-color:var(--td-hover-bg-color); }
body table.content.action td:last-child { background-color:var(--th-bg-color); } table.content.action td:last-child { background-color:var(--th-bg-color); }
body h1:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); } h1:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); }
body h2:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); } h2:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); }
body h3:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); } h3:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); }
body div.item:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); } div.item:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); }
body div.item.select { background-color:var(--hover-bg-color); color:var(--hover-fg-color); } div.item.select { background-color:var(--hover-bg-color); color:var(--hover-fg-color); }
body span.item:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); } span.item:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); }
body span.item.select { background-color:var(--hover-bg-color); color:var(--hover-fg-color); } span.item.select { background-color:var(--hover-bg-color); color:var(--hover-fg-color); }
body span.icon:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); } span.icon:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); }
body div.action div.tabs:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); } div.action div.tabs:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); }
body div.action div.tabs.select { background-color:var(--hover-bg-color); color:var(--hover-fg-color); } div.action div.tabs.select { background-color:var(--hover-bg-color); color:var(--hover-fg-color); }
body div.output { background-color:var(--output-bg-color); } div.output { background-color:var(--output-bg-color); }
body fieldset>div.status { border-top:var(--status-border); } fieldset>div.status { border-top:var(--status-border); }
body fieldset:not(.panel) { background-color:var(--plugin-bg-color); color:var(--plugin-fg-color); border-radius:var(--plugin-radius); } fieldset:not(.panel) { background-color:var(--plugin-bg-color); color:var(--plugin-fg-color); border-radius:var(--plugin-radius); }
body fieldset.panel:not(.main) { background-color:var(--panel-bg-color); color:var(--panel-fg-color); } fieldset.panel:not(.main) { background-color:var(--panel-bg-color); color:var(--panel-fg-color); }
body fieldset.panel:not(.main)>div.output { background-color:var(--panel-output-bg-color); color:var(--panel-output-fg-color); } fieldset.panel:not(.main)>div.output { background-color:var(--panel-output-bg-color); color:var(--panel-output-fg-color); }
body fieldset.input div.output { background-color:var(--plugin-bg-color); } fieldset.input div.output { background-color:var(--plugin-bg-color); }
body fieldset.input tr:hover { background-color:var(--tr-hover-bg-color); } fieldset.input tr:hover { background-color:var(--tr-hover-bg-color); }
body fieldset.input td:hover { background-color:var(--td-hover-bg-color); } fieldset.input td:hover { background-color:var(--td-hover-bg-color); }
body div.float { background-color:var(--float-bg-color); color:var(--float-fg-color); } div.float { background-color:var(--float-bg-color); color:var(--float-fg-color); }
body div.carte div.item { background-color:var(--carte-bg-color); } div.carte div.item { background-color:var(--carte-bg-color); }
body div.carte div.item:hover { background-color:var(--hover-bg-color); } div.carte div.item:hover { background-color:var(--hover-bg-color); }
body div.zone>div.item { background-color:var(--th-bg-color); } div.zone>div.item { background-color:var(--th-bg-color); }
body div.zone>div.list>div.zone>div.item { background-color:var(--th-bg-color); } div.zone>div.list>div.zone>div.item { background-color:var(--th-bg-color); }
body div.tabs div { background-color:var(--plugin-bg-color); } div.tabs div { background-color:var(--plugin-bg-color); }
body div.tabs div:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); } div.tabs div:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); }
body div.tabs div.select { background-color:var(--hover-bg-color); color:var(--hover-fg-color); } div.tabs div.select { background-color:var(--hover-bg-color); color:var(--hover-fg-color); }
body div.plug legend { background-color:var(--output-bg-color); } div.plug legend { background-color:var(--output-bg-color); }
body div.plug legend.select { background-color:var(--plugin-bg-color); } div.plug legend.select { background-color:var(--plugin-bg-color); }
body div.complete>table { background-color:var(--plugin-bg-color); } div.complete>table { background-color:var(--plugin-bg-color); }
body.light fieldset.panel:not(.main)>div.output div.state:hover { background-color:var(--panel-hover-bg-color); color:var(--panel-hover-fg-color); } body.light fieldset.panel:not(.main)>div.output div.state:hover { background-color:var(--panel-hover-bg-color); color:var(--panel-hover-fg-color); }
body.light fieldset.panel:not(.main)>div.output div.title:hover { background-color:var(--panel-hover-bg-color); color:var(--panel-hover-fg-color); } body.light fieldset.panel:not(.main)>div.output div.title:hover { background-color:var(--panel-hover-bg-color); color:var(--panel-hover-fg-color); }

View File

@ -55,7 +55,11 @@ Volcanos("page", {
} else if (item.text) { var list = can.core.List(item.text); if (can.base.isArray(list[2])) { list[2] = list[2].join(lex.SP) } } else if (item.text) { var list = can.core.List(item.text); if (can.base.isArray(list[2])) { list[2] = list[2].join(lex.SP) }
data.innerHTML = list[0]||data.innerHTML||"", type = list[1]||item.type||html.SPAN, list[2] && can.page.ClassList.add(can, data, list[2]) data.innerHTML = list[0]||data.innerHTML||"", type = list[1]||item.type||html.SPAN, list[2] && can.page.ClassList.add(can, data, list[2])
} else if (item.icon) { var list = can.core.List(item.icon) } else if (item.icon) { var list = can.core.List(item.icon)
type = html.SPAN, name = list[0], data.className = "icon "+list[0], data.innerText = can.page.unicode[list[0]] if (can.page.unicode[list[0]]) {
type = html.SPAN, name = list[0], data.className = "icon "+list[0], data.innerText = can.page.unicode[list[0]]
} else {
type = "i", data.className = list[0]
}
} else if (item.button) { var list = can.core.List(item.button); type = html.BUTTON, name = list[0]||name, data.innerText = can.user.trans(can, name) } else if (item.button) { var list = can.core.List(item.button); type = html.BUTTON, name = list[0]||name, data.innerText = can.user.trans(can, name)
data.onclick = function(event) { can.misc.Event(event, can, function(msg) { can.base.isFunc(list[1]) && list[1](event, name), can.onkeymap.prevent(event) }) } data.onclick = function(event) { can.misc.Event(event, can, function(msg) { can.base.isFunc(list[1]) && list[1](event, name), can.onkeymap.prevent(event) }) }
} else if (item.select) { var list = item.select; type = html.SELECT, name = list[0][0], data.className = data.className||list[0][0] } else if (item.select) { var list = item.select; type = html.SELECT, name = list[0][0], data.className = data.className||list[0][0]
@ -157,6 +161,11 @@ Volcanos("page", {
isclose && {view: [[html.ITEM, html.HIDE]], list: [{text: " "}, {className: code.KEYWORD, text: can.page.replace(can, ice.LT+nfs.PS+tag+ice.GT)}], _init: function(target) { ui.close = target }}, isclose && {view: [[html.ITEM, html.HIDE]], list: [{text: " "}, {className: code.KEYWORD, text: can.page.replace(can, ice.LT+nfs.PS+tag+ice.GT)}], _init: function(target) { ui.close = target }},
]} ]}
}, },
AppendStyle: function(can, style) {
var styleElement = document.createElement('style'); styleElement.type = 'text/css'
document.getElementsByTagName('head')[0].appendChild(styleElement)
styleElement.appendChild(document.createTextNode(style))
},
AppendTable: function(can, msg, target, list, cb) { if (!msg.append||msg.append.length == 0) { return } AppendTable: function(can, msg, target, list, cb) { if (!msg.append||msg.append.length == 0) { return }
var ui = can.page.Append(can, target, [{type: html.TABLE, list: [{type: html.THEAD}, {type: html.TBODY}]}]) var ui = can.page.Append(can, target, [{type: html.TABLE, list: [{type: html.THEAD}, {type: html.TBODY}]}])
can.page.Append(can, ui.thead, [{data: {dataset: {index: -1}}, th: can.core.List(list, function(key) { if (key[0] != "_") { return key } }) }]) can.page.Append(can, ui.thead, [{data: {dataset: {index: -1}}, th: can.core.List(list, function(key) { if (key[0] != "_") { return key } }) }])
@ -320,4 +329,10 @@ Volcanos("page", {
return canvas.toDataURL(nfs.IMAGE_PNG, 1) return canvas.toDataURL(nfs.IMAGE_PNG, 1)
}, },
position: function(event, target) { var p = target.getBoundingClientRect(); return {x: event.clientX - p.x, y: event.clientY - p.y} }, position: function(event, target) { var p = target.getBoundingClientRect(); return {x: event.clientX - p.x, y: event.clientY - p.y} },
theme: function(cb) {
var themeMedia = window.matchMedia("(prefers-color-scheme: dark)")
cb && themeMedia.addListener(function(event) { cb(event.matches? html.DARK: html.LIGHT) })
cb && cb(themeMedia.matches? html.DARK: html.LIGHT)
return themeMedia.matches? html.DARK: html.LIGHT
},
}) })

View File

@ -100,7 +100,7 @@ Volcanos("user", {
close: function(event) { can.page.Remove(can, ui._target), action.timer.stop = true }, close: function(event) { can.page.Remove(can, ui._target), action.timer.stop = true },
cancel: function(event) { can.page.Remove(can, ui._target), action.timer.stop = true }, cancel: function(event) { can.page.Remove(can, ui._target), action.timer.stop = true },
timer: can.core.Timer({interval: 100, length: (meta.duration||1000)/100}, function(event, interval, index) { timer: can.core.Timer({interval: 100, length: (meta.duration||1000)/100}, function(event, interval, index) {
if (index > 30) { ui.duration.innerHTML = index/10+"s..." } if (index > 30) { ui.duration.innerHTML = index/10+(index%10==0?".0":"")+"s..." }
}, function() { action.close() }), _target: ui._target, }, function() { action.close() }), _target: ui._target,
}); can.onmotion.story.auto(can, ui._target), meta.resize && can.onmotion.delayResize(can, ui._target, meta.resize) }); can.onmotion.story.auto(can, ui._target), meta.resize && can.onmotion.delayResize(can, ui._target, meta.resize)
return can._toast && (can._toast.close(), delete(can._toast)), can._toast = action return can._toast && (can._toast.close(), delete(can._toast)), can._toast = action
@ -160,7 +160,7 @@ Volcanos("user", {
}, _enter: function(event) { return action.submit(event, can, html.SUBMIT), true }}, item), target) }, _enter: function(event) { return action.submit(event, can, html.SUBMIT), true }}, item), target)
}, item.onkeydown = function(event) { if (event.key == lang.ESCAPE) { event.target.blur() } } }, item.onkeydown = function(event) { if (event.key == lang.ESCAPE) { event.target.blur() } }
return {type: html.TR, list: [ return {type: html.TR, list: [
{type: html.TD, list: [{text: [item.name||"", html.LABEL]}]}, {type: html.TD, list: [{text: item.need == "must"? "*": "", style: {color: cli.RED}}]}, {type: html.TD, list: [{text: [can.user.trans(can, item.name||"", item._trans), html.LABEL]}]}, {type: html.TD, list: [{text: item.need == "must"? "*": "", style: {color: cli.RED}}]},
{type: html.TD, list: [can.page.input(can, item), item.type == html.TEXT && {icon: "delete", onclick: function(event) { event.target.previousSibling.value = "" }}]}, {type: html.TD, list: [can.page.input(can, item), item.type == html.TEXT && {icon: "delete", onclick: function(event) { event.target.previousSibling.value = "" }}]},
]} ]}
})}]}, html.ACTION, })}]}, html.ACTION,
@ -257,7 +257,8 @@ Volcanos("user", {
logout: function(can) { can.user.toastConfirm(can, aaa.LOGOUT, "", function() { can.runAction({}, aaa.LOGOUT, [], function(msg) { logout: function(can) { can.user.toastConfirm(can, aaa.LOGOUT, "", function() { can.runAction({}, aaa.LOGOUT, [], function(msg) {
can.misc.Search(can, chat.SHARE)? can.misc.Search(can, chat.SHARE, ""): can.user.reload(true) can.misc.Search(can, chat.SHARE)? can.misc.Search(can, chat.SHARE, ""): can.user.reload(true)
}) }) }, }) }) },
header: function(can) { var header = can._root.Header header: function(can) { if (!can._root) { return }
var header = can._root.Header
var meta = { var meta = {
time: {view: [[html.ITEM, mdb.TIME]], _init: function(target) { time: {view: [[html.ITEM, mdb.TIME]], _init: function(target) {
can.core.Timer({interval: 100}, function() { can.page.Modify(can, target, can.user.time(can, null, "%H:%M:%S %w")) }) can.core.Timer({interval: 100}, function() { can.page.Modify(can, target, can.user.time(can, null, "%H:%M:%S %w")) })

View File

@ -3,8 +3,8 @@
"background": {"page": "/publish/chrome/daemon.html"}, "background": {"page": "/publish/chrome/daemon.html"},
"browser_action": {"default_popup": "/publish/chrome/popup.html"}, "browser_action": {"default_popup": "/publish/chrome/popup.html"},
"content_scripts": [ "content_scripts": [
{"matches": [""], "permissions": [ {"matches": ["<all_urls>"], "permissions": [
"tabs", "history", "cookies", "bookmarks", "contextMenus", "notifications", "http://localhost:9020/*" "tabs", "history", "cookies", "bookmarks", "contextMenus", "notifications", "http://localhost:9020/*"
], "css": ["/page/can.css"], "js": ["/page/can.js", "/publish/chrome/contexts.js"]} ], "css": ["/publish/chrome/contexts.css"], "js": ["/proto.js", "/page/cache.js", "/publish/chrome/contexts.js"]}
] ]
} }

View File

@ -22,7 +22,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg) { var river = can.Conf(chat.R
}, oncontextmenu: sub._legend.onclick}]; sub._header_tabs = can.page.Append(can, can._header_tabs, tabs)._target, sub._tabs = can.page.Append(can, can._action, tabs)._target }, oncontextmenu: sub._legend.onclick}]; sub._header_tabs = can.page.Append(can, can._header_tabs, tabs)._target, sub._tabs = can.page.Append(can, can._action, tabs)._target
}, },
_menu: function(can, msg) { if (can.user.isMobile) { return } _menu: function(can, msg) { if (can.user.isMobile) { return }
var target = can.setHeaderMenu(can.base.Obj(can.Conf(chat.MENUS)||msg.Option(chat.MENUS), can.onaction._menus), function(event, button, list) { can.core.CallFunc([can.onaction, list[0]], [can, button]) }) var target = can.setHeaderMenu(can.base.Obj(can.Conf(chat.MENUS)||msg.Option(chat.MENUS), can.onaction._menus), function(event, button, list) { list && can.core.CallFunc([can.onaction, list[0]], [can, button]) })
can.onmotion.hidden(can, can._header_tabs = can.page.Append(can, target, [html.TABS])._target) can.onmotion.hidden(can, can._header_tabs = can.page.Append(can, target, [html.TABS])._target)
}, },
}) })

View File

@ -14,7 +14,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.Conf(NKEY, can.
], onclick: function(event) { can.onexport[item](can) }}]) ], onclick: function(event) { can.onexport[item](can) }}])
}) }, }) },
_toast: function(can, msg, target) { can.ui.toast = can.page.Append(can, target, [{view: [[html.ITEM, chat.TOAST]], onclick: function(event) { can.onexport[NTIP](can) }}])._target }, _toast: function(can, msg, target) { can.ui.toast = can.page.Append(can, target, [{view: [[html.ITEM, chat.TOAST]], onclick: function(event) { can.onexport[NTIP](can) }}])._target },
_command: function(can, msg, target) { can.onappend.input(can, {type: html.TEXT, name: ice.CMD, onkeydown: function(event) { can.onkeymap.input(event, can) _command: function(can, msg, target) { can.onappend.input(can, {type: html.TEXT, icon: "bi bi-terminal", name: ice.CMD, onkeydown: function(event) { can.onkeymap.input(event, can)
function close() { can.ui.cli && can.ui.cli.onaction.close() } if (event.key == lang.ESCAPE) { return close() } if (event.key != lang.ENTER) { return } function close() { can.ui.cli && can.ui.cli.onaction.close() } if (event.key == lang.ESCAPE) { return close() } if (event.key != lang.ENTER) { return }
close(); switch (event.target.value) { close(); switch (event.target.value) {
case cli.CLEAR: case cli.CLEAR:

View File

@ -1,7 +1,7 @@
Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) {
can.onimport._title(can, msg, target), can.onimport._state(can, msg, target), can.onimport._avatar(can, msg, target), can.onimport._background(can, msg, target), can.onimport._search(can, msg, target) can.onimport._title(can, msg, target), can.onimport._state(can, msg, target), can.onimport._avatar(can, msg, target), can.onimport._background(can, msg, target), can.onimport._search(can, msg, target)
}, },
_title: function(can, msg, target) { can.user.isMobile || can.core.List(can.base.getValid(can.Conf(chat.TITLE)||location.host||msg.result, [location.host]), function(item) { _title: function(can, msg, target) { can.user.isMobile || can.core.List(can.base.getValid(can.Conf(chat.TITLE)||(can.user.isExtension? "chrome": location.host)||msg.result, [location.host]), function(item) {
can.page.Append(can, target, [{view: [[html.ITEM, chat.TITLE], "", item], title: "返回主页", onclick: function(event) { can.onaction.title(event, can) }}]) can.page.Append(can, target, [{view: [[html.ITEM, chat.TITLE], "", item], title: "返回主页", onclick: function(event) { can.onaction.title(event, can) }}])
}) }, }) },
_state: function(can, msg, target) { can.core.List(can.base.Obj(can.Conf(chat.STATE)||msg.Option(chat.STATE), [aaa.USERNICK, aaa.AVATAR, mdb.TIME]).reverse(), function(item) { _state: function(can, msg, target) { can.core.List(can.base.Obj(can.Conf(chat.STATE)||msg.Option(chat.STATE), [aaa.USERNICK, aaa.AVATAR, mdb.TIME]).reverse(), function(item) {
@ -19,7 +19,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) {
// window.parent == window? can.onlayout.background(can, can.onexport.background(can)): can.page.style(can, document.body, html.BACKGROUND_COLOR, "transparent") // window.parent == window? can.onlayout.background(can, can.onexport.background(can)): can.page.style(can, document.body, html.BACKGROUND_COLOR, "transparent")
}, },
_search: function(can, msg, target) { _search: function(can, msg, target) {
can._search = can.onappend.input(can, {type: html.TEXT, name: mdb.SEARCH, onkeydown: function(event) { can.onkeymap.input(event, can) can._search = can.onappend.input(can, {type: html.TEXT, icon: "bi bi-search", name: mdb.SEARCH, onkeydown: function(event) { can.onkeymap.input(event, can)
event.key == lang.ENTER && can.onengine.signal(can, chat.ONOPENSEARCH, can.request(event, {type: mdb.FOREACH, word: event.target.value||""})) event.key == lang.ENTER && can.onengine.signal(can, chat.ONOPENSEARCH, can.request(event, {type: mdb.FOREACH, word: event.target.value||""}))
}}, "", target, [chat.TITLE]) }}, "", target, [chat.TITLE])
can.onimport.menu(can, mdb.SEARCH, function() { can.onengine.signal(can, chat.ONOPENSEARCH, can.request(event, {type: mdb.FOREACH, word: can._search.value||""})) }) can.onimport.menu(can, mdb.SEARCH, function() { can.onengine.signal(can, chat.ONOPENSEARCH, can.request(event, {type: mdb.FOREACH, word: can._search.value||""})) })
@ -45,10 +45,8 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) {
}) }])._target }) }])._target
}, },
}) })
Volcanos(chat.ONACTION, {_init: function(can) { var themeMedia = window.matchMedia("(prefers-color-scheme: dark)") Volcanos(chat.ONACTION, {_init: function(can) {
can.__theme = themeMedia.matches? html.DARK: html.LIGHT, themeMedia.addListener(function(event) { can.__theme = event.matches? html.DARK: html.LIGHT can.page.theme(function(theme) { can.onengine.signal(can, chat.ONTHEMECHANGE, can.request(event, {theme: can.__theme = theme})) }), can.onimport.theme(can)
can.onengine.signal(can, chat.ONTHEMECHANGE, can.request(event, {theme: can.__theme}))
}), can.onimport.theme(can)
return can.require([ return can.require([
"src/template/web.chat.header/dark.css", "src/template/web.chat.header/dark.css",
"src/template/web.chat.header/light.css", "src/template/web.chat.header/light.css",

View File

@ -9,10 +9,10 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.onimport._main(can, msg
can._main_river = ls[0]||can.misc.SearchOrConf(can, chat.RIVER)||msg.Option(ice.MSG_RIVER)||"project" can._main_river = ls[0]||can.misc.SearchOrConf(can, chat.RIVER)||msg.Option(ice.MSG_RIVER)||"project"
can._main_storm = ls[1]||can.misc.SearchOrConf(can, chat.STORM)||msg.Option(ice.MSG_STORM)||"studio" can._main_storm = ls[1]||can.misc.SearchOrConf(can, chat.STORM)||msg.Option(ice.MSG_STORM)||"studio"
}, },
_river: function(can, meta, cb) { return {view: [html.ITEM, "", meta.name], _init: function(target) { can.ui.river_list[meta.hash] = target, cb(target) }, _river: function(can, meta, cb) { return {view: html.ITEM, list: [{icon: meta.icon}, {text: meta.name}], _init: function(target) { can.ui.river_list[meta.hash] = target, cb(target) },
onclick: function(event) { can.onaction.storm(event, can, meta.hash) }, oncontextmenu: function(event) { can.onaction.carte(event, can, can.onaction._menu, meta.hash) }, onclick: function(event) { can.onaction.storm(event, can, meta.hash) }, oncontextmenu: function(event) { can.onaction.carte(event, can, can.onaction._menu, meta.hash) },
} }, } },
_storm: function(can, meta, river) { return {view: [html.ITEM, "", meta.name], _init: function(target) { can.ui.storm_list[can.core.Keys(river, meta.hash)] = target }, _storm: function(can, meta, river) { return {view: html.ITEM, list: [{icon: meta.icon}, {text: meta.name}], _init: function(target) { can.ui.storm_list[can.core.Keys(river, meta.hash)] = target },
onclick: function(event) { can.onaction.action(event, can, river, meta.hash) }, oncontextmenu: function(event) { can.onaction.carte(event, can, can.ondetail._menu, river, meta.hash) }, onclick: function(event) { can.onaction.action(event, can, river, meta.hash) }, oncontextmenu: function(event) { can.onaction.carte(event, can, can.ondetail._menu, river, meta.hash) },
} }, } },
_menu: function(can, msg) { can.user.isMobile || can.user.mod.isPod || can.onappend._action(can, can.onaction.list, can._action) }, _menu: function(can, msg) { can.user.isMobile || can.user.mod.isPod || can.onappend._action(can, can.onaction.list, can._action) },
@ -31,6 +31,7 @@ Volcanos(chat.ONACTION, {list: [mdb.CREATE, web.SHARE, web.REFRESH], _init: func
create: function(event, can) { can.user.input(can.request(event, {title: "创建群组"}), can, [ create: function(event, can) { can.user.input(can.request(event, {title: "创建群组"}), can, [
{name: mdb.TYPE, values: [aaa.TECH, aaa.ROOT, aaa.TECH, aaa.VOID], _trans: "类型"}, {name: mdb.TYPE, values: [aaa.TECH, aaa.ROOT, aaa.TECH, aaa.VOID], _trans: "类型"},
{name: mdb.NAME, value: "hi", _trans: "群名", need: "must"}, {name: mdb.NAME, value: "hi", _trans: "群名", need: "must"},
{name: mdb.ICON, value: "", _trans: "图标"},
{name: mdb.TEXT, value: "hello", _trans: "简介"}, {name: mdb.TEXT, value: "hello", _trans: "简介"},
], function(args) { ], function(args) {
can.runAction(event, mdb.CREATE, args, function(msg) { can.misc.Search(can, {river: msg.Result()}) }) can.runAction(event, mdb.CREATE, args, function(msg) { can.misc.Search(can, {river: msg.Result()}) })
@ -89,7 +90,10 @@ Volcanos(chat.ONDETAIL, {
can.onmotion.delay(can, function() { toast.close(), next(), index == array.length-1 && can.user.toastSuccess(can) }) can.onmotion.delay(can, function() { toast.close(), next(), index == array.length-1 && can.user.toastSuccess(can) })
}) })
}) }, }) },
addcmd: function(event, can, button, river, storm) { can.user.input(can.request(event, {title: "添加工具"}), can, [{name: web.SPACE, value: can.misc.Search(can, ice.POD)||""}, {name: ctx.INDEX, need: "must"}, ctx.ARGS, ctx.DISPLAY, ctx.STYLE], function(args) { addcmd: function(event, can, button, river, storm) { can.user.input(can.request(event, {title: "添加工具"}), can, [
{name: web.SPACE, value: can.misc.Search(can, ice.POD)||""},
mdb.ICON, {name: ctx.INDEX, need: "must"}, ctx.ARGS, ctx.DISPLAY, ctx.STYLE,
], function(args) {
can.run({}, [river, storm, chat.STORM, ctx.ACTION, mdb.INSERT].concat(args), function(msg) { can.run({}, [river, storm, chat.STORM, ctx.ACTION, mdb.INSERT].concat(args), function(msg) {
can.onengine.signal(can, chat.ONSTORM_SELECT, can.request(event, {river: can.Conf(chat.RIVER, river), storm: can.Conf(chat.STORM, storm), refresh: ice.TRUE})) can.onengine.signal(can, chat.ONSTORM_SELECT, can.request(event, {river: can.Conf(chat.RIVER, river), storm: can.Conf(chat.STORM, storm), refresh: ice.TRUE}))
}) })
@ -100,6 +104,7 @@ Volcanos(chat.ONDETAIL, {
remove: function(event, can, button, river, storm) { can.run(event, [river, storm, chat.STORM, ctx.ACTION, mdb.REMOVE], function(msg) { can.misc.Search(can, {river: river, storm: ""}) }) }, remove: function(event, can, button, river, storm) { can.run(event, [river, storm, chat.STORM, ctx.ACTION, mdb.REMOVE], function(msg) { can.misc.Search(can, {river: river, storm: ""}) }) },
create: function(event, can, button, river) { can.user.input(can.request(event, {title: "添加应用"}), can, [ create: function(event, can, button, river) { can.user.input(can.request(event, {title: "添加应用"}), can, [
{name: mdb.NAME, value: "hi", _trans: "名称", need: "must"}, {name: mdb.NAME, value: "hi", _trans: "名称", need: "must"},
{name: mdb.ICON, value: "", _trans: "图标"},
{name: mdb.TEXT, value: "hello", _trans: "简介"}, {name: mdb.TEXT, value: "hello", _trans: "简介"},
], function(args) { ], function(args) {
can.run({}, [river, chat.STORM, ctx.ACTION, mdb.CREATE].concat(args), function(msg) { can.misc.Search(can, {river: river, storm: msg.Result()}) }) can.run({}, [river, chat.STORM, ctx.ACTION, mdb.CREATE].concat(args), function(msg) { can.misc.Search(can, {river: river, storm: msg.Result()}) })
@ -113,11 +118,11 @@ Volcanos(chat.ONEXPORT, {width: function(can) { return can._target.offsetWidth }
Volcanos(chat.ONENGINE, {_engine: function(event, can, msg, panel, cmds, cb) { var list = can.river Volcanos(chat.ONENGINE, {_engine: function(event, can, msg, panel, cmds, cb) { var list = can.river
cmds.length == 0 && can.core.ItemOrder(list, "order", function(key, value) { cmds.length == 0 && can.core.ItemOrder(list, "order", function(key, value) {
if (can.user.info.userrole == aaa.ROOT || can.base.isIn(value.type||"", "", aaa.VOID, can.user.info.userrole)) { if (can.user.info.userrole == aaa.ROOT || can.base.isIn(value.type||"", "", aaa.VOID, can.user.info.userrole)) {
can.core.Item(value.storm).length > 0 && msg.Push({hash: key, name: can.user.language(can) == "en"? key: value.name}) can.core.Item(value.storm).length > 0 && msg.Push({hash: key, name: can.user.language(can) == "en"? key: value.name, icon: value.icon||""})
} }
}) })
if (cmds.length != 1 && cmds[1] != chat.STORM) { return false } var river = list[cmds[0]]; if (!river) { return false } if (cmds.length != 1 && cmds[1] != chat.STORM) { return false } var river = list[cmds[0]]; if (!river) { return false }
can.core.ItemOrder(river.storm, "order", function(key, value) { msg.Push({hash: key, name: can.user.language(can) == "en"? key: value.name}) }) can.core.ItemOrder(river.storm, "order", function(key, value) { msg.Push({hash: key, name: can.user.language(can) == "en"? key: value.name, icon: value.icon||""}) })
can.base.isFunc(cb) && cb(msg); return true can.base.isFunc(cb) && cb(msg); return true
}}) }})
})() })()

View File

@ -3,14 +3,14 @@ fieldset.inner>form.option input[name=file] { width:160px; }
fieldset.inner>div.output { overflow:hidden; } fieldset.inner>div.output { overflow:hidden; }
fieldset.inner>div.output div.content { position:relative; } fieldset.inner>div.output div.content { position:relative; }
fieldset.inner>div.output div.content td.text { height:20px; } fieldset.inner>div.output div.content td.text { height:20px; }
fieldset.inner>div.output div.content td.text span.comment { color:darkgray; } fieldset.inner>div.output div.content td.text span.comment { color:var(--code-comment); }
fieldset.inner>div.output div.content td.text span.keyword { color:darkblue; } fieldset.inner>div.output div.content td.text span.keyword { color:var(--code-keyword); }
fieldset.inner>div.output div.content td.text span.package { color:blue; } fieldset.inner>div.output div.content td.text span.package { color:var(--code-package); }
fieldset.inner>div.output div.content td.text span.datatype { color:cornflowerblue; } fieldset.inner>div.output div.content td.text span.datatype { color:var(--code-datatype); }
fieldset.inner>div.output div.content td.text span.function { color:darkcyan; } fieldset.inner>div.output div.content td.text span.function { color:var(--code-function); }
fieldset.inner>div.output div.content td.text span.constant { color:gray; } fieldset.inner>div.output div.content td.text span.constant { color:var(--code-constant); }
fieldset.inner>div.output div.content td.text span.string { color:brown; } fieldset.inner>div.output div.content td.text span.string { color:var(--code-string); }
fieldset.inner>div.output div.content td.text span.object { color:purple; } fieldset.inner>div.output div.content td.text span.object { color:var(--code-object); }
fieldset.inner>div.output>div.project { width:230px; } fieldset.inner>div.output>div.project { width:230px; }
fieldset.inner>div.output>div.project * { font-family:monospace; font-size:14px; outline:none; } fieldset.inner>div.output>div.project * { font-family:monospace; font-size:14px; outline:none; }
fieldset.inner>div.output>div.project div.action { width:100%; } fieldset.inner>div.output>div.project div.action { width:100%; }
@ -52,13 +52,6 @@ fieldset.inner.cmd>legend { display:none; }
fieldset.inner.cmd>form.option { display:none; } fieldset.inner.cmd>form.option { display:none; }
fieldset.inner.cmd>div.action { display:none; } fieldset.inner.cmd>div.action { display:none; }
fieldset.inner.cmd>div.status { display:none; } fieldset.inner.cmd>div.status { display:none; }
body.dark fieldset.inner>div.output div.content td.text span.comment { color:green; }
body.dark fieldset.inner>div.output div.content td.text span.keyword { color:royalblue; }
body.dark fieldset.inner>div.output div.content td.text span.datatype { color:lavender; }
body.dark fieldset.inner>div.output div.content td.text span.function { color:lightgreen; }
body.dark fieldset.inner>div.output div.content td.text span.constant { color:gray; }
body.dark fieldset.inner>div.output div.content td.text span.string { color:orange; }
body.dark fieldset.inner>div.output div.content td.text span.object { color:silver; }
body.dark fieldset.inner>div.output div.content tr.line:hover { background-color:unset; } body.dark fieldset.inner>div.output div.content tr.line:hover { background-color:unset; }
body.white fieldset.inner.cmd>div.output { background-color:aliceblue; } body.white fieldset.inner.cmd>div.output { background-color:aliceblue; }
body.white fieldset.inner.cmd>div.output div.content { background-color:white; } body.white fieldset.inner.cmd>div.output div.content { background-color:white; }

View File

@ -5,7 +5,7 @@ const VIEW_CREATE = "tabview.view.create", VIEW_REMOVE = "tabview.view.remove",
Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Split(can.Option(nfs.PATH), mdb.FS); can.Option(nfs.PATH, paths[0]) Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Split(can.Option(nfs.PATH), mdb.FS); can.Option(nfs.PATH, paths[0])
switch (can.Mode()) { switch (can.Mode()) {
case "result": msg.result = msg.result||[can._output.innerHTML], can.Mode(chat.SIMPLE) case "result": msg.result = msg.result||[can._output.innerHTML], can.Mode(chat.SIMPLE)
} }
can.core.List(paths.concat(can.core.Split(msg.Option(nfs.REPOS))), function(p) { if (can.base.endWith(p, "-story/", "-dict/")) { return } can.core.List(paths.concat(can.core.Split(msg.Option(nfs.REPOS))), function(p) { if (can.base.endWith(p, "-story/", "-dict/")) { return }
if (p && paths.indexOf(p) == -1 && p[0] != nfs.PS) { paths.push(p) } if (p && paths.indexOf(p) == -1 && p[0] != nfs.PS) { paths.push(p) }
}), can.onmotion.clear(can), can.onappend.style(can, code.INNER), can.sup.onimport._process = function() {} }), can.onmotion.clear(can), can.onappend.style(can, code.INNER), can.sup.onimport._process = function() {}
@ -13,10 +13,11 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Sp
can.ui = can.onappend.layout(can, [html.PROJECT, [html.TABS, nfs.PATH, [html.CONTENT, html.PROFILE], html.DISPLAY, html.PLUG]]) can.ui = can.onappend.layout(can, [html.PROJECT, [html.TABS, nfs.PATH, [html.CONTENT, html.PROFILE], html.DISPLAY, html.PLUG]])
can.ui._content = can.ui.content, can.ui._profile = can.ui.profile, can.ui._display = can.ui.display, can.onmotion.hidden(can, can.ui.plug) can.ui._content = can.ui.content, can.ui._profile = can.ui.profile, can.ui._display = can.ui.display, can.onmotion.hidden(can, can.ui.plug)
can.onmotion.hidden(can, can.ui.profile), can.onmotion.hidden(can, can.ui.display) can.onmotion.hidden(can, can.ui.profile), can.onmotion.hidden(can, can.ui.display)
can.Conf("style") == "output" && can.onmotion.hidden(can, can.ui.project)
can.Conf("style") == "output" && can.page.style(can, can.ui.content, html.HEIGHT, "")
switch (can.Mode()) { switch (can.Mode()) {
case chat.SIMPLE: // no break case chat.SIMPLE: // no break
case chat.FLOAT: can.onmotion.hidden(can, can.ui.project); break case chat.FLOAT: can.onmotion.hidden(can, can.ui.project); break
make
case chat.CMD: can.misc.sessionStorage(can, PROJECT_HIDE) == html.HIDE && can.onmotion.hidden(can, can.ui.project) case chat.CMD: can.misc.sessionStorage(can, PROJECT_HIDE) == html.HIDE && can.onmotion.hidden(can, can.ui.project)
if (can.misc.sessionStorage(can, TABVIEW_HIDE) == html.HIDE) { can.onmotion.hidden(can, can.ui.project), can.onmotion.hidden(can, can.ui.tabs) } if (can.misc.sessionStorage(can, TABVIEW_HIDE) == html.HIDE) { can.onmotion.hidden(can, can.ui.project), can.onmotion.hidden(can, can.ui.tabs) }
can.onappend.style(can, html.OUTPUT) can.onappend.style(can, html.OUTPUT)
@ -213,7 +214,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Sp
can.onimport.tabview(can, item.path, can.base.trimPrefix(item.file, nfs.PWD), parseInt(item.line)); return true can.onimport.tabview(can, item.path, can.base.trimPrefix(item.file, nfs.PWD), parseInt(item.line)); return true
}, can.base.isFunc(cb) && cb(sub) }, can.ui.plug.parentNode, can.ui.plug), can.page.isDisplay(can.ui.plug) || can.onmotion.toggle(can, can.ui.plug, true) && can.onimport.layout(can) }, can.base.isFunc(cb) && cb(sub) }, can.ui.plug.parentNode, can.ui.plug), can.page.isDisplay(can.ui.plug) || can.onmotion.toggle(can, can.ui.plug, true) && can.onimport.layout(can)
}, },
layout: function(can) { if (can.isSimpleMode()) { return can.page.style(can, can.ui.content, html.WIDTH, can.ConfWidth()) } if (can.isCmdMode()) { can.ConfHeight(can.page.height()) } layout: function(can) { if (can.isSimpleMode() || can.Conf("style") == "output") { return can.page.style(can, can.ui.content, html.WIDTH, can.ConfWidth()) } if (can.isCmdMode()) { can.ConfHeight(can.page.height()) }
var content = can.ui.content; if (content._root) { can.ui.content = content._root } can.ui.size = {profile: can._msg.Option(html.WIDTH), display: can._msg.Option(html.HEIGHT)} var content = can.ui.content; if (content._root) { can.ui.content = content._root } can.ui.size = {profile: can._msg.Option(html.WIDTH), display: can._msg.Option(html.HEIGHT)}
can.ui.layout(can.ConfHeight(), can.ConfWidth(), 0, function(height, width) { can.ui.content = content, can.onlayout.layout(can, height, width) can.ui.layout(can.ConfHeight(), can.ConfWidth(), 0, function(height, width) { can.ui.content = content, can.onlayout.layout(can, height, width)
var sub = can.ui.profile._plugin; sub && can.page.isDisplay(can.ui.profile) && sub.onimport.size(sub, can.ui.profile.offsetHeight, can.ui.profileWidth, true) var sub = can.ui.profile._plugin; sub && can.page.isDisplay(can.ui.profile) && sub.onimport.size(sub, can.ui.profile.offsetHeight, can.ui.profileWidth, true)

View File

@ -119,6 +119,7 @@ Volcanos(chat.ONSYNTAX, {
"refer": code.KEYWORD, "brief": code.KEYWORD, "spark": code.KEYWORD, "shell": code.KEYWORD, "parse": code.KEYWORD, "refer": code.KEYWORD, "brief": code.KEYWORD, "spark": code.KEYWORD, "shell": code.KEYWORD, "parse": code.KEYWORD,
"order": code.KEYWORD, "table": code.KEYWORD, "chart": code.KEYWORD, "label": code.KEYWORD, "chain": code.KEYWORD, "sequence": code.KEYWORD, "order": code.KEYWORD, "table": code.KEYWORD, "chart": code.KEYWORD, "label": code.KEYWORD, "chain": code.KEYWORD, "sequence": code.KEYWORD,
"field": code.KEYWORD, "image": code.KEYWORD, "video": code.KEYWORD, "audio": code.KEYWORD, "field": code.KEYWORD, "image": code.KEYWORD, "video": code.KEYWORD, "audio": code.KEYWORD,
"style": code.KEYWORD,
"package": code.KEYWORD, "import": code.KEYWORD, "const": code.KEYWORD, "type": code.KEYWORD, "var": code.KEYWORD, "package": code.KEYWORD, "import": code.KEYWORD, "const": code.KEYWORD, "type": code.KEYWORD, "var": code.KEYWORD,
"if": code.KEYWORD, "else": code.KEYWORD, "if": code.KEYWORD, "else": code.KEYWORD,
@ -248,7 +249,10 @@ Volcanos(chat.ONSYNTAX, {
keyword: { keyword: {
"body": code.KEYWORD, "fieldset": code.KEYWORD, "legend": code.KEYWORD, "form": code.KEYWORD, "input": code.KEYWORD, "select": code.KEYWORD, "textarea": code.KEYWORD, "body": code.KEYWORD, "fieldset": code.KEYWORD, "legend": code.KEYWORD, "form": code.KEYWORD, "input": code.KEYWORD, "select": code.KEYWORD, "textarea": code.KEYWORD,
"table": code.KEYWORD, "thead": code.KEYWORD, "tbody": code.KEYWORD, "tr": code.KEYWORD, "th": code.KEYWORD, "td": code.KEYWORD, "table": code.KEYWORD, "thead": code.KEYWORD, "tbody": code.KEYWORD, "tr": code.KEYWORD, "th": code.KEYWORD, "td": code.KEYWORD,
"h1": code.KEYWORD, "h2": code.KEYWORD, "h3": code.KEYWORD, "a": code.KEYWORD, "h1": code.KEYWORD, "h2": code.KEYWORD, "h3": code.KEYWORD,
"a": code.KEYWORD,
"p": code.KEYWORD,
"ul": code.KEYWORD, "li": code.KEYWORD,
"label": code.KEYWORD, "span": code.KEYWORD, "img": code.KEYWORD, "svg": code.KEYWORD, "div": code.KEYWORD, "label": code.KEYWORD, "span": code.KEYWORD, "img": code.KEYWORD, "svg": code.KEYWORD, "div": code.KEYWORD,
"video": code.KEYWORD, "video": code.KEYWORD,
"hover": code.DATATYPE, "focus": code.DATATYPE, "not": code.DATATYPE, "type": code.FUNCTION, "name": code.FUNCTION, "hover": code.DATATYPE, "focus": code.DATATYPE, "not": code.DATATYPE, "type": code.FUNCTION, "name": code.FUNCTION,
@ -260,6 +264,7 @@ Volcanos(chat.ONSYNTAX, {
"height": code.FUNCTION, "width": code.FUNCTION, "min-width": code.FUNCTION, "max-width": code.FUNCTION, "max-height": code.FUNCTION, "height": code.FUNCTION, "width": code.FUNCTION, "min-width": code.FUNCTION, "max-width": code.FUNCTION, "max-height": code.FUNCTION,
"left": code.FUNCTION, "top": code.FUNCTION, "right": code.FUNCTION, "bottom": code.FUNCTION, "left": code.FUNCTION, "top": code.FUNCTION, "right": code.FUNCTION, "bottom": code.FUNCTION,
"border-radius": code.FUNCTION, "outline": code.FUNCTION, "box-shadow": code.FUNCTION, "border-radius": code.FUNCTION, "outline": code.FUNCTION, "box-shadow": code.FUNCTION,
"justify-content": code.FUNCTION,
"solid": code.CONSTANT, "unset": code.CONSTANT, "solid": code.CONSTANT, "unset": code.CONSTANT,
"block": code.CONSTANT, "none": code.CONSTANT, "hidden": code.CONSTANT, "visible": code.CONSTANT, "auto": code.CONSTANT, "relative": code.CONSTANT, "absolute": code.CONSTANT, "sticky": code.CONSTANT, "fixed": code.CONSTANT, "block": code.CONSTANT, "none": code.CONSTANT, "hidden": code.CONSTANT, "visible": code.CONSTANT, "auto": code.CONSTANT, "relative": code.CONSTANT, "absolute": code.CONSTANT, "sticky": code.CONSTANT, "fixed": code.CONSTANT,

View File

@ -1,9 +1,9 @@
Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear(can) Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear(can), can.Conf("padding", 10)
can.page.Modify(can, target, msg.Result()) can.page.Modify(can, target, msg.Result())
can.page.Select(can, target, wiki.STORY_ITEM, function(target) { var meta = target.dataset||{} can.page.Select(can, target, wiki.STORY_ITEM, function(target) { var meta = target.dataset||{}
can.core.CallFunc([can.onimport, can.onimport[meta.name]? meta.name: meta.type||target.tagName.toLowerCase()], [can, meta, target]) can.core.CallFunc([can.onimport, can.onimport[meta.name]? meta.name: meta.type||target.tagName.toLowerCase()], [can, meta, target])
meta.style && can.page.style(can, target, can.base.Obj(meta.style)) meta.style && can.page.style(can, target, can.base.Obj(meta.style))
}), can.onmotion.delay(can, function() { can.onimport.layout(can) }) }), can.onmotion.delay(can, function() { can.onimport.layout(can) }, 300)
}, },
navmenu: function(can, meta, target) { var nav = can.sup._navmenu navmenu: function(can, meta, target) { var nav = can.sup._navmenu
nav = can.onmotion.clear(can, nav||can.page.insertBefore(can, [wiki.NAVMENU], can._output)), can.sup._navmenu = nav nav = can.onmotion.clear(can, nav||can.page.insertBefore(can, [wiki.NAVMENU], can._output)), can.sup._navmenu = nav
@ -69,10 +69,10 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear(
}) } }) }
}, },
image: function(can, meta, target) { image: function(can, meta, target) {
can.page.style(can, target, html.MAX_HEIGHT, can.base.Min(can.ConfHeight()-20, window.innerHeight/2), html.MAX_WIDTH, can.ConfWidth()-20) can.page.style(can, target, html.MAX_HEIGHT, can.base.Min(can.ConfHeight()-2*can.Conf("padding"), window.innerHeight/2), html.MAX_WIDTH, can.ConfWidth()-2*can.Conf("padding"))
}, },
video: function(can, meta, target) { video: function(can, meta, target) {
can.page.style(can, target, html.MAX_HEIGHT, can.base.Min(can.ConfHeight()-20, window.innerHeight/2), html.MAX_WIDTH, can.ConfWidth()-20) can.page.style(can, target, html.MAX_HEIGHT, can.base.Min(can.ConfHeight()-2*can.Conf("padding"), window.innerHeight/2), html.MAX_WIDTH, can.ConfWidth()-2*can.Conf("padding"))
}, },
audio: function(can, meta, target) {}, audio: function(can, meta, target) {},

View File

@ -59,7 +59,8 @@ Volcanos(chat.ONIMPORT, {
_close: function(can, msg) { return can.user.close() || history.back() }, _close: function(can, msg) { return can.user.close() || history.back() },
size: function(can, height, width, auto, mode) { height -= can.onexport.actionHeight(can)+can.onexport.statusHeight(can) size: function(can, height, width, auto, mode) { height -= can.onexport.actionHeight(can)+can.onexport.statusHeight(can)
auto? can.page.style(can, can._output, html.HEIGHT, "", html.WIDTH, "", html.MAX_HEIGHT, height? can.ConfHeight(height): "", html.MAX_WIDTH, can.ConfWidth(width)): auto? can.page.style(can, can._output, html.HEIGHT, "", html.WIDTH, "", html.MAX_HEIGHT, height? can.ConfHeight(height): "", html.MAX_WIDTH, can.ConfWidth(width)):
can.page.style(can, can._output, html.HEIGHT, can.ConfHeight(height), html.WIDTH, can.ConfWidth(width), html.MAX_HEIGHT, "", html.MAX_WIDTH, "") (can.page.style(can, can._output, html.HEIGHT, can.ConfHeight(height), html.WIDTH, can.ConfWidth(width), html.MAX_HEIGHT, "", html.MAX_WIDTH, ""),
can.page.style(can, can._target, html.WIDTH, can.ConfWidth(width)))
var sub = can.core.Value(can, chat._OUTPUTS_CURRENT); if (!sub) { return can.Mode(mode), auto } sub.ConfHeight(can.ConfHeight()), sub.ConfWidth(can.ConfWidth()) var sub = can.core.Value(can, chat._OUTPUTS_CURRENT); if (!sub) { return can.Mode(mode), auto } sub.ConfHeight(can.ConfHeight()), sub.ConfWidth(can.ConfWidth())
if (mode) { sub.Mode(can.Mode(mode)), sub.onlayout[mode](sub) } else { sub.onlayout._init(sub) } return auto if (mode) { sub.Mode(can.Mode(mode)), sub.onlayout[mode](sub) } else { sub.onlayout._init(sub) } return auto
}, },

View File

@ -18,7 +18,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { can.page.requireDraw(ca
_color: function(can, tree) { return tree.meta.color || (tree.list == 0? cli.PURPLE: cli.YELLOW) }, _color: function(can, tree) { return tree.meta.color || (tree.list == 0? cli.PURPLE: cli.YELLOW) },
layout: function(can) { can.page.ClassList.has(can, can._fields, html.FLOAT) || can.page.style(can, can._output, html.MAX_HEIGHT, "") layout: function(can) { can.page.ClassList.has(can, can._fields, html.FLOAT) || can.page.style(can, can._output, html.MAX_HEIGHT, "")
can.svg && can.svg.Val(svg.FONT_SIZE, can.size = parseInt(can.Action(html.SIZE)||24)), can.margin = parseInt(can.Action(html.MARGIN)||10) can.svg && can.svg.Val(svg.FONT_SIZE, can.size = parseInt(can.Action(html.SIZE)||24)), can.margin = parseInt(can.Action(html.MARGIN)||10)
can.core.CallFunc(can.onaction[can.Action(ice.VIEW)||"横向"], [event, can, can.Action(ice.VIEW)]) can._tree && can.core.CallFunc(can.onaction[can.Action(ice.VIEW)||"横向"], [event, can, can.Action(ice.VIEW)])
}, },
}) })
Volcanos(chat.ONACTION, {list: [[ice.VIEW, "横向", "纵向"], [html.SIZE, 24, 32, 48], [html.MARGIN, 10, 30, 50]], Volcanos(chat.ONACTION, {list: [[ice.VIEW, "横向", "纵向"], [html.SIZE, 24, 32, 48], [html.MARGIN, 10, 30, 50]],

View File

@ -145,10 +145,10 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear(
}, oncontextmenu: function(event) { if (can.base.isFunc(cbs)) { var menu = cbs(event, ui._target); if (menu) { can.user.carteRight(event, can, menu.meta, menu.list, menu) } } }} }, oncontextmenu: function(event) { if (can.base.isFunc(cbs)) { var menu = cbs(event, ui._target); if (menu) { can.user.carteRight(event, can, menu.meta, menu.list, menu) } } }}
}) }], target.nextSibling, target.parentNode) }) }], target.nextSibling, target.parentNode)
}, },
list: function(can, root, cb, target) { target = target||can._output list: function(can, root, cb, target, cbs) { target = target||can._output
can.core.List(root.list, function(item) { var ui = can.page.Append(can, target, [{view: [html.ITEM, html.DIV, item.meta.name], onclick: function(event) { can.core.List(root.list, function(item) { var ui = can.page.Append(can, target, [{view: [html.ITEM, html.DIV, item.meta.name], onclick: function(event) {
can.base.isFunc(cb) && cb(event, item) || can.onmotion.toggle(can, ui.list), can.onmotion.select(can, target, html.DIV_ITEM, event.target) can.base.isFunc(cb) && cb(event, item) || can.onmotion.toggle(can, ui.list), can.onmotion.select(can, target, html.DIV_ITEM, event.target)
}}, {view: html.LIST}]); can.onimport.list(can, item, cb, ui.list) }) }, _init: function(target) { cbs && cbs(target, item) }}, {view: html.LIST}]); can.onimport.list(can, item, cb, ui.list, cbs) })
}, },
}) })
Volcanos(chat.ONLAYOUT, { Volcanos(chat.ONLAYOUT, {

View File

@ -96,6 +96,7 @@ var web = {CHAT: "chat",
CHAT_MACOS_DESKTOP: "web.chat.macos.desktop", CHAT_MACOS_SESSION: "web.chat.macos.session", CHAT_MACOS_DESKTOP: "web.chat.macos.desktop", CHAT_MACOS_SESSION: "web.chat.macos.session",
CHAT_IFRAME: "web.chat.iframe", CHAT_FAVOR: "web.chat.favor", CHAT_IFRAME: "web.chat.iframe", CHAT_FAVOR: "web.chat.favor",
TEAM_PLAN: "web.team.plan", TEAM_PLAN: "web.team.plan",
WIKI_PORTAL: "web.wiki.portal",
} }
var aaa = { var aaa = {
LOGIN: "login", LOGOUT: "logout", INVITE: "invite", TOKEN: "token", LOGIN: "login", LOGOUT: "logout", INVITE: "invite", TOKEN: "token",
@ -131,6 +132,7 @@ var nfs = {
DF: ice.DF, PS: ice.PS, PT: ice.PT, DF: ice.DF, PS: ice.PS, PT: ice.PT,
PWD: "./", SRC: "src/", USR: "usr/", PWD: "./", SRC: "src/", USR: "usr/",
PACK: "pack", PACK: "pack",
SRC_DOCUMENT: "src/document/",
IMAGE_PNG: "image/png", IMAGE_PNG: "image/png",
IMAGE_JPEG: "image/jpeg", IMAGE_JPEG: "image/jpeg",
@ -236,7 +238,7 @@ var html = {PLUGIN_MARGIN: 10, ACTION_HEIGHT: 32, ACTION_MARGIN: 200,
BODY: "body", FORM: "form", SELECT: "select", INPUT: "input", TEXT: "text", FILE: "file", BUTTON: "button", TEXTAREA: "textarea", BODY: "body", FORM: "form", SELECT: "select", INPUT: "input", TEXT: "text", FILE: "file", BUTTON: "button", TEXTAREA: "textarea",
CLICK: "click", CANCEL: "cancel", SUBMIT: "submit", UPLOAD: "upload", USERNAME: "username", PASSWORD: "password", CLICK: "click", CANCEL: "cancel", SUBMIT: "submit", UPLOAD: "upload", USERNAME: "username", PASSWORD: "password",
TABLE: "table", THEAD: "thead", TBODY: "tbody", TR: "tr", TH: "th", TD: "td", BR: "br", UL: "ul", LI: "li", BR: "br", HR: "hr", TABLE: "table", THEAD: "thead", TBODY: "tbody", TR: "tr", TH: "th", TD: "td", BR: "br", UL: "ul", LI: "li", BR: "br", HR: "hr",
H1: "h1", H2: "h2", H3: "h3", A: "a", LABEL: "label", INNER: "inner", TITLE: "title", H1: "h1", H2: "h2", H3: "h3", A: "a", LABEL: "label", INNER: "inner", TITLE: "title", SPACE: "space",
SPAN: "span", CODE: "code", DIV: "div", IMG: "img", VIDEO: "video", WSS: "wss", SVG: "svg", CANVAS: "canvas", IFRAME: "iframe", SPAN: "span", CODE: "code", DIV: "div", IMG: "img", VIDEO: "video", WSS: "wss", SVG: "svg", CANVAS: "canvas", IFRAME: "iframe",
WEBVIEW: "webview", CHROME: "chrome", MOBILE: "mobile", LANDSCAPE: "landscape", WEBVIEW: "webview", CHROME: "chrome", MOBILE: "mobile", LANDSCAPE: "landscape",
@ -292,12 +294,12 @@ var Volcanos = shy({iceberg: "/chat/", volcano: "/frame.js", cache: {}, pack: {}
var meta = arguments.callee.meta, list = arguments.callee.list; if (typeof name == lang.OBJECT) { var meta = arguments.callee.meta, list = arguments.callee.list; if (typeof name == lang.OBJECT) {
if (name.length > 0) { return Volcanos({panels: [{name: chat.HEADER, style: html.HIDE, state: [mdb.TIME, aaa.USERNICK]}, {name: chat.ACTION, style: html.MAIN, tool: name}, {name: chat.FOOTER, style: html.HIDE}]}) } if (name.length > 0) { return Volcanos({panels: [{name: chat.HEADER, style: html.HIDE, state: [mdb.TIME, aaa.USERNICK]}, {name: chat.ACTION, style: html.MAIN, tool: name}, {name: chat.FOOTER, style: html.HIDE}]}) }
var Config = name; name = Config.name||ice.CAN, _can_name = "" var Config = name; name = Config.name||ice.CAN, _can_name = ""
meta.iceberg = Config.iceberg||meta.iceberg, meta.libs = Config.libs||chat.libs, panels = Config.panels||chat.panel_list, delete(Config.panels) meta.iceberg = Config.iceberg||meta.iceberg, meta.libs = (Config.libs||chat.libs).concat(Config.list), panels = Config.panels||chat.panel_list, delete(Config.panels)
libs = [], panels.forEach(function(p) { p && (libs = libs.concat(p.list = p.list||["/panel/"+p.name+nfs._JS, "/panel/"+p.name+nfs._CSS])) }), libs = libs.concat(Config.plugin||chat.plugin_list) libs = [], panels.forEach(function(p) { p && (libs = libs.concat(p.list = p.list||["/panel/"+p.name+nfs._JS, "/panel/"+p.name+nfs._CSS])) }), libs = libs.concat(Config.plugin||chat.plugin_list)
cb = can||function(can) { can.onengine._init(can, can.Conf(Config), panels, Config._init||meta._init, can._target) } cb = can||function(can) { can.onengine._init(can, can.Conf(Config), panels, Config._init||meta._init, can._target) }
can = Config, can._follow = name, can._target = Config.target||meta.target, can._height = Config.height||meta._height, can._width = Config.width||meta._width can = Config, can._follow = name, can._target = Config.target||meta.target, can._height = Config.height||meta._height, can._width = Config.width||meta._width
} }
can = kit.proto(can||{}, kit.proto({_name: name, _load: function(name, cbs) { var cache = meta.cache[name]||[] can = kit.proto(can||{}, kit.proto({_name: name, _path: _can_name, _load: function(name, cbs) { var cache = meta.cache[name]||[]
for (list.reverse(); list.length > 0; list) { var sub = list.pop(); sub != can && cache.push(sub), sub._path = sub._path||name } meta.cache[name] = cache for (list.reverse(); list.length > 0; list) { var sub = list.pop(); sub != can && cache.push(sub), sub._path = sub._path||name } meta.cache[name] = cache
cache.forEach(function(sub) { var name = sub._name; if (typeof cbs == lang.FUNCTION && cbs(can, name, sub)) { return } cache.forEach(function(sub) { var name = sub._name; if (typeof cbs == lang.FUNCTION && cbs(can, name, sub)) { return }
can[name] = can[name]||{}; for (var k in sub) { can[name].hasOwnProperty(k) || sub.hasOwnProperty(k) && (can[name][k] = sub[k]) } can[name] = can[name]||{}; for (var k in sub) { can[name].hasOwnProperty(k) || sub.hasOwnProperty(k) && (can[name][k] = sub[k]) }

View File

@ -1,211 +1,167 @@
html, body {
--body-bg-color:white;
--body-fg-color:black;
--legend-bg-color:lightsteelblue;
--input-bg-color:white;
--input-fg-color:var(--body-fg-color);
--input-radius:5px;
--input-border:blue solid 1px;
--output-bg-color:var(--input-bg-color);
--status-border:transparent solid 1px;
--plugin-radius:10px;
--plugin-bg-color:aliceblue;
--plugin-fg-color:var(--body-fg-color);
--panel-output-bg-color:var(--body-bg-color);
--panel-output-fg-color:#d0d3da;
--panel-input-bg-color:#6b7488;
--panel-input-fg-color:white;
--panel-hover-bg-color:#2b3446;
--panel-hover-fg-color:white;
--panel-bg-color:var(--panel-output-bg-color);
--panel-fg-color:var(--panel-output-fg-color);
--float-fg-color:var(--plugin-fg-color);
--float-bg-color:var(--plugin-bg-color);
--carte-bg-color:var(--plugin-bg-color);
--hover-bg-color:var(--input-bg-color);
--hover-fg-color:var(--input-fg-color);
--th-fg-color:black;
--th-bg-color:var(--plugin-bg-color);
--td-hover-bg-color:var(--plugin-bg-color);
--tr-hover-bg-color:var(--plugin-bg-color);
}
@media (prefers-color-scheme: dark) {
html, body {
--body-bg-color:black;
--body-fg-color:silver;
--legend-bg-color:#212121;
--input-bg-color:#232526;
--input-fg-color:var(--body-fg-color);
--input-radius:5px;
--input-border:blue solid 1px;
--output-bg-color:var(--input-bg-color);
--status-border:gray solid 1px;
--plugin-radius:var(--input-radius);
--plugin-bg-color:var(--body-bg-color);
--plugin-fg-color:var(--body-fg-color);
--panel-output-bg-color:var(--body-bg-color);
--panel-output-fg-color:var(--body-fg-color);
--panel-bg-color:var(--panel-output-bg-color);
--panel-fg-color:var(--panel-output-fg-color);
--float-fg-color:var(--plugin-fg-color);
--float-bg-color:var(--plugin-bg-color);
--carte-bg-color:var(--plugin-bg-color);
--hover-bg-color:var(--input-bg-color);
--hover-fg-color:white;
--th-bg-color:var(--plugin-bg-color);
--td-hover-bg-color:var(--plugin-bg-color);
--tr-hover-bg-color:var(--plugin-bg-color);
}
}
fieldset.contexts { fieldset.contexts {
color:white; background-color:var(--plugin-bg-color); color:var(--plugin-fg-color); border-radius:var(--plugin-radius);
position:fixed; padding:0; border:0; margin:0; position:fixed; top:400px; left:400px; z-index:100;
background:radial-gradient(black, #00000073);
top:100px;
left:100px;
z-index:10;
} }
fieldset.contexts legend { fieldset.contexts * { padding:0; border:0; margin:0; }
text-align:left; fieldset.contexts legend { font-size:1.2rem; line-height:30px; padding:0 10px; height:32px; float:left; }
cursor:pointer; fieldset.contexts select.hide { display:none; }
fieldset.contexts input { background-color:var(--input-bg-color); color:var(--input-fg-color); font-size:1rem; padding:0 20px; height:32px; min-width:80px; outline:none; }
fieldset.contexts form.option>div.item { float:left; margin-right:10px; height:32px; }
fieldset.contexts div.action>div.item { float:left; margin-right:10px; height:32px; }
fieldset.contexts div.status>div.item { float:left; padding:5px; height:31px; }
fieldset.contexts div.status>div.item>label { font-size:0.6rem; }
fieldset.contexts div.output { background-color:var(--output-bg-color); overflow:auto; clear:both; }
fieldset.auto, fieldset.full, fieldset.float, body>div.float { position:fixed; z-index:100; }
background:radial-gradient(black, #00000073); body>div.carte { padding:0; }
} body>div.carte input[name=filter] { margin:5px; width:calc(100% - 10px); position:sticky; top:5px; }
fieldset.contexts form.option div.item { body>div.carte div.item { text-align:center; white-space:pre; padding:5px 10px; }
float:left; margin-right:3px; body>div.carte div.item span.icon.next { float:right; }
min-height:25px; vertical-align:middle; body>div.carte div.item { background-color:var(--carte-bg-color); }
} body>div.carte div.item:hover { background-color:var(--hover-bg-color); }
fieldset.contexts div.output {
clear:both;
overflow:auto;
}
fieldset.contexts div.status div.item {
float:left; padding:4px;
height:18px;
}
fieldset.contexts div.status div.item>label {
font-size:10px;
/* color:#504242e0; */
}
fieldset.contexts select { /* icon */
height:25px; font-size:14px; fieldset.contexts form.option>div.icon { font-size:26px; line-height:28px; padding:0 5px; height:32px; margin:0; }
box-shadow:4px 4px 10px 1px #626bd0; fieldset.contexts form.option>div.item.icons>span.icon { font-size:26px; line-height:28px; padding:0 5px; height:32px; }
background-color:black; color:cyan; fieldset.contexts form.option>div.item.icons>span.icon.create { line-height:30px; }
padding:0 10px; fieldset.contexts div.action>div.item.icons>span.icon { font-size:26px; line-height:28px; padding:0 5px; height:32px; }
cursor:pointer; fieldset.contexts div.action>div.item.icons>span.icon.create { line-height:30px; }
} fieldset.contexts form.option>div.icon:first-child { margin-left:-5px; }
fieldset.contexts option { fieldset.contexts form.option>div.icon.refresh { line-height:26px; }
font-family:monospace; fieldset.contexts form.option>div.icon.goback { line-height:26px; }
} fieldset.contexts form.option>div.icon.delete { font-size:18px; margin-left:5px; margin-right:0px; }
fieldset.contexts textarea { fieldset.contexts form.option>div.icon.next { font-size:18px; }
width:400px; height:60px; fieldset.contexts form.option>div.icon.prev { font-size:18px; }
background-color:cyan; fieldset.contexts form.option>div.item.text>span.icon { margin-left:-20px; margin-right:3px; }
} fieldset.contexts form.option>div.item.select>span.icon { margin-left:-15px; margin-right:3px; visibility:hidden; }
fieldset.contexts input[type=button] { fieldset.contexts form.option>div.item.select:hover>span.icon { visibility:visible; }
background-color:black; color:cyan; fieldset.contexts div.item.text>span.icon.delete { font-size:20px; visibility:hidden; }
letter-spacing:4px; fieldset.contexts div.item.text:hover>span.icon.delete { visibility:visible; }
padding-left:10px; fieldset.contexts form.option>div.button.icons { display:none; }
cursor:pointer; fieldset.contexts div.action>div.button.icons { display:none; }
font-family:monospace;
}
fieldset.contexts input[type=button]:hover {
background-color:gray; color:cyan;
}
fieldset.contexts input[type=text] {
width:82px; height:21px; font-size:16px;
box-shadow:4px 4px 10px 1px #626bd0;
background-color:cyan; color:black;
padding:0 4px;
}
fieldset.contexts input[type=text]:hover {
background-color:white;
}
fieldset.contexts table.content a {
color:white;
}
fieldset.contexts table.content {
color:white;
}
fieldset.contexts div.code {
background-color:#343a3445; color:white;
font-size:14px; font-family:monospace;
box-shadow:4px 4px 20px 4px #626bd0;
padding:10px; border:solid 3px green;
text-align:left; white-space:pre;
overflow:auto;
clear:both;
}
div.input.contexts input {
color:black;
}
table.content { /* https://redis.io/ */
border:0; white-space:pre; html, body.antialiased, main { background-color:var(--body-bg-color); color:var(--body-fg-color); }
font-size:14px; font-family:monospace; main>div>nav>div.absolute { background:var(--body-bg-color); color:var(--body-fg-color); }
text-align:left; section.prose *:not(a):not(pre):not(code) { color:var(--body-fg-color); border-left-color:gray; }
overflow:auto; main>div>nav span { background:var(--body-bg-color); color:var(--body-fg-color); }
} main>section>div.w-52.z-40.hidden.overflow-auto.fixed { background-color:var(--body-bg-color); color:var(--body-fg-color); }
table.content tr { main>section>div.w-52.z-40.hidden.overflow-auto.fixed nav { background-color:var(--body-bg-color); color:var(--body-fg-color); }
background-color:#04272f45; @media (prefers-color-scheme: dark) { section.prose code { color:var(--body-fg-color); font-style:italic; } }
}
table.content tr.select {
background-color:green;
}
table.content tr:hover {
background-color:green;
}
table.content th {
background-color:#0fbd45;
padding:2px 6px;
cursor:pointer;
}
table.content th:hover {
background-color:red;
}
table.content td {
padding:2px 6px;
overflow:auto;
}
table.content td.done {
background-color:green;
}
table.content td.select {
background-color:red;
}
table.content td:hover {
background-color:red;
}
body>div.toast { /* https://blog.csdn.net/ */
background:#0e3369b3; color:yellow; body { background-color:var(--body-bg-color); color:var(--body-fg-color); }
position:fixed; body div .toolbar-container { background-color:var(--body-bg-color); color:var(--body-fg-color); }
padding:5px; overflow:auto; body div.main_father { background-color:var(--body-bg-color); color:var(--body-fg-color); }
z-index:10; body div aside.blog_container_aside * { background-color:var(--body-bg-color); color:var(--body-fg-color); }
} body div aside div.aside-box h3.aside-title { background-color:var(--body-bg-color); color:var(--body-fg-color); }
body>div.toast a { body div aside div.aside-box { background-color:var(--body-bg-color); color:var(--body-fg-color); }
color:yellow; body div aside div.aside-box div.aside-content { background-color:var(--body-bg-color); color:var(--body-fg-color); }
} .nodata .recommend-right_aside .kind_person .aside-content ul { background-color:var(--body-bg-color); color:var(--body-fg-color); }
body>div.toast div.title { body main div.blog-content-box .article-header-box { background-color:var(--body-bg-color); color:var(--body-fg-color); }
float:left; word-break:break-all; body .groupfile .pos-box .scroll-box .toc-box >ol li.active { background-color:var(--body-bg-color); color:var(--body-fg-color); }
color:#cae850; font-size:14px; body div main * { background-color:var(--body-bg-color); color:var(--body-fg-color); }
cursor:copy; body div main div.blog-content-box { background-color:var(--body-bg-color); color:var(--body-fg-color); }
} body div .programmer1Box { display:none; }
body>div.toast div.duration {
color:gray; font-size:14px;
float:right;
cursor:pointer;
}
body>div.toast div.content {
text-align:center;
white-space:pre;
clear:both;
}
body>div.toast div.action div.item {
float:left;
}
body>div.toast div.progress {
height:10px; border:solid 2px green;
margin-left:-2px;
clear:both;
}
body>div.toast div.progress div.current {
height:10px; background:red;
}
body>div.carte { /* https://zhuanlan.zhihu.com/ */
position:fixed; body div .Post-content { background-color:var(--body-bg-color); color:var(--body-fg-color); }
background:#295b61; body div .ColumnPageHeader { background-color:var(--body-bg-color); color:var(--body-fg-color); }
color:white; body div .ContentItem-actions { background-color:var(--body-bg-color); color:var(--body-fg-color); }
padding:4px; body #blogColumnPayAdvert .column-group-item, body #blogHuaweiyunAdvert .column-group-item { background-color:var(--body-bg-color); color:var(--body-fg-color); }
min-width:80px; body div .markdown_views blockquote { background-color:var(--body-bg-color); color:var(--body-fg-color); }
z-index:10; body main div.blog-content-box .article-header-box .article-header div.article-title-box .title-article { background-color:var(--body-bg-color); color:var(--body-fg-color); }
} body main div .markdown_views * { background-color:var(--body-bg-color); color:var(--body-fg-color); }
body>div.carte div.item { body .more-toolbox-new .left-toolbox { display:none; }
padding:3px 12px; body .csdn-side-toolbar { display:none; }
} body #footerRightAds { display:none; }
body>div.carte div.item:hover { body div.box-shadow.mb8 { display:none; }
background:red;
} /* https://cn.bing.com/ */
body>div.input { body header#b_header { background-color:var(--body-bg-color); color:var(--body-fg-color); }
position:fixed; body div #b_results .b_algo.b_rc_gb_template.b_algoBorder { background:var(--body-bg-color); color:var(--body-fg-color); }
background-color:#0d4142a6; body div .b_rc_gb_text_cell_wrapper>div:last-child { background:var(--body-bg-color); color:var(--body-fg-color); }
z-index:10; body div #b_results>.b_algo { background-color:var(--body-bg-color); color:var(--body-fg-color); }
} body div #b_results .b_ans.b_nwsAns { background-color:var(--body-bg-color); color:var(--body-fg-color); }
body>div.input input[type=text] { body div #b_results .b_algoBigWiki .b_widgetContainer, body div #b_results .b_rc_gb_template .b_widgetContainer { background-color:var(--body-bg-color); color:var(--body-fg-color); }
width:171px; body div .b_rc_gb_w_content { background-color:var(--body-bg-color); color:var(--body-fg-color); }
} body .b_searchboxForm { background-color:var(--body-bg-color); color:var(--body-fg-color); }
body>div.input input[name=username] { body #b_header .b_searchbox { background-color:var(--body-bg-color); color:var(--body-fg-color); }
width:171px; body #sw_as .sa_drw .sa_sg { background-color:var(--body-bg-color); color:var(--body-fg-color); }
} body #b_results .b_rc_gb_sub .b_paractl { background-color:var(--body-bg-color); color:var(--body-fg-color); }
body>div.input input[name=password] {
width:171px; /* https://juejin.cn/ */
} body div#juejin div.view-container { background-color:var(--body-bg-color); color:var(--body-fg-color); }
body>div.input textarea { body div#juejin div.main-header-box header { background-color:var(--body-bg-color); color:var(--body-fg-color); }
box-shadow:4px 4px 10px 1px #626bd0; body div#juejin article { background-color:var(--body-bg-color); color:var(--body-fg-color); }
border:2px inset #14a58e; body div#juejin .article-suspended-panel { display:none; }
width:171px; height:60px; body div#juejin .markdown-body blockquote { background-color:var(--body-bg-color); color:var(--body-fg-color); }
background-color:cyan; body div#juejin .sidebar .sidebar-block { background-color:var(--body-bg-color); color:var(--body-fg-color); }
padding:4px;
}
body>div.input div.item {
float:left;
}
body>div.input.login {
padding:10px;
}
body>div.input.login input {
font-size:18px;
}
div.input input[type=button] {
background-color:black; color:cyan;
letter-spacing:4px;
padding-left:10px;
cursor:pointer;
font-family:monospace;
}
div.input input[type=button]:hover {
background-color:gray; color:cyan;
}

View File

@ -37,7 +37,10 @@ setTimeout(function() { Volcanos({
msg.Push(mdb.TYPE, html.IFRAME) msg.Push(mdb.TYPE, html.IFRAME)
msg.Push(mdb.NAME, "") msg.Push(mdb.NAME, "")
msg.Push(mdb.LINK, target.src) msg.Push(mdb.LINK, target.src)
can.spide(can, msg, target.contentWindow.document.body) try {
can.spide(can, msg, target.contentWindow.document.body)
} catch(e) {
}
}) })
can.page.Select(can, target, html.A, function(target) { can.page.Select(can, target, html.A, function(target) {
msg.Push(mdb.TYPE, html.A) msg.Push(mdb.TYPE, html.A)
@ -46,17 +49,25 @@ setTimeout(function() { Volcanos({
}) })
}, },
style: function(can, msg, arg) { style: function(can, msg, arg) {
can.core.List(arg[0].split(mdb.FS), function(item) { if (arg[0] == "style") {
can.page.Select(can, document.body, item, function(target) { can.page.AppendStyle(can, arg[1])
can.page.Modify(can, target, can.base.Obj(arg[1])) } else {
}) can.core.List(arg[0].split(mdb.FS), function(item) {
}) can.page.Select(can, document.body, item, function(target) {
can.page.Modify(can, target, can.base.Obj(arg[1]))
})
})
}
}, },
field: function(can, msg, arg) { field: function(can, msg, arg) {
can.onappend.plugin(can, {type: chat.CONTEXTS, index: arg[0], args: can.base.Obj(arg[1])}, function(sub, meta) { can.onappend.plugin(can, {type: chat.CONTEXTS, index: arg[0], args: can.base.Obj(arg[1])}, function(sub, meta) {
var height = can.base.Max(window.innerHeight-sub._target.offsetTop-2*html.ACTION_HEIGHT, 200)
var width = can.base.Max(window.innerWidth-sub._target.offsetLeft, 800)
sub.Conf({height: height, width: width}), sub._legend.innerText = meta.help
sub.run = function(event, cmds, cb) { msg.RunAction(event, can, cmds) || can.runActionCommand(event, meta.index, cmds, function(msg) { sub.run = function(event, cmds, cb) { msg.RunAction(event, can, cmds) || can.runActionCommand(event, meta.index, cmds, function(msg) {
can.onmotion.toggle(can, sub._option, true), can.onmotion.toggle(can, sub._action, true), can.onmotion.toggle(can, sub._output, true), can.onmotion.toggle(can, sub._status, true) can.onmotion.toggle(can, sub._option, true), can.onmotion.toggle(can, sub._action, true), can.onmotion.toggle(can, sub._output, true), can.onmotion.toggle(can, sub._status, true)
can.page.style(can, sub._output, html.MAX_HEIGHT, window.innerHeight-sub._target.offsetTop-2*html.ACTION_HEIGHT, html.MAX_WIDTH, window.innerWidth-sub._target.offsetLeft) can.page.style(can, sub._output, html.MAX_HEIGHT, height, html.MAX_WIDTH, width)
can.page.style(can, sub._target, html.LEFT, window.innerWidth-width, html.TOP, window.innerHeight-height-2*html.ACTION_HEIGHT)
can.base.isFunc(cb) && cb(msg) can.base.isFunc(cb) && cb(msg)
}) } }) }
sub._target.onclick = function() { sub._target.onclick = function() {
@ -92,6 +103,15 @@ setTimeout(function() { Volcanos({
can.runAction({}, ctx.COMMAND, [], function(msg) { msg.result && msg.result[0] && can.field(can, msg, msg.result) }) can.runAction({}, ctx.COMMAND, [], function(msg) { msg.result && msg.result[0] && can.field(can, msg, msg.result) })
}, },
}, function(can) { }, function(can) {
can.page.theme(function(theme) {
if (theme == html.LIGHT) {
can.page.ClassList.add(can, document.body, html.LIGHT)
can.page.ClassList.del(can, document.body, html.DARK)
} else {
can.page.ClassList.add(can, document.body, html.DARK)
can.page.ClassList.del(can, document.body, html.LIGHT)
}
})
can.run = function(event, cmds, cb) { if (cmds[0] == "_search") { return } can.run = function(event, cmds, cb) { if (cmds[0] == "_search") { return }
var msg = can.request(event, {domain: location.host}); msg.detail = ["page"].concat(cmds) var msg = can.request(event, {domain: location.host}); msg.detail = ["page"].concat(cmds)
chrome.runtime.sendMessage(msg, function(res) { can.base.isFunc(cb) && cb(msg.Copy(res)) }) chrome.runtime.sendMessage(msg, function(res) { can.base.isFunc(cb) && cb(msg.Copy(res)) })

View File

@ -2,7 +2,8 @@
<html> <html>
<head><meta charset="utf-8"></head> <head><meta charset="utf-8"></head>
<body> <body>
<script src="/page/can.js"></script> <script src="/proto.js"></script>
<script src="/page/cache.js"></script>
<script src="/publish/chrome/daemon.js"></script> <script src="/publish/chrome/daemon.js"></script>
</body> </body>
</html> </html>

View File

@ -46,7 +46,7 @@ Volcanos({
}}) }})
}, },
}, function(can) { }, function(can) {
can.run = function(event, cmds, cb) { can.misc.Run(event, can, {names: "http://localhost:9020/code/chrome/"+cmds[0]}, cmds.slice(1), cb) } can.run = function(event, cmds, cb) { can.misc.Run(event, can, {names: "http://localhost:9020/code/chrome/"+cmds[0]+"/"}, cmds.slice(1), cb) }
can._motion(can), can._daemon(can) can._motion(can), can._daemon(can)
}) })

View File

@ -1,9 +1,11 @@
<!DOCTYPE html> <!DOCTYPE html>
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<link rel="stylesheet" href="/page/can.css"> <link rel="stylesheet" href="/index.css">
<link rel="stylesheet" href="/page/cache.css">
</head> </head>
<body style="width:800px; height:600px; overflow:auto"> <body style="width:800px; height:600px; overflow:auto">
<script src="/page/can.js"></script> <script src="/proto.js"></script>
<script src="/page/cache.js"></script>
<script src="/publish/chrome/popup.js"></script> <script src="/publish/chrome/popup.js"></script>
</body> </body>

View File

@ -1,15 +1,7 @@
Volcanos({name: "popup", iceberg: "http://localhost:9020/chat/", river: { Volcanos({name: "popup", iceberg: "http://localhost:9020/chat/", river: {
product: {name: "产品群", storm: { product: {name: "产品群", icon: "bi bi-bar-chart-line-fill", storm: {
office: {name: "办公 office", list: [ office: {name: "办公 office", icon: "bi bi-bar-chart-line-fill", index: ["web.chat.macos.desktop", "web.wiki.feel", "web.wiki.draw", "web.wiki.data"]},
{name: "feel", help: "影音媒体", index: "web.wiki.feel"}, chrome: {name: "爬虫 chrome", icon: "bi-browser-chrome", list: [
{name: "draw", help: "思维导图", index: "web.wiki.draw"},
{name: "data", help: "数据表格", index: "web.wiki.data"},
{name: "plan", help: "计划任务", index: "web.team.plan"},
{name: "think", help: "智库", index: "web.wiki.word", args: ["usr/learning/"]},
{name: "index", help: "索引", index: "web.wiki.word", args: ["usr/learning/index.shy"]},
{name: "context", help: "编程", index: "web.wiki.word", args: ["src/main.shy"]},
]},
chrome: {name: "爬虫 chrome", list: [
{name: "feel", help: "网页爬虫", index: "web.wiki.feel", args: ["spide/"], feature: { {name: "feel", help: "网页爬虫", index: "web.wiki.feel", args: ["spide/"], feature: {
display: "/plugin/local/wiki/feel.js", display: "/plugin/local/wiki/feel.js",
height: 200, limit: 3, height: 200, limit: 3,
@ -18,15 +10,9 @@ Volcanos({name: "popup", iceberg: "http://localhost:9020/chat/", river: {
{name: "spided", help: "网页爬虫", index: "web.code.chrome.spide", args: location && location.protocol && location.protocol=="chrome-extension:"? ["1", "", "spide"]: ["1"]}, {name: "spided", help: "网页爬虫", index: "web.code.chrome.spide", args: location && location.protocol && location.protocol=="chrome-extension:"? ["1", "", "spide"]: ["1"]},
]}, ]},
}}, }},
project: {name: "研发群", storm: { project: {name: "研发群", icon: "bi bi-git", storm: {
studio: {name: "研发 studio", list: [ studio: {name: "研发 studio", icon: "bi bi-git", index: ["web.code.vimer", "web.code.git.status", "web.chat.favor", "web.team.plan", "web.wiki.word"]},
{name: "vimer", help: "编辑器", index: "web.code.vimer", args: ["src/,usr/volcanos/,usr/icebergs/,usr/toolkits/", "main.go"]}, chrome: {name: "网页 chrome", icon: "bi-browser-chrome", index: [
{name: "repos", help: "代码库", index: "web.code.git.status"},
{name: "favor", help: "收藏夹", index: "web.chat.favor"},
{name: "plan", help: "任务表", index: "web.team.plan"},
{name: "ctx", help: "上下文", index: "web.wiki.word"},
]},
chrome: {name: "网页 chrome", index: [
"web.code.chrome.chrome", "web.code.chrome.chrome",
"web.code.chrome.daemon", "web.code.chrome.daemon",
"web.code.chrome.spide", "web.code.chrome.spide",
@ -35,48 +21,13 @@ Volcanos({name: "popup", iceberg: "http://localhost:9020/chat/", river: {
"web.code.chrome.field", "web.code.chrome.field",
]}, ]},
}}, }},
profile: {name: "测试群", storm: { profile: {name: "测试群", icon: "bi bi-list-columns", type: aaa.TECH, storm: {
release: {name: "发布 release", index: [ release: {name: "发布 release", icon: "bi bi-list-check", index: ["web.code.compile", "web.code.publish", "web.code.pprof", "web.code.bench", "web.dream", "web.space", "web.code.git.service", "web.code.git.status"]},
"web.code.webpack",
"web.code.compile",
"web.code.publish",
"web.code.docker.client",
"web.space",
"web.dream",
"web.code.git.server",
"web.code.git.status",
]},
toolkit: {name: "工具 toolkit", index: [
"web.code.favor",
"web.code.xterm",
"web.code.inner",
"web.code.vimer",
"web.code.bench",
"web.code.pprof",
"web.code.oauth",
]},
language: {name: "语言 language", index: [
"web.code.c",
"web.code.sh",
"web.code.py",
"web.code.shy",
"web.code.js",
"web.code.go",
]},
}}, }},
operate: {name: "运维群", storm: { operate: {name: "运维群", icon: "bi bi-gear", type: aaa.TECH, storm: {
aaa: {name: "权限 aaa", index: [ web: {name: "应用 web", icon: "bi bi-browser-chrome", index: ["broad", "serve", "space", "dream", "share"]},
"offer", "email", "user", "totp", "sess", "role", aaa: {name: "权限 aaa", icon: "bi bi-people-fill", index: ["offer", "email", "user", "totp", "sess", "role"]},
]}, cli: {name: "系统 cli", icon: "bi bi-windows", index: ["qrcode", "daemon", "runtime", "cli.procstat", "cli.procinfo", "mirrors", "signal", "timer", "routine", "log.debug"]},
web: {name: "应用 web", index: [ nfs: {name: "文件 nfs", icon: "bi bi-server", index: ["dir", "cat", "tar", "pack", "tail", "trash", "server", "host", "port"]},
"broad", "serve", "space", "dream", "share", "cache", "spide",
]},
cli: {name: "系统 cli", index: [
"qrcode", "daemon", "system", "runtime", "mirrors", "forever", "host", "port",
]},
nfs: {name: "文件 nfs", index: [
"cat", "dir", "pack", "tail", "trash",
]},
}}, }},
}}) }}) // https://icons.getbootstrap.com/