From 98be025830af5c19cb0cf6c09f454f738e1ffc0a Mon Sep 17 00:00:00 2001 From: shylinux Date: Wed, 28 Jun 2023 21:55:06 +0800 Subject: [PATCH] add portal --- frame.js | 7 +- index.css | 101 +++++---- lib/page.js | 17 +- lib/user.js | 7 +- manifest.json | 6 +- panel/action.js | 2 +- panel/footer.js | 2 +- panel/header.js | 10 +- panel/river.js | 15 +- plugin/local/code/inner.css | 23 +- plugin/local/code/inner.js | 7 +- plugin/local/code/inner/syntax.js | 7 +- plugin/local/wiki/word.js | 8 +- plugin/state.js | 3 +- plugin/story/spide.js | 2 +- plugin/table.js | 4 +- proto.js | 8 +- publish/chrome/contexts.css | 362 +++++++++++++----------------- publish/chrome/contexts.js | 34 ++- publish/chrome/daemon.html | 3 +- publish/chrome/daemon.js | 2 +- publish/chrome/popup.html | 6 +- publish/chrome/popup.js | 77 ++----- 23 files changed, 338 insertions(+), 375 deletions(-) diff --git a/frame.js b/frame.js index b70408a0..04de5280 100644 --- a/frame.js +++ b/frame.js @@ -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 output = can.page.SelectOne(can, field, html.DIV_OUTPUT) 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, _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 } @@ -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)) 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 } - 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 }, _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||{} 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]+")" - 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]) } 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") } } 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]) }) } } - 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) } item.style && can.onappend.style(can, item.style, target) }}])[item.name]; return _input diff --git a/index.css b/index.css index 62f3b653..bb61c7d0 100644 --- a/index.css +++ b/index.css @@ -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.size { text-align:center; } /* 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; } 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; } @@ -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.cmd>div.action>div.button.icons>input { display:none; } 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>form.option>div.text>input { 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>div.action { 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, 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; } 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; } 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.plug { position:absolute; bottom:0; right:0; } fieldset.full { position:fixed; left:0; top:0; } @@ -214,51 +216,60 @@ body { --danger-bg-color:red; --danger-fg-color:white; --create-bg-color:blue; --create-fg-color:white; --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 legend { background-color:var(--legend-bg-color); border-radius:var(--input-radius); } -body legend:hover { color:var(--hover-fg-color) } -body select { border-radius:var(--input-radius); } -body 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) } -body input:not([type=button]) { border-radius:0; } -body input:not([type=button]):hover { border:var(--input-border); } -body input:not([type=button]):focus { border:var(--input-border); outline:none; } -body 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); } -body 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); } -body table.content td.select { background-color:var(--td-hover-bg-color); } -body 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); } -body 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); } -body 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); } -body 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); } -body 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); } -body 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); } -body 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); } -body 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); } -body fieldset.input div.output { background-color:var(--plugin-bg-color); } -body fieldset.input tr:hover { background-color:var(--tr-hover-bg-color); } -body 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); } -body div.carte div.item { background-color:var(--carte-bg-color); } -body div.carte div.item:hover { background-color:var(--hover-bg-color); } -body 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); } -body 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); } -body 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); } -body div.plug legend.select { background-color:var(--plugin-bg-color); } -body div.complete>table { background-color:var(--plugin-bg-color); } +legend { background-color:var(--legend-bg-color); border-radius:var(--input-radius); } +legend:hover { color:var(--hover-fg-color) } +select { border-radius:var(--input-radius); } +input { background-color:var(--input-bg-color); color:var(--input-fg-color); border-radius:var(--input-radius); } +input:hover { color:var(--hover-fg-color) } +input:not([type=button]) { border-radius:0; } +input:not([type=button]):hover { border:var(--input-border); } +input:not([type=button]):focus { border:var(--input-border); outline:none; } +textarea { background-color:var(--input-bg-color); color:var(--input-fg-color); } +table.content tr:hover { background-color:var(--tr-hover-bg-color); color:var(--hover-fg-color); } +table.content th { background-color:var(--th-bg-color); color:var(--th-fg-color); } +table.content td:hover { background-color:var(--td-hover-bg-color); } +table.content td.select { background-color:var(--td-hover-bg-color); } +table.content.action td:last-child { background-color:var(--th-bg-color); } +h1: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); } +h3: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); } +div.item.select { 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); } +span.item.select { 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); } +div.action div.tabs:hover { 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); } +div.output { background-color:var(--output-bg-color); } +fieldset>div.status { border-top:var(--status-border); } +fieldset:not(.panel) { background-color:var(--plugin-bg-color); color:var(--plugin-fg-color); border-radius:var(--plugin-radius); } +fieldset.panel:not(.main) { background-color:var(--panel-bg-color); color:var(--panel-fg-color); } +fieldset.panel:not(.main)>div.output { background-color:var(--panel-output-bg-color); color:var(--panel-output-fg-color); } +fieldset.input div.output { background-color:var(--plugin-bg-color); } +fieldset.input tr:hover { background-color:var(--tr-hover-bg-color); } +fieldset.input td:hover { background-color:var(--td-hover-bg-color); } +div.float { background-color:var(--float-bg-color); color:var(--float-fg-color); } +div.carte div.item { background-color:var(--carte-bg-color); } +div.carte div.item:hover { background-color:var(--hover-bg-color); } +div.zone>div.item { background-color:var(--th-bg-color); } +div.zone>div.list>div.zone>div.item { background-color:var(--th-bg-color); } +div.tabs div { background-color:var(--plugin-bg-color); } +div.tabs div:hover { 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); } +div.plug legend { background-color:var(--output-bg-color); } +div.plug legend.select { 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.title:hover { background-color:var(--panel-hover-bg-color); color:var(--panel-hover-fg-color); } diff --git a/lib/page.js b/lib/page.js index d7850321..36ce2fff 100644 --- a/lib/page.js +++ b/lib/page.js @@ -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) } 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) - 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) 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] @@ -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 }}, ]} }, + 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 } 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 } }) }]) @@ -320,4 +329,10 @@ Volcanos("page", { 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} }, + 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 + }, }) diff --git a/lib/user.js b/lib/user.js index 8ec07eb2..cc0ff031 100644 --- a/lib/user.js +++ b/lib/user.js @@ -100,7 +100,7 @@ Volcanos("user", { 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 }, 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, }); 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 @@ -160,7 +160,7 @@ Volcanos("user", { }, _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() } } 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 = "" }}]}, ]} })}]}, html.ACTION, @@ -257,7 +257,8 @@ Volcanos("user", { 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) }) }) }, - header: function(can) { var header = can._root.Header + header: function(can) { if (!can._root) { return } + var header = can._root.Header var meta = { 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")) }) diff --git a/manifest.json b/manifest.json index 449ff1b4..00d0e379 100644 --- a/manifest.json +++ b/manifest.json @@ -3,8 +3,8 @@ "background": {"page": "/publish/chrome/daemon.html"}, "browser_action": {"default_popup": "/publish/chrome/popup.html"}, "content_scripts": [ - {"matches": [""], "permissions": [ + {"matches": [""], "permissions": [ "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"]} ] -} \ No newline at end of file +} diff --git a/panel/action.js b/panel/action.js index e252fa3f..a37ae7a4 100644 --- a/panel/action.js +++ b/panel/action.js @@ -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 }, _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) }, }) diff --git a/panel/footer.js b/panel/footer.js index 6649802f..f0d1b039 100644 --- a/panel/footer.js +++ b/panel/footer.js @@ -14,7 +14,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.Conf(NKEY, 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 }, - _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 } close(); switch (event.target.value) { case cli.CLEAR: diff --git a/panel/header.js b/panel/header.js index 716f4f9b..8cfce1c8 100644 --- a/panel/header.js +++ b/panel/header.js @@ -1,7 +1,7 @@ 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) }, - _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) }}]) }) }, _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") }, _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||""})) }}, "", 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||""})) }) @@ -45,10 +45,8 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { }) }])._target }, }) -Volcanos(chat.ONACTION, {_init: function(can) { var themeMedia = window.matchMedia("(prefers-color-scheme: dark)") - can.__theme = themeMedia.matches? html.DARK: html.LIGHT, themeMedia.addListener(function(event) { can.__theme = event.matches? html.DARK: html.LIGHT - can.onengine.signal(can, chat.ONTHEMECHANGE, can.request(event, {theme: can.__theme})) - }), can.onimport.theme(can) +Volcanos(chat.ONACTION, {_init: function(can) { + can.page.theme(function(theme) { can.onengine.signal(can, chat.ONTHEMECHANGE, can.request(event, {theme: can.__theme = theme})) }), can.onimport.theme(can) return can.require([ "src/template/web.chat.header/dark.css", "src/template/web.chat.header/light.css", diff --git a/panel/river.js b/panel/river.js index 327f7f24..d1429756 100644 --- a/panel/river.js +++ b/panel/river.js @@ -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_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) }, } }, - _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) }, } }, _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, [ {name: mdb.TYPE, values: [aaa.TECH, aaa.ROOT, aaa.TECH, aaa.VOID], _trans: "类型"}, {name: mdb.NAME, value: "hi", _trans: "群名", need: "must"}, + {name: mdb.ICON, value: "", _trans: "图标"}, {name: mdb.TEXT, value: "hello", _trans: "简介"}, ], function(args) { 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) }) }) }) }, - 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.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: ""}) }) }, create: function(event, can, button, river) { can.user.input(can.request(event, {title: "添加应用"}), can, [ {name: mdb.NAME, value: "hi", _trans: "名称", need: "must"}, + {name: mdb.ICON, value: "", _trans: "图标"}, {name: mdb.TEXT, value: "hello", _trans: "简介"}, ], function(args) { 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 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)) { - 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 } - 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 }}) })() diff --git a/plugin/local/code/inner.css b/plugin/local/code/inner.css index 9704998e..05acecdc 100644 --- a/plugin/local/code/inner.css +++ b/plugin/local/code/inner.css @@ -3,14 +3,14 @@ fieldset.inner>form.option input[name=file] { width:160px; } fieldset.inner>div.output { overflow:hidden; } 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 span.comment { color:darkgray; } -fieldset.inner>div.output div.content td.text span.keyword { color:darkblue; } -fieldset.inner>div.output div.content td.text span.package { color:blue; } -fieldset.inner>div.output div.content td.text span.datatype { color:cornflowerblue; } -fieldset.inner>div.output div.content td.text span.function { color:darkcyan; } -fieldset.inner>div.output div.content td.text span.constant { color:gray; } -fieldset.inner>div.output div.content td.text span.string { color:brown; } -fieldset.inner>div.output div.content td.text span.object { color:purple; } +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:var(--code-keyword); } +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:var(--code-datatype); } +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:var(--code-constant); } +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:var(--code-object); } 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 div.action { width:100%; } @@ -52,13 +52,6 @@ fieldset.inner.cmd>legend { display:none; } fieldset.inner.cmd>form.option { display:none; } fieldset.inner.cmd>div.action { 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.white fieldset.inner.cmd>div.output { background-color:aliceblue; } body.white fieldset.inner.cmd>div.output div.content { background-color:white; } diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index ac3bf126..2651624c 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -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]) switch (can.Mode()) { 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 } 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() {} @@ -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._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.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()) { case chat.SIMPLE: // no 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) 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) @@ -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.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)} 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) diff --git a/plugin/local/code/inner/syntax.js b/plugin/local/code/inner/syntax.js index 9b050cc7..2802be48 100644 --- a/plugin/local/code/inner/syntax.js +++ b/plugin/local/code/inner/syntax.js @@ -119,6 +119,7 @@ Volcanos(chat.ONSYNTAX, { "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, "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, "if": code.KEYWORD, "else": code.KEYWORD, @@ -248,7 +249,10 @@ Volcanos(chat.ONSYNTAX, { 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, - "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, "video": code.KEYWORD, "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, "left": code.FUNCTION, "top": code.FUNCTION, "right": code.FUNCTION, "bottom": code.FUNCTION, "border-radius": code.FUNCTION, "outline": code.FUNCTION, "box-shadow": code.FUNCTION, + "justify-content": code.FUNCTION, "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, diff --git a/plugin/local/wiki/word.js b/plugin/local/wiki/word.js index 8b3c60df..d155c7fb 100644 --- a/plugin/local/wiki/word.js +++ b/plugin/local/wiki/word.js @@ -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.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]) 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 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) { - 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) { - 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) {}, diff --git a/plugin/state.js b/plugin/state.js index b2036a35..a29a9742 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -59,7 +59,8 @@ Volcanos(chat.ONIMPORT, { _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) 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()) if (mode) { sub.Mode(can.Mode(mode)), sub.onlayout[mode](sub) } else { sub.onlayout._init(sub) } return auto }, diff --git a/plugin/story/spide.js b/plugin/story/spide.js index 672a925a..27b22bfd 100644 --- a/plugin/story/spide.js +++ b/plugin/story/spide.js @@ -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) }, 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.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]], diff --git a/plugin/table.js b/plugin/table.js index f7aaeeb4..86b4462d 100644 --- a/plugin/table.js +++ b/plugin/table.js @@ -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) } } }} }) }], 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.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, { diff --git a/proto.js b/proto.js index 015aa725..b924f5f0 100644 --- a/proto.js +++ b/proto.js @@ -96,6 +96,7 @@ var web = {CHAT: "chat", CHAT_MACOS_DESKTOP: "web.chat.macos.desktop", CHAT_MACOS_SESSION: "web.chat.macos.session", CHAT_IFRAME: "web.chat.iframe", CHAT_FAVOR: "web.chat.favor", TEAM_PLAN: "web.team.plan", + WIKI_PORTAL: "web.wiki.portal", } var aaa = { LOGIN: "login", LOGOUT: "logout", INVITE: "invite", TOKEN: "token", @@ -131,6 +132,7 @@ var nfs = { DF: ice.DF, PS: ice.PS, PT: ice.PT, PWD: "./", SRC: "src/", USR: "usr/", PACK: "pack", + SRC_DOCUMENT: "src/document/", IMAGE_PNG: "image/png", 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", 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", - 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", 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) { 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 = "" - 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) 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 = 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 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]) } diff --git a/publish/chrome/contexts.css b/publish/chrome/contexts.css index 19e3d84d..08835775 100644 --- a/publish/chrome/contexts.css +++ b/publish/chrome/contexts.css @@ -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 { - color:white; - position:fixed; - background:radial-gradient(black, #00000073); - top:100px; - left:100px; - z-index:10; + background-color:var(--plugin-bg-color); color:var(--plugin-fg-color); border-radius:var(--plugin-radius); + padding:0; border:0; margin:0; position:fixed; top:400px; left:400px; z-index:100; } -fieldset.contexts legend { - text-align:left; - cursor:pointer; +fieldset.contexts * { padding:0; border:0; margin:0; } +fieldset.contexts legend { font-size:1.2rem; line-height:30px; padding:0 10px; height:32px; float:left; } +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); -} -fieldset.contexts form.option div.item { - float:left; margin-right:3px; - min-height:25px; vertical-align:middle; -} -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; */ -} +body>div.carte { padding:0; } +body>div.carte input[name=filter] { margin:5px; width:calc(100% - 10px); position:sticky; top:5px; } +body>div.carte div.item { text-align:center; white-space:pre; padding:5px 10px; } +body>div.carte div.item span.icon.next { float:right; } +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 select { - height:25px; font-size:14px; - box-shadow:4px 4px 10px 1px #626bd0; - background-color:black; color:cyan; - padding:0 10px; - cursor:pointer; -} -fieldset.contexts option { - font-family:monospace; -} -fieldset.contexts textarea { - width:400px; height:60px; - background-color:cyan; -} -fieldset.contexts input[type=button] { - background-color:black; color:cyan; - letter-spacing:4px; - padding-left:10px; - cursor:pointer; - 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; -} +/* icon */ +fieldset.contexts form.option>div.icon { font-size:26px; line-height:28px; padding:0 5px; height:32px; margin:0; } +fieldset.contexts form.option>div.item.icons>span.icon { font-size:26px; line-height:28px; padding:0 5px; height:32px; } +fieldset.contexts form.option>div.item.icons>span.icon.create { line-height:30px; } +fieldset.contexts div.action>div.item.icons>span.icon { font-size:26px; line-height:28px; padding:0 5px; height:32px; } +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 form.option>div.icon.refresh { line-height:26px; } +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 form.option>div.icon.next { font-size:18px; } +fieldset.contexts form.option>div.icon.prev { font-size:18px; } +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 form.option>div.item.select:hover>span.icon { visibility:visible; } +fieldset.contexts div.item.text>span.icon.delete { font-size:20px; visibility:hidden; } +fieldset.contexts div.item.text:hover>span.icon.delete { visibility:visible; } +fieldset.contexts form.option>div.button.icons { display:none; } +fieldset.contexts div.action>div.button.icons { display:none; } -table.content { - border:0; white-space:pre; - font-size:14px; font-family:monospace; - text-align:left; - overflow:auto; -} -table.content tr { - background-color:#04272f45; -} -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; -} +/* https://redis.io/ */ +html, body.antialiased, main { background-color:var(--body-bg-color); color:var(--body-fg-color); } +main>div>nav>div.absolute { background:var(--body-bg-color); color:var(--body-fg-color); } +section.prose *:not(a):not(pre):not(code) { color:var(--body-fg-color); border-left-color:gray; } +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); } +main>section>div.w-52.z-40.hidden.overflow-auto.fixed nav { background-color:var(--body-bg-color); color:var(--body-fg-color); } +@media (prefers-color-scheme: dark) { section.prose code { color:var(--body-fg-color); font-style:italic; } } -body>div.toast { - background:#0e3369b3; color:yellow; - position:fixed; - padding:5px; overflow:auto; - z-index:10; -} -body>div.toast a { - color:yellow; -} -body>div.toast div.title { - float:left; word-break:break-all; - color:#cae850; font-size:14px; - cursor:copy; -} -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; -} +/* https://blog.csdn.net/ */ +body { background-color:var(--body-bg-color); color:var(--body-fg-color); } +body div .toolbar-container { background-color:var(--body-bg-color); color:var(--body-fg-color); } +body div.main_father { background-color:var(--body-bg-color); color:var(--body-fg-color); } +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 aside div.aside-box { background-color:var(--body-bg-color); color:var(--body-fg-color); } +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 main div.blog-content-box .article-header-box { background-color:var(--body-bg-color); color:var(--body-fg-color); } +body .groupfile .pos-box .scroll-box .toc-box >ol li.active { background-color:var(--body-bg-color); color:var(--body-fg-color); } +body div main * { background-color:var(--body-bg-color); color:var(--body-fg-color); } +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.carte { - position:fixed; - background:#295b61; - color:white; - padding:4px; - min-width:80px; - z-index:10; -} -body>div.carte div.item { - padding:3px 12px; -} -body>div.carte div.item:hover { - background:red; -} -body>div.input { - position:fixed; - background-color:#0d4142a6; - z-index:10; -} -body>div.input input[type=text] { - width:171px; -} -body>div.input input[name=username] { - width:171px; -} -body>div.input input[name=password] { - width:171px; -} -body>div.input textarea { - box-shadow:4px 4px 10px 1px #626bd0; - border:2px inset #14a58e; - width:171px; height:60px; - background-color:cyan; - padding:4px; -} -body>div.input div.item { - float:left; -} -body>div.input.login { - padding:10px; -} -body>div.input.login input { - font-size:18px; -} +/* https://zhuanlan.zhihu.com/ */ +body div .Post-content { background-color:var(--body-bg-color); color:var(--body-fg-color); } +body div .ColumnPageHeader { background-color:var(--body-bg-color); color:var(--body-fg-color); } +body div .ContentItem-actions { background-color:var(--body-bg-color); color:var(--body-fg-color); } +body #blogColumnPayAdvert .column-group-item, body #blogHuaweiyunAdvert .column-group-item { background-color:var(--body-bg-color); color:var(--body-fg-color); } +body div .markdown_views blockquote { background-color:var(--body-bg-color); color:var(--body-fg-color); } +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 .more-toolbox-new .left-toolbox { display:none; } +body .csdn-side-toolbar { display:none; } +body #footerRightAds { display:none; } +body div.box-shadow.mb8 { display:none; } + +/* https://cn.bing.com/ */ +body header#b_header { background-color:var(--body-bg-color); color:var(--body-fg-color); } +body div #b_results .b_algo.b_rc_gb_template.b_algoBorder { background:var(--body-bg-color); color:var(--body-fg-color); } +body div .b_rc_gb_text_cell_wrapper>div:last-child { background:var(--body-bg-color); color:var(--body-fg-color); } +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 #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); } +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 #b_header .b_searchbox { background-color:var(--body-bg-color); color:var(--body-fg-color); } +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); } + +/* https://juejin.cn/ */ +body div#juejin div.view-container { background-color:var(--body-bg-color); color:var(--body-fg-color); } +body div#juejin div.main-header-box header { background-color:var(--body-bg-color); color:var(--body-fg-color); } +body div#juejin article { background-color:var(--body-bg-color); color:var(--body-fg-color); } +body div#juejin .article-suspended-panel { display:none; } +body div#juejin .markdown-body blockquote { background-color:var(--body-bg-color); color:var(--body-fg-color); } +body div#juejin .sidebar .sidebar-block { background-color:var(--body-bg-color); color:var(--body-fg-color); } -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; -} diff --git a/publish/chrome/contexts.js b/publish/chrome/contexts.js index e53eabfb..6b419b57 100644 --- a/publish/chrome/contexts.js +++ b/publish/chrome/contexts.js @@ -37,7 +37,10 @@ setTimeout(function() { Volcanos({ msg.Push(mdb.TYPE, html.IFRAME) msg.Push(mdb.NAME, "") 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) { msg.Push(mdb.TYPE, html.A) @@ -46,17 +49,25 @@ setTimeout(function() { Volcanos({ }) }, style: function(can, msg, arg) { - 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])) - }) - }) + if (arg[0] == "style") { + can.page.AppendStyle(can, 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) { 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) { 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) }) } 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) }) }, }, 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 } 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)) }) diff --git a/publish/chrome/daemon.html b/publish/chrome/daemon.html index b8e19152..5ec5fda7 100644 --- a/publish/chrome/daemon.html +++ b/publish/chrome/daemon.html @@ -2,7 +2,8 @@ - + + diff --git a/publish/chrome/daemon.js b/publish/chrome/daemon.js index e06def77..06b6cc34 100644 --- a/publish/chrome/daemon.js +++ b/publish/chrome/daemon.js @@ -46,7 +46,7 @@ Volcanos({ }}) }, }, 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) }) diff --git a/publish/chrome/popup.html b/publish/chrome/popup.html index 6a2d6af0..ba9aed5b 100644 --- a/publish/chrome/popup.html +++ b/publish/chrome/popup.html @@ -1,9 +1,11 @@ - + + - + + diff --git a/publish/chrome/popup.js b/publish/chrome/popup.js index 91e834c5..bb9d4393 100644 --- a/publish/chrome/popup.js +++ b/publish/chrome/popup.js @@ -1,15 +1,7 @@ Volcanos({name: "popup", iceberg: "http://localhost:9020/chat/", river: { - product: {name: "产品群", storm: { - office: {name: "办公 office", list: [ - {name: "feel", help: "影音媒体", index: "web.wiki.feel"}, - {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: [ + product: {name: "产品群", icon: "bi bi-bar-chart-line-fill", storm: { + office: {name: "办公 office", icon: "bi bi-bar-chart-line-fill", index: ["web.chat.macos.desktop", "web.wiki.feel", "web.wiki.draw", "web.wiki.data"]}, + chrome: {name: "爬虫 chrome", icon: "bi-browser-chrome", list: [ {name: "feel", help: "网页爬虫", index: "web.wiki.feel", args: ["spide/"], feature: { display: "/plugin/local/wiki/feel.js", 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"]}, ]}, }}, - project: {name: "研发群", storm: { - studio: {name: "研发 studio", list: [ - {name: "vimer", help: "编辑器", index: "web.code.vimer", args: ["src/,usr/volcanos/,usr/icebergs/,usr/toolkits/", "main.go"]}, - {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: [ + project: {name: "研发群", icon: "bi bi-git", storm: { + studio: {name: "研发 studio", icon: "bi bi-git", index: ["web.code.vimer", "web.code.git.status", "web.chat.favor", "web.team.plan", "web.wiki.word"]}, + chrome: {name: "网页 chrome", icon: "bi-browser-chrome", index: [ "web.code.chrome.chrome", "web.code.chrome.daemon", "web.code.chrome.spide", @@ -35,48 +21,13 @@ Volcanos({name: "popup", iceberg: "http://localhost:9020/chat/", river: { "web.code.chrome.field", ]}, }}, - profile: {name: "测试群", storm: { - release: {name: "发布 release", index: [ - "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", - ]}, + profile: {name: "测试群", icon: "bi bi-list-columns", type: aaa.TECH, storm: { + 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"]}, }}, - operate: {name: "运维群", storm: { - aaa: {name: "权限 aaa", index: [ - "offer", "email", "user", "totp", "sess", "role", - ]}, - web: {name: "应用 web", index: [ - "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", - ]}, + operate: {name: "运维群", icon: "bi bi-gear", type: aaa.TECH, storm: { + web: {name: "应用 web", icon: "bi bi-browser-chrome", index: ["broad", "serve", "space", "dream", "share"]}, + 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"]}, + nfs: {name: "文件 nfs", icon: "bi bi-server", index: ["dir", "cat", "tar", "pack", "tail", "trash", "server", "host", "port"]}, }}, -}}) - +}}) // https://icons.getbootstrap.com/