From 66ef36e047c3755558744c8fe1f1fd5da6a2977d Mon Sep 17 00:00:00 2001 From: shylinux Date: Tue, 25 Jul 2023 17:46:46 +0800 Subject: [PATCH] add some --- frame.js | 16 +++-- index.css | 53 +++++++++------- lib/page.js | 2 +- panel/river.css | 4 +- panel/river.js | 3 +- plugin/local/code/inner.css | 28 +++++---- plugin/local/code/inner.js | 54 +++++++++------- plugin/local/code/inner/syntax.js | 101 +++++++++++++++++------------- plugin/local/code/repos.css | 4 +- plugin/local/code/vimer.css | 4 +- plugin/local/team/plan.css | 34 +++++----- plugin/local/team/plan.js | 23 +++---- plugin/local/wiki/word.css | 4 +- plugin/state.js | 4 +- plugin/story/json.css | 4 +- plugin/table.js | 68 ++++++++++++-------- proto.js | 3 +- 17 files changed, 233 insertions(+), 176 deletions(-) diff --git a/frame.js b/frame.js index e45c6ac5..9d7b8216 100644 --- a/frame.js +++ b/frame.js @@ -368,9 +368,12 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { input.onkeyup = item.onkeyup||function(event) { if (item.name == html.FILTER) { can.user.toast(can, "filter out "+can.page.Select(can, can._output, html.TR, function(tr, index) { if (!can.page.ClassList.set(can, tr, html.HIDE, index > 0 && tr.innerText.indexOf(event.target.value) == -1)) { return tr } }).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 = "", input.onkeyup({target: event.target.previousSibling}) + // , 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: [{icon: item.icon}, input].concat(icon), _init: function(target, _input) { + var _input = can.page.Append(can, target, [{view: [[html.ITEM].concat(style, [item.type, item.name])], list: [item.icon && {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 @@ -463,7 +466,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { can.page.style(can, target, html.HEIGHT, h, html.WIDTH, w), width -= w } }), can.core.List(list, function(item) { if (can.base.isArray(item)) { layout(type == FLOW? FLEX: FLOW, item, height, width) } }) } - ui.filter = can.onappend.input(can, {type: html.TEXT, name: web.FILTER, placeholder: "search in n items", onkeyup: function(event) { + ui.filter = can.onappend.input(can, {type: html.TEXT, name: web.FILTER, placeholder: "search in n items", onkeydown: function() {}, onkeyup: function(event) { can.page.Select(can, ui.project, html.DIV_ITEM, function(target) { can.onmotion.toggle(can, target, target.innerText.indexOf(event.target.value) > -1 || target == ui.filter.parentNode) }) @@ -843,8 +846,11 @@ Volcanos(chat.ONKEYMAP, {_init: function(can, target) { target = target||documen }, selectOutput: function(event, can) { if (!event.ctrlKey || event.key < "0" || event.key > "9") { return } event.key == "0"? can.onimport._back(can): can.page.Select(can, can._output, html.TR, function(tr, index) { if (index == event.key) { - var head = can.page.Select(can, can._output, html.TH, function(th, order) { return th.innerText }) - can.page.Select(can, tr, html.TD, function(td, index) { can.Option(head[index], td.innerText) }), can.Update(event) + var head = can.page.Select(can, can._output, html.TH, function(th, order) { return th.innerText }), data = {} + can.page.Select(can, tr, html.TD, function(td, index) { data[head[index]] = td.innerText + can.Option(head[index], td.innerText) + }) + can.onexport.record(can, "", "", data) || can.Update(event) } }) }, }) diff --git a/index.css b/index.css index b7bd5e05..7d5584da 100644 --- a/index.css +++ b/index.css @@ -6,11 +6,13 @@ body { --disable-fg-color:gray; --code-bg-color:black; --code-fg-color:silver; --code-border-color:blue; - --code-comment:darkgray; --code-keyword:darkblue; --code-package:blue; + --code-comment:green; --code-keyword:darkblue; --code-package:blue; --code-datatype:cornflowerblue; --code-function:darkcyan; --code-constant:gray; --code-string:brown; --code-object:purple; --svg-stroke-width:2; + --box-border:var(--plugin-border-color) solid 1px; + --box-shadow:var(--body-fg-color) 3px 3px 10px; } /* element */ * { tab-size:4; box-sizing:border-box; padding:0; border:0; margin:0; } @@ -28,28 +30,34 @@ input[name=cmd] { background-color:var(--code-bg-color); color:var(--code-fg-col div.item.text.cmd { color:var(--code-fg-color); } table.content.full { width:100%; } table.content thead { position:sticky; top:2px; } -table.content th { padding:2px 5px; } -table.content td { padding:2px 5px; } -table.content.action th:last-child { position:sticky; right:2px; } -table.content.action td:last-child { position:sticky; right:2px; } +table.content th { padding:5px; box-shadow: var(--box-shadow); } +table.content td { padding:5px; } +table.content.action th:last-child { position:sticky; right:2px; box-shadow: var(--box-shadow); } +table.content.action td:last-child { position:sticky; right:2px; box-shadow: var(--box-shadow); } table.content col.time { width:180px; } // table.content col.option { cursor:pointer; } table.content col.action { width:180px; } h1 { text-align:center; margin:20px 0; } h2 { margin:20px 0; } h3 { margin:20px 0; } hr, td.hr { border-bottom:var(--plugin-border-color) dashed 1px; margin:5px; } -ul { padding-left:20px; margin:20px 0; } +ol, ul { margin-left:40px; } +p { margin:20px 0; } +a { color:var(--body-fg-color); } kbd { padding:0 5px; } img { margin-bottom:-8px; } /* fieldset */ -fieldset>legend { margin-right:10px; } +fieldset>legend { margin-right:10px; box-shadow:var(--box-shadow); } +fieldset>form.option>div.item:not(.icon) { box-shadow:var(--box-shadow); } +fieldset>form.option>div.item.button { border-radius:5px; } fieldset>form.option>div.cmd { width:100%; } fieldset>form.option>div.textarea { width:100%; } fieldset>form.option>div.item:not(.icon) { margin-right:10px; } fieldset>form.option>div.item.select>input { min-width:80px; } fieldset>form.option>div.item.select { border-radius:5px; } fieldset>div.action>div.item.select { border-radius:5px; } -fieldset>div.action>div.item { margin-right:10px; } +fieldset>div.action>div.item.button { border-radius:5px; } +fieldset>div.action>div.item { margin-right:10px; box-shadow:var(--box-shadow); } fieldset>div.output { width:100%; } +fieldset>div.output table.content input { margin-right:10px; box-shadow:var(--box-shadow); } fieldset>div.status { width:100%; } fieldset.cmd>div.status { height:31px; } fieldset.input>legend { display:none; } @@ -71,7 +79,7 @@ fieldset.input.date>div.output td span.lunar.term { color:green; } fieldset.input.date>div.output td span.lunar.fest { color:red; } fieldset.input.date>div.status { text-align:center; } /* float */ -body div.float { padding:5px; } +body div.float { padding:5px; box-shadow:var(--box-shadow); } body>div.toast div.title { color:var(--notice-fg-color); float:left; } body>div.toast div.duration { color:gray; float:right; } body>div.toast div.content { color:var(--notice-fg-color); text-align:center; } @@ -174,6 +182,7 @@ svg g[fill] rect { fill:unset; } div.project div.list { margin-left:10px; clear:both; } div.project div.item { padding:2px 10px; } div.project div.item.filter { padding:0; } +div.project div.item.filter input { width:100%; } div.project div.item>div.name { padding-left:15px; } div.project div.expand { float:left; transition:all .3s; } div.project div.expand.open { rotate:90deg; translate:1px 2px; transition:all .3s; } @@ -181,17 +190,17 @@ div.project div.zone>div.item { text-align:center; padding:3px; } div.project div.zone>div.item>div.icon { margin-left:3px; float:right; } div.project div.zone>div.list>div.zone>div.item { text-align:left; padding-left:20px; } div.project div.zone>div.list>div.zone>div.item:hover { margin-left:10px; transition:all 0.3s; } -fieldset>div.output div.project { border-right:var(--plugin-border-color) solid 1px; width:230px; } -fieldset>div.output div.profile { border-left:var(--plugin-border-color) solid 1px; max-width:320px; } -fieldset>div.output div.display { border-top:var(--plugin-border-color) solid 1px; } +fieldset>div.output div.project { border-right:var(--box-border); width:230px; } +fieldset>div.output div.profile { border-left:var(--box-border); max-width:320px; } +fieldset>div.output div.display { border-top:var(--box-border); } /* table card */ div.output.card>div.item.stop { color:var(--disable-fg-color); } -div.output.card>div.item { padding:10px; border:#e7e7e7 solid 1px; margin:10px; width:320px; float:left; } -div.output.card>div.item>div.title { font-size:1.2rem; font-weight:bold; padding:10px; border-bottom:solid 1px #e7e7e7; } +div.output.card>div.item { padding:10px; border:var(--box-border); margin:10px; width:320px; float:left; box-shadow:var(--box-shadow); } +div.output.card>div.item>div.title { font-size:1.2rem; font-weight:bold; padding:10px; border-bottom:var(--box-border); } div.output.card>div.item>div.content { padding:10px; height:70px; } div.output.card>div.item>div.action { text-align:right; width:100%; display:flex; } div.output.card>div.item:not(:hover)>div.action { visibility:hidden; } -div.output.card>div.item>div.action>input { margin-right:5px; } +div.output.card>div.item>div.action>input { margin-right:5px; box-shadow:var(--box-shadow); } /* display */ fieldset.panel>legend { display:none; } fieldset.panel>div.status { display:none; } @@ -206,14 +215,14 @@ legend, form.option, form.option>div.item, div.action, div.action>div.item, div. 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.flex { display:flex; } -fieldset.auto, fieldset.full, fieldset.float, div.float { position:fixed; z-index:100; } +fieldset.auto, fieldset.full, fieldset.float, div.float { position:fixed; z-index:100; box-shadow:var(--box-shadow); } fieldset.plug { position:absolute; bottom:0; right:0; } fieldset.full { position:fixed; left:0; top:0; } fieldset>div.output>div.code { position:sticky; left:0; } legend, select, input[type=button], th, table.content td, h1, h2, h3, div.item, div.tabs { cursor:pointer; } div.story[data-type=spark] { cursor:copy; } -fieldset>div.status>legend { margin-left:2px; margin-right:0; float:right; clear:none; } -fieldset>div.status>legend:not(:hover):not(.select) { background-color:unset; } +fieldset>div.status>legend { margin-right:10px; float:right; clear:none; } +fieldset>div.status>legend:not(:hover):not(.select) { background-color:unset; box-shadow: var(--box-shadow); } /* hover */ input:hover[type=button][name=create] { background-color:var(--create-bg-color); color:var(--create-fg-color); } input:hover[type=button][name=insert] { background-color:var(--create-bg-color); color:var(--create-fg-color); } @@ -258,7 +267,7 @@ fieldset>div.output { background-color:var(--output-bg-color); } fieldset>div.status { border-top:var(--status-border); } fieldset:not(.panel):not(.cmd) { background-color:var(--plugin-bg-color); color:var(--plugin-fg-color); } fieldset:not(.panel) { background-color:var(--plugin-bg-color); color:var(--plugin-fg-color); } -fieldset:not(.panel):not(.full):not(.cmd) { border-radius:var(--plugin-radius); } +fieldset:not(.panel):not(.full):not(.cmd) { border-radius:var(--plugin-radius); box-shadow:var(--box-shadow); } 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); } @@ -309,7 +318,7 @@ body.print fieldset.draw div.output div.content svg { background-color:lightgray /* misc */ fieldset.Search div.story[data-type=spark] { margin:0; } fieldset.Search>div.output>div.profile { border-left:none; } -fieldset.Action>div.output>fieldset.plugin:not(.output):not(.float):not(.full):not(.cmd) { padding:10px; margin:10px; } +fieldset.Action>div.output>fieldset.plugin:not(.output):not(.float):not(.full):not(.cmd) { padding:10px; margin:10px; box-shadow:var(--box-shadow); } fieldset.Action>div.output>fieldset.plugin:not(.float):not(.full):not(.cmd)>legend { float:none; } fieldset.cmd>div.item.time { line-height:22px; padding:5px 10px; float:right; } fieldset.cmd>div.item.avatar { padding:0; height:32px; float:right; } @@ -322,8 +331,8 @@ fieldset.inner.float>div.status { display:none; } fieldset.qrcode>div.output div.code { padding:0; } fieldset.xterm>div.action>div.tabs:only-child { display:none; } fieldset.xterm>div.layout { clear:both; } -fieldset.xterm div.layout div.output { border-left:var(--plugin-border-color) solid 1px; border-top:var(--plugin-border-color) solid 1px; } -fieldset.xterm div.layout div.output.select { border:var(--code-border-color) solid 1px; } +fieldset.xterm div.layout div.output { border-left:var(--box-border); border-top:var(--box-border); } +fieldset.xterm div.layout div.output.select { border:var(--box-border)} fieldset.plan div.output div.content>table.content { height:100%; width:100%; } fieldset.draw>form.option>div.item.pid>input { width:60px; } fieldset.draw div.output svg { margin-bottom:-4px; height:100%; width:100%; } diff --git a/lib/page.js b/lib/page.js index 06ccb15c..3392d651 100644 --- a/lib/page.js +++ b/lib/page.js @@ -22,7 +22,7 @@ Volcanos("page", { return can.page.Select(can, target, key? "select[name="+key+"],"+"input.select[type=button][name="+key+"],"+"input[name="+key+"],"+"textarea[name="+key+"]": ".args", cb) }, SelectInput: function(can, target, name, cb) { return can.page.Select(can, target, "input[name="+name+"]", cb)[0] }, - SelectChild: function(can, target, key, cb) { return can.core.List(can.page.Select(can, target, key, function(node) { if (node.parentNode == target) { return node } }), cb) }, + SelectChild: function(can, target, key, cb) { return can.core.List(can.page.Select(can, target, key||"*", function(node) { if (node.parentNode == target) { return node } }), cb) }, SelectOne: function(can, target, key, cb) { return can.page.Select(can, target, key, function(target, index) { return index == 0 && can.base.isFunc(cb) && cb(target), target })[0] }, Select: function(can, target, key, cb, interval, cbs) { target = target || document.body return can.core.List(key == nfs.PT? [target]: target.querySelectorAll(can.page.Keys(key)), cb, interval, cbs) diff --git a/panel/river.css b/panel/river.css index d3d5caba..4de41d1f 100644 --- a/panel/river.css +++ b/panel/river.css @@ -1,5 +1,5 @@ fieldset.River { width:230px; float:left; } fieldset.River>div.action { width:100%; display:flex; justify-content:center; } -fieldset.River>div.output div.item { padding:10px 20px; border-left:solid 3px #00ffae; } -fieldset.River>div.output div.list div.item { border-left:solid 3px #ccdc4c; } +fieldset.River>div.output div.item { padding:10px 20px; border-left:#00ffae solid 3px; } +fieldset.River>div.output div.list div.item { border-left:#ccdc4c solid 3px; } fieldset.River>div.output div.list { margin-left:20px; } diff --git a/panel/river.js b/panel/river.js index 65c880b4..a170b473 100644 --- a/panel/river.js +++ b/panel/river.js @@ -39,8 +39,7 @@ Volcanos(chat.ONACTION, {list: [mdb.CREATE, web.SHARE, web.REFRESH], _init: func refresh: function(event, can) { can.misc.Search(can, {river: can.Conf(chat.RIVER), storm: can.Conf(chat.STORM)}) }, storm: function(event, can, river) { can.onmotion.select(can, can._output, html.DIV_ITEM, can.ui.river_list[river]) var list = can.ui.sublist[river]; if (list) { return can.onmotion.toggle(can, list) } - var next = event.target.nextSibling - can.run({}, [river, chat.STORM], function(msg) { + can.run({}, [river, chat.STORM], function(msg) { var next = can.ui.river_list[river].nextSibling if (msg.Length() == 0) { return can.user.isLocalFile? can.user.toastFailure(can, "miss data"): can.onengine.signal(can, chat.ONACTION_NOSTORM, can.request({}, {river: river})) } var select = 0; list = can.page.Append(can, can._output, [{view: html.LIST, list: msg.Table(function(item, index) { return river == can._main_river && item.hash == can._main_storm && (select = index), can.onimport._storm(can, item, river) diff --git a/plugin/local/code/inner.css b/plugin/local/code/inner.css index 4dcb3abe..46f93711 100644 --- a/plugin/local/code/inner.css +++ b/plugin/local/code/inner.css @@ -4,18 +4,18 @@ fieldset.inner:not(.output)>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: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.keyword { color:var(--code-keyword); box-shadow:var(--box-shadow); } 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.string { color:var(--code-string); box-shadow:var(--box-shadow); } fieldset.inner>div.output div.content td.text span.object { color:var(--code-object); } -fieldset.inner>div.output>div.project { width:230px; flex:0 0 230px; } +fieldset.inner>div.output>div.project { width:230px; flex:0 0 230px; box-shadow:var(--box-shadow); } fieldset.inner>div.output>div.project * { font-size:14px; font-family:monospace; outline:none; } fieldset.inner>div.output>div.project div.action { width:100%; } fieldset.inner>div.output>div.project input[type=text] { box-shadow:none; } -fieldset.inner>div.output>div.project div.zone>div.item span.icon { font-size:20px; line-height:16px; width:20px; float:right; display:none; } +fieldset.inner>div.output>div.project div.zone>div.item span.icon { font-size:20px; line-height:16px; padding:0 5px; float:right; display:none; } fieldset.inner>div.output>div.project div.zone:hover>div.item span.icon { display:block; } fieldset.inner>div.output>div.project>div.zone>div.item span.icon { font-size:22px; line-height:32px; } fieldset.inner>div.output>div.project>div.zone div.action>div.item { padding-right:0; width:100%; } @@ -26,16 +26,20 @@ fieldset.inner>div.output>div.layout>div.tabs { font-size:14px; display:none; } fieldset.inner>div.output>div.layout>div.path { font-size:14px; display:none; } fieldset.inner>div.output>div.layout>div.layout div.content * { font-family:monospace; font-size:14px; outline:none; } fieldset.inner>div.output>div.layout>div.layout>div.profile { max-width:unset; } -fieldset.inner>div.output>div.layout>div.layout>iframe.profile { border-left:var(--plugin-border-color) solid 1px; } +fieldset.inner>div.output>div.layout>div.layout>div.profile { max-width:unset; } +fieldset.inner>div.output>div.layout>div.layout>div.profile h1 { text-align:left; padding:10px 0; margin:20px 0; border-bottom:var(--box-border); } +fieldset.inner>div.output>div.layout>div.layout>div.profile h2 { padding:10px 0; margin:20px 0; border-bottom:var(--box-border); } +fieldset.inner>div.output>div.layout>div.layout>div.profile>div.code { white-space:unset; padding:20px; } +fieldset.inner>div.output>div.layout>div.layout>iframe.profile { border-left:var(--box-border); } fieldset.inner>div.output>div.layout>div.layout>div.profile div.status>div { padding:5px; float:left; } fieldset.inner>div.output>div.layout>div.display div.status>div { padding:5px; float:left; } fieldset.inner>div.output>div.project>div.zone>div.item { font-style:italic; font-weight:bold; line-height:32px; } fieldset.inner>div.output>div.project>div.zone>div.item>span.icon { font-style:normal; font-weight:normal; } -fieldset.inner.cmd>div.output>div.layout>div.tabs { height:38px; display:block; overflow:hidden; } +fieldset.inner.cmd>div.output>div.layout>div.tabs { height:38px; display:block; overflow:hidden; background-color:var(--plugin-bg-color); } fieldset.inner.cmd>div.output>div.layout>div.tabs.hide { display:none; } fieldset.inner.cmd>div.output>div.layout>div.tabs>div { padding:10px; height:38px; float:left; } fieldset.inner.cmd>div.output>div.layout>div.tabs>div.icon { font-size:26px; line-height:32px; padding:2px 5px; position:sticky; top:0; } -fieldset.inner.cmd>div.output>div.layout>div.tabs>div.tabs.select { background-color:var(--output-bg-color); } +fieldset.inner.cmd>div.output>div.layout>div.tabs>div.tabs.select { background-color:var(--output-bg-color); box-shadow:var(--box-shadow); } fieldset.inner.cmd>div.output>div.layout>div.tabs>div.tabs:hover { background-color:var(--output-bg-color); } fieldset.inner.cmd>div.output>div.layout>div.tabs>div.tabs>span { font-style:italic; } fieldset.inner.cmd>div.output>div.layout>div.tabs>div.tabs>span.icon { padding:0 5px; } @@ -43,11 +47,11 @@ fieldset.inner.cmd>div.output>div.layout>div.tabs>div.usernick { float:right; po fieldset.inner.cmd>div.output>div.layout>div.tabs>div.avatar { padding:0; height:38px; float:right; position:sticky; top:0; } fieldset.inner.cmd>div.output>div.layout>div.tabs>div.avatar>img { height:38px; } fieldset.inner.cmd>div.output>div.layout>div.tabs>div.time { float:right; position:sticky; top:0; } -fieldset.inner.cmd>div.output>div.layout>div.path { font-style:italic; padding:5px; display:block; } +fieldset.inner.cmd>div.output>div.layout>div.path { font-style:italic; padding:5px; display:block; box-shadow:var(--box-shadow); cursor:pointer; } fieldset.inner.cmd>div.output>div.layout>div.path.hide { display:none; } fieldset.inner.cmd>div.output>div.layout>div.path span.func { padding:5px 10px; margin-left:20px; } -fieldset.inner.cmd>div.output>div.layout>div.path span.mode { padding:5px 10px; margin-left:20px; cursor:pointer; } -fieldset.inner.cmd>div.output>div.layout>div.path span.view { font-size:22px; line-height:12px; padding:0 4px; float:right; cursor:pointer; } +fieldset.inner.cmd>div.output>div.layout>div.path span.mode { padding:5px 10px; margin-left:20px; } +fieldset.inner.cmd>div.output>div.layout>div.path span.view { font-size:22px; line-height:12px; padding:0 4px; float:right; } fieldset.inner.cmd>div.output>div.layout>div.plug { height:32px; clear:both; position:fixed; bottom:0; right:0; } fieldset.inner.cmd>div.output>div.layout>div.plug>legend { font-size:1rem; padding:0 10px; float:right; } fieldset.inner.cmd>div.output>div.layout>div.display>div.status { position:sticky; bottom:0; } @@ -70,9 +74,9 @@ body.mobile fieldset.inner>form.option input[name=file] { width:90px; } body.mobile fieldset.word fieldset.inner>form.option input[type=text] { display:none; } body.windows fieldset.inner>div.output { overflow:hidden; } body.windows fieldset.inner>div.output>div.layout>div.layout>div.profile { overflow:hidden; } -body.zh fieldset.inner>div.output>div.project>div.zone>div.item { letter-spacing:10px; } +body.zh fieldset.inner>div.output>div.project>div.zone>div.item { letter-spacing:10px; border-top:var(--box-border); } div.path span.item { padding:5px; } -div.carte.path.float { font-size:14px; border-radius:0; } div.carte.path.float div.item { padding:5px; } +div.carte.path.float { font-size:14px; border-radius:0; box-shadow:var(--box-shadow); } div.carte.path.float div.item { padding:5px; } div.carte.cmd.float { font-size:14px; border-radius:0; } div.cmd.path.float div.item { padding:5px; } div.vimer.open.float td:first-child { display:none; } div.layout.flex>input.current { clear:both; } diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index 64efbe85..0036fc8a 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -78,7 +78,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Sp } can.page.Append(can, target, [{view: [[html.ITEM, "func"], html.SPAN, (func.current||"func")+nfs.PS+can.ui.content._max+func.percent+lex.SP+can.base.Size(can._msg.result[0].length)], onclick: function(event) { carte = can.user.carte(event, can, {_style: nfs.PATH}, list, function(ev, button) { last[button] = true, carte.close() - can.onimport.tabview(can, "", can.Option(nfs.FILE), can.core.Split(button, nfs.DF)[1]) + can.onimport.tabview(can, "", can.Option(nfs.FILE), can.core.Split(button, nfs.DF, nfs.DF).pop()) }) }}]) }, @@ -133,8 +133,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Sp can.Status(kit.Dict(nfs.FILE, ls.join(nfs.PS))) }) } - function load(msg) { var skip = false; can.db.tabview[key] = msg - var name = file + function load(msg) { var skip = false; can.db.tabview[key] = msg; var name = file if (can.base.beginWith(file, web.HTTP)) { name = decodeURI(file.split(web.QS)[0]) var link = can.misc.ParseURL(can, name); if (link.pod) { name = link.pod } } else { @@ -143,9 +142,6 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Sp can.onimport.tabs(can, [{name: name, text: file, _menu: shy([ nfs.SAVE, nfs.TRASH, web.REFRESH, ], function(event, button, meta) { - if (button == "refresh") { - - } can.onaction[button](event, can, button) })}], function(event, tabs) { can._tab = msg._tab = tabs._target, show(skip), skip = true @@ -162,7 +158,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Sp return can.Status(ice.BACK, can.db.history.length), record }, project: function(can, path) { can.onmotion.clear(can, can.ui.project), can.onimport.zone(can, can.core.Item(can.onfigure, function(name, cb) { - if (can.base.isFunc(cb)) { return {name: name, _trans: can.onfigure._trans? can.onfigure._trans[name]||"": "", _init: function(target, zone) { return cb(can, target, zone, path) }} } + if (can.base.isFunc(cb)) { return {name: name, _trans: can.onfigure._trans? can.onfigure._trans[name]||"": "", _toggle: function() { can.onimport.layout(can) }, _init: function(target, zone) { return cb(can, target, zone, path) }} } }), can.ui.project) }, profile: function(can, msg) { var _msg = can.db.tabview[can.onexport.keys(can)]; _msg.Option(html.WIDTH, msg.Option(html.WIDTH)), border = 1 var height = (can.ui.content._root||can.ui.content).offsetHeight, width = can.onexport.size(can, _msg.Option(html.WIDTH)||0.5, can.ConfWidth()-can.ui.project.offsetWidth)+border @@ -205,6 +201,13 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Sp can.onappend.table(can, msg, function(value, key, index, item) { return {text: [value, html.TD], onclick: function(event) { item.file && can.onimport.tabview(can, item.path, item.file||can.Option(nfs.FILE), item.line) }} }, target), can.onappend.board(can, msg, target), msg.Option(ice.MSG_STATUS) && can.onappend._status(can, msg.Option(ice.MSG_STATUS), can.page.Append(can, target, [html.STATUS])._target) + can.onmotion.delay(can, function() { + can.page.Select(can, target, html.IMG, function(target) { + var src = can.base.trimPrefix(target.src, location.origin) + if (can.base.beginWith(src, "/require/", web.HTTP)) { return } + target.src = "/require/"+can.Option(nfs.PATH)+can.base.trimPrefix(src, location.pathname.slice(0, location.pathname.lastIndexOf("/")+1)) + }) + }) } else { return can.onmotion.toggle(can, target, false), can.onimport.layout(can), can.user.toastFailure(can, "nothing to display") } return can.onmotion.toggle(can, target, true), can.onmotion.delay(can, function() { can.onimport.layout(can), can.user.toastSuccess(can) }) @@ -218,10 +221,13 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Sp 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) + var sub = can.ui.profile._plugin; sub && can.page.isDisplay(can.ui.profile) && sub.onimport && sub.onimport.size(sub, can.ui.profile.offsetHeight, can.ui.profileWidth, true) var sub = can.ui.content._plugin; if (!sub) { return } if (height == sub.ConfHeight()+sub.onexport.actionHeight(sub)+sub.onexport.statusHeight(sub) && width == sub.ConfWidth()) { return } content._root || sub.onimport.size(sub, height, width, true), can.onlayout.layout(can) }) + if (can.isCmdMode()) { + can.ui.zone.source._layout(), can.ui.zone[can.Option(nfs.PATH)] && can.ui.zone[can.Option(nfs.PATH)]._layout() + } }, exts: function(can, url, cb) { var sub = can.db.toolkit[url.split(web.QS)[0]]; if (sub) { return can.base.isFunc(cb)? cb(sub): sub.select() } can.onimport.toolkit(can, {index: ice.CAN_PLUGIN, display: (url[0] == nfs.PS || url.indexOf(web.HTTP) == 0? "": can.base.Dir(can._path))+url}, function(sub) { @@ -235,7 +241,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Sp }, [""]) Volcanos(chat.ONFIGURE, { source: function(can, target, zone, path) { var args = can.base.getValid(can.misc.SearchHash(can), [can.Option(nfs.PATH), can.Option(nfs.FILE)]) - function show(target, zone, path) { can.run(can.request({}, {dir_root: path, dir_deep: true}), [nfs.PWD], function(msg) { can.onmotion.clear(can, target) + function show(target, zone, path) { can.run(can.request({}, {dir_root: path, dir_deep: true, "_toast": "目录加载中..."}), [nfs.PWD], function(msg) { can.onmotion.clear(can, target) can.onimport.tree(can, can.core.List(msg.Table(), function(item) { if (path == args[0] && args[1].indexOf(item.path) == 0) { item.expand = true } return item }), nfs.PATH, nfs.PS, function(event, item) { can.onimport.tabview(can, path, item.path) }, target), zone._total(msg.Length()) @@ -245,11 +251,11 @@ Volcanos(chat.ONFIGURE, { module: function(can, target, zone) { zone._delay_init = function() { can.runAction({}, mdb.INPUTS, [ctx.INDEX], function(msg) { can.onimport.tree(can, msg.Table(), ctx.INDEX, nfs.PT, function(event, item) { can.onimport.tabview(can, "", item.index, ctx.INDEX) }, target), zone._total(msg.Length()) }) } }, - plugin: function(can, target, zone) { var total = 0 + plugin: function(can, target, zone) { zone._delay_init = function() { var total = 0 can.onimport.tree(can, can.core.ItemKeys(can.onengine.plugin.meta, function(key) { if (key[0] != "_") { return total++, {index: key} } }), ctx.INDEX, nfs.PT, function(event, item) { can.onimport.tabview(can, "", can.core.Keys(ice.CAN, item.index), ctx.INDEX) }, target), zone._total(total) - }, + } }, }) Volcanos(chat.ONLAYOUT, { _split: function(can, type) { var target = can.ui.content, msg = target._msg, scroll = target.scrollTop @@ -295,11 +301,7 @@ Volcanos(chat.ONSYNTAX, {_init: function(can, msg, cb) { var key = can.onexport. if (can.onexport.parse(can) == nfs.SVG) { msg.Option(ctx.INDEX, web.WIKI_DRAW+mdb.FS+path+file) } if (msg.Option(ctx.INDEX)) { return can.onsyntax._index(can, msg, function(target) { can.ui.content = target, cb(msg._content = content._root? (target._root = content._root): target) }, content._root? content: can.ui._profile.parentNode) } function show(p) { - p && p.include && can.core.List(p.include, function(from) { - can.core.Item(can.onsyntax[from].keyword, function(key, value) { - p.keyword[key] = p.keyword[key] || value - }) - }) + p && p.include && can.core.List(p.include, function(from) { can.core.Item(can.onsyntax[from].keyword, function(key, value) { p.keyword[key] = p.keyword[key] || value }) }) if (!content._root && can.db.history.length > 1) { content = can.ui.content = can.page.insertBefore(can, [{view: html.CONTENT, style: {width: can.ui.content.offsetWidth}}], can.ui._profile), content._cache_key = key } content._max = 0, content._msg = msg, msg.__content = content, can.page.Appends(can, content, [{view: ["tips", "", msg.Option(nfs.FILE)]}]) if (msg.Length() > 0) { can.onsyntax._change(can, msg), can.onaction.rerankLine(can, "tr.line:not(.delete)>td.line") @@ -308,7 +310,14 @@ Volcanos(chat.ONSYNTAX, {_init: function(can, msg, cb) { var key = can.onexport. can.onmotion.delay(can, function() { can.onappend.scroll(can, can.ui.content) }) can.onengine.signal(can, VIEW_CREATE, msg), can.base.isFunc(cb) && cb(msg._content = content._root? content._root: content) } can.require(["/plugin/local/code/inner/syntax.js"], function() { var parse = can.onexport.parse(can); can.Conf(chat.PLUG) && (can.onsyntax[parse] = can.Conf(chat.PLUG)) - var p = can.onsyntax[parse]; !p? can.runAction({}, mdb.PLUGIN, [parse, file, path], function(msg) { show(p = can.onsyntax[parse] = can.base.Obj(msg.Result()||"{}")) }): show(p) + var p = can.onsyntax[parse]; !p? can.runAction({}, mdb.PLUGIN, [parse, file, path], function(msg) { + p = can.base.Obj(msg.Result()) + if (p && p.script) { can._msg.Option("parse", msg.Option("parse")) + can.require([p.script], function() { show(can.onsyntax[msg.Option("parse")||parse]) }) + } else { + show(can.onsyntax[parse] = p) + } + }): show(p) }) }, _space: function(can, msg, cb, parent) { if (can.Option(nfs.LINE) == web.SPACE) { can.ui.zone.space && can.onmotion.delay(can, function() { can.ui.zone.space.refresh() }, 1000) @@ -334,10 +343,11 @@ Volcanos(chat.ONSYNTAX, {_init: function(can, msg, cb) { var key = can.onexport. }, _parse: function(can, line) { var parse = can.onexport.parse(can) function wrap(text, type) { return can.page.Format(html.SPAN, can.page.trans(can, text), type) } - var p = can.onsyntax[parse]||{}; p = can.onsyntax[p.link]||p, p.split = p.split||{} + var p = can.onsyntax[parse]; if (!p) { return can.page.trans(can, line) } p = can.onsyntax[p.link]||p, p.split = p.split||{}, p.keyword = p.keyword||{} if (p.prefix && can.core.Item(p.prefix, function(pre, type) { if (can.base.beginWith(line, pre)) { return line = wrap(line, type) } }).length > 0) { return line } if (p.suffix && can.core.Item(p.suffix, function(end, type) { if (can.base.endWith(line, end)) { return line = wrap(line, type) } }).length > 0) { return line } - p.keyword && (line = can.core.List(can.core.Split(line, p.split.space||"\t ", p.split.operator||"{[(.,:;!?|&*/+-<=>)]}", {detail: true}), function(item, index, array) { + if (!p.keyword) { return line } + line = can.core.List(can.core.Split(line, p.split.space||"\t ", p.split.operator||"{[(.,:;!?|$@&*+-<=>)]}", {detail: true}), function(item, index, array) { item = can.base.isObject(item)? item: {text: item}; var text = item.text, type = p.keyword[text] switch (item.type||type) { case code.STRING: return wrap(item.left+text+item.right, code.STRING) @@ -351,7 +361,7 @@ Volcanos(chat.ONSYNTAX, {_init: function(can, msg, cb) { var key = can.onexport. default: var t = can.core.Item(p.regexp, function(reg, type) { var m = text.match(new RegExp(reg)); if (m && m.length > 0 && m[0] == text) { return type} }) return t && t.length > 0? wrap(text, t[0]): type? wrap(text, type): wrap(text, "_") } - }).join("")); return line + }).join(""); return line }, _change: function(can, msg) { var _delete = [], _insert = [], deletes = [], inserts = [] function scroll(item, type, length, index) { @@ -525,7 +535,9 @@ Volcanos(chat.ONEXPORT, {list: [nfs.FILE, nfs.LINE, ice.BACK], selection: function(can, str) { var s = document.getSelection().toString(), begin = str.indexOf(s), end = begin+s.length for (var i = begin; i >= 0; i--) { if (str[i].match(/[a-zA-Z0-9_.]/)) { s = str.slice(i, end) } else { break } } return s }, - parse: function(can) { return can.base.Ext(can.Option(nfs.FILE)) }, + parse: function(can) { + return can._msg.Option("parse")||can.base.Ext(can.Option(nfs.FILE)) + }, split: function(can, file) { var ls = file.split(nfs.PS); if (ls.length == 1) { return [nfs.PWD, ls[0]] } if (ls[0] == ice.USR) { return [ls.slice(0, 2).join(nfs.PS)+nfs.PS, ls.slice(2).join(nfs.PS)] } return [ls.slice(0, 1).join(nfs.PS)+nfs.PS, ls.slice(1).join(nfs.PS)] diff --git a/plugin/local/code/inner/syntax.js b/plugin/local/code/inner/syntax.js index 4f5ce605..392fa050 100644 --- a/plugin/local/code/inner/syntax.js +++ b/plugin/local/code/inner/syntax.js @@ -1,22 +1,29 @@ Volcanos(chat.ONSYNTAX, { - makefile: {prefix: {"#": code.COMMENT}, suffix: {":": code.COMMENT}, keyword: { - "ifeq": code.KEYWORD, "ifneq": code.KEYWORD, "else": code.KEYWORD, "endif": code.KEYWORD, + makefile: {prefix: {"#": code.COMMENT}, split: {operator: "($?.,):+="}, keyword: { + "export": code.KEYWORD, + "if": code.KEYWORD, "else": code.KEYWORD, "endif": code.KEYWORD, + "ifeq": code.KEYWORD, "ifneq": code.KEYWORD, + "ifdef": code.KEYWORD, "ifndef": code.KEYWORD, + "define": code.KEYWORD, "endef": code.KEYWORD, + "shell": code.KEYWORD, + "PHONY": code.FUNCTION, + }, include: ["sh"], func: function(can, push, text, indent) { + var ls = can.core.Split(text, "", ":=") + if (indent == 0 && ls[1] == ":" && ls[2] != "=") { push(text) } }}, - man: { - prefix: { - "NAME": code.KEYWORD, - "SYNOPSIS": code.KEYWORD, - "DESCRIPTION": code.KEYWORD, + man: {prefix: { + "NAME": code.KEYWORD, + "SYNOPSIS": code.KEYWORD, + "DESCRIPTION": code.KEYWORD, - "AUTHOR": code.KEYWORD, - "COPYRIGHT": code.KEYWORD, - "LIBRARY": code.KEYWORD, - "STANDARDS": code.KEYWORD, - "SEE ALSO": code.KEYWORD, - "HISTORY": code.KEYWORD, - "BUGS": code.KEYWORD, - }, - }, + "AUTHOR": code.KEYWORD, + "COPYRIGHT": code.KEYWORD, + "LIBRARY": code.KEYWORD, + "STANDARDS": code.KEYWORD, + "SEE ALSO": code.KEYWORD, + "HISTORY": code.KEYWORD, + "BUGS": code.KEYWORD, + }}, vim: {prefix: {"\"": "comment"}, keyword: { "source": code.KEYWORD, "finish": code.KEYWORD, @@ -92,7 +99,6 @@ Volcanos(chat.ONSYNTAX, { }, }, h: {link: "c"}, sh: {prefix: {"#": code.COMMENT}, suffix: {" {": code.COMMENT}, split: {operator: "{[($.,:;&<|>=)]}"}, regexp: {"[A-Z0-9_]+": code.CONSTANT, "ish_[A-Za-z0-9_]+": code.FUNCTION}, - func: function(can, push, text) { if (can.base.endWith(text, "() {")) { var ls = can.core.Split(text, "\t (){"); push(ls[0]) } }, keyword: { "source": code.KEYWORD, "return": code.KEYWORD, "exit": code.KEYWORD, "require": code.KEYWORD, "request": code.KEYWORD, @@ -104,34 +110,41 @@ Volcanos(chat.ONSYNTAX, { "history": code.FUNCTION, "alias": code.FUNCTION, "complete": code.FUNCTION, "compgen": code.FUNCTION, "bind": code.FUNCTION, "printf": code.FUNCTION, "echo": code.FUNCTION, "eval": code.FUNCTION, "test": code.FUNCTION, "trap": code.FUNCTION, "shift": code.FUNCTION, - "cd": code.FUNCTION, "ls": code.FUNCTION, "rm": code.FUNCTION, "chmod": code.FUNCTION, "mkdir": code.FUNCTION, "mktemp": code.FUNCTION, + "set": code.FUNCTION, "xargs": code.FUNCTION, + "/dev/null": code.CONSTANT, "/dev/stdout": code.CONSTANT, "/dev/stderr": code.CONSTANT, + + "mkdir": code.FUNCTION, "rmdir": code.FUNCTION, "mktemp": code.FUNCTION, "du": code.FUNCTION, "df": code.FUNCTION, + "cd": code.FUNCTION, "ls": code.FUNCTION, "ln": code.FUNCTION, "mv": code.FUNCTION, "rm": code.FUNCTION, "cp": code.FUNCTION, + "groupadd": code.FUNCTION, "useradd": code.FUNCTION, "chown": code.FUNCTION, "sudo": code.FUNCTION, "curl": code.FUNCTION, "wget": code.FUNCTION, "apk": code.FUNCTION, "yum": code.FUNCTION, "cat": code.FUNCTION, "head": code.FUNCTION, "tail": code.FUNCTION, "grep": code.FUNCTION, "cut": code.FUNCTION, "sed": code.FUNCTION, "tr": code.FUNCTION, - "xargs": code.FUNCTION, "sudo": code.FUNCTION, "du": code.FUNCTION, "df": code.FUNCTION, - "/dev/null": code.CONSTANT, "/dev/stdout": code.CONSTANT, "/dev/stderr": code.CONSTANT, + "make": code.FUNCTION, "file": code.FUNCTION, "vim": code.FUNCTION, "gcc": code.FUNCTION, "git": code.FUNCTION, "go": code.FUNCTION, + "docker": code.FUNCTION, }, + func: function(can, push, text) { if (can.base.endWith(text, "() {")) { var ls = can.core.Split(text, "\t (){"); push(ls[0]) } }, }, configure: {link: "sh"}, - shy: {prefix: {"#": code.COMMENT}, regexp: {"[A-Z_0-9]+": code.CONSTANT}, keyword: {"source": code.KEYWORD, - "title": code.KEYWORD, "navmenu": code.KEYWORD, "premenu": code.KEYWORD, "chapter": code.KEYWORD, "section": code.KEYWORD, "endmenu": 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, - "field": code.KEYWORD, "image": code.KEYWORD, "video": code.KEYWORD, "audio": code.KEYWORD, - "style": code.KEYWORD, - "inner": code.KEYWORD, + shy: {prefix: {"#": code.COMMENT}, regexp: {"[A-Z_0-9]+": code.CONSTANT}, + keyword: {"source": code.KEYWORD, + "title": code.KEYWORD, "navmenu": code.KEYWORD, "premenu": code.KEYWORD, "chapter": code.KEYWORD, "section": code.KEYWORD, "endmenu": 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, + "field": code.KEYWORD, "image": code.KEYWORD, "video": code.KEYWORD, "audio": code.KEYWORD, + "style": code.KEYWORD, + "inner": code.KEYWORD, - "package": code.KEYWORD, "import": code.KEYWORD, "const": code.KEYWORD, "type": code.KEYWORD, "var": code.KEYWORD, - "if": code.KEYWORD, "else": code.KEYWORD, - "for": code.KEYWORD, "range": code.KEYWORD, "break": code.KEYWORD, "continue": code.KEYWORD, - "switch": code.KEYWORD, "case": code.KEYWORD, "default": code.KEYWORD, - "func": code.KEYWORD, "defer": code.KEYWORD, "return": code.KEYWORD, - "init": code.FUNCTION, "main": code.FUNCTION, "list": code.FUNCTION, "info": code.FUNCTION, - "map": code.DATATYPE, "struct": code.DATATYPE, "interface": code.DATATYPE, "string": code.DATATYPE, "int": code.DATATYPE, - "true": code.CONSTANT, "false": code.CONSTANT, + "package": code.KEYWORD, "import": code.KEYWORD, "const": code.KEYWORD, "type": code.KEYWORD, "var": code.KEYWORD, + "if": code.KEYWORD, "else": code.KEYWORD, + "for": code.KEYWORD, "range": code.KEYWORD, "break": code.KEYWORD, "continue": code.KEYWORD, + "switch": code.KEYWORD, "case": code.KEYWORD, "default": code.KEYWORD, + "func": code.KEYWORD, "defer": code.KEYWORD, "return": code.KEYWORD, + "init": code.FUNCTION, "main": code.FUNCTION, "list": code.FUNCTION, "info": code.FUNCTION, + "map": code.DATATYPE, "struct": code.DATATYPE, "interface": code.DATATYPE, "string": code.DATATYPE, "int": code.DATATYPE, + "true": code.CONSTANT, "false": code.CONSTANT, - "kit": code.PACKAGE, "ice": code.PACKAGE, "m": code.OBJECT, "arg": code.OBJECT, - "event": code.OBJECT, "can": code.OBJECT, "msg": code.OBJECT, "target": code.OBJECT, - }, + "kit": code.PACKAGE, "ice": code.PACKAGE, "m": code.OBJECT, "arg": code.OBJECT, + "event": code.OBJECT, "can": code.OBJECT, "msg": code.OBJECT, "target": code.OBJECT, + }, func: function(can, push, text, indent, opts) { var ls = can.core.Split(text, "\t ") opts.chapter = opts.chapter||0 if (ls[0] == "chapter") { opts.chapter++, opts.section = 0, push(opts.chapter+lex.SP+ls[1]) } @@ -169,13 +182,15 @@ Volcanos(chat.ONSYNTAX, { }, func: function(can, push, text, indent, opts) { var ls = can.core.Split(text, "\t *", "({:})") function isKey() { return opts.block == "cmds" && ls[1] == ":" && ls[2] == "{" } function isEnd() { return ls[0] == "}" } - function prefix(key, pre) { return key.toLowerCase() == key? "- ": ("+ "+(pre? pre+nfs.PT: "")) } + function prefix(key, pre) { return key.slice(0, 1).toLowerCase() == key.slice(0, 1)? "- ": ("+ "+(pre? pre+nfs.PT: "")) } if (indent == 0) { switch (ls[0]) { case "package": opts.package = ls[1]; break - case "func": if (ls[1] == "(") { push(prefix(ls[5])+ls[2]+nfs.PT+ls[5]); break } + case "func": if (ls[1] == "(") { var p = ls.indexOf(")") + push(prefix(ls[p+1])+ls[2]+nfs.PT+ls[p+1]+"()"); break + } case "const": case "var": if (ls[1] == "(") { break } - case "type": push(prefix(ls[1], opts.package)+ls[1]); break + case "type": push(prefix(ls[1])+ls[1]+(ls[0]=="type"? "{}": "")); break } opts.stack = [ls[0]] } else if (indent == 4 && opts.stack[0] == "func") { if (text.indexOf("MergeCommands(") > -1) { opts.block = "cmds" } else if (text.indexOf("}") == 0) { opts.block = "" } } else if (indent == 8) { @@ -184,7 +199,7 @@ Volcanos(chat.ONSYNTAX, { if (isKey()) { push("+ "+opts.cmds+lex.SP+ls[0]) } } }, - }, mod: {prefix: {"//": code.COMMENT}, keyword: {"go": code.KEYWORD, "module": code.KEYWORD, "require": code.KEYWORD, "replace": code.KEYWORD}}, sum: {}, + }, mod: {prefix: {"//": code.COMMENT}, split: {operator: "(=>)"}, keyword: {"go": code.KEYWORD, "module": code.KEYWORD, "require": code.KEYWORD, "replace": code.KEYWORD}}, sum: {}, js: {prefix: {"// ": code.COMMENT}, regexp: {"[A-Z_0-9]+": code.CONSTANT}, keyword: { "let": code.KEYWORD, "const": code.KEYWORD, "var": code.KEYWORD, @@ -239,7 +254,6 @@ Volcanos(chat.ONSYNTAX, { }, }, json: {split: {operator: "{[:,]}"}, keyword: {"true": code.CONSTANT, "false": code.CONSTANT}}, css: {prefix: {"// ": code.COMMENT, "/* ": code.COMMENT}, split: {operator: "{[(.,:;&>=)]}"}, - func: function(can, push, text) { text.indexOf("/* ") == 0 && push(can.base.trimPrefix(can.base.trimSuffix(text, " */"), "/* ")) }, regexp: { "[-0-9]+deg": code.CONSTANT, "[-0-9]+rem": code.CONSTANT, @@ -314,6 +328,7 @@ Volcanos(chat.ONSYNTAX, { "url": code.FUNCTION, "contexts": code.CONSTANT, }, include: ["html"], + func: function(can, push, text) { text.indexOf("/* ") == 0 && push(can.base.trimPrefix(can.base.trimSuffix(text, " */"), "/* ")) }, }, html: {split: {operator: ""}, keyword: { "DOCTYPE": code.KEYWORD, "html": code.KEYWORD, "head": code.KEYWORD, "body": code.KEYWORD, diff --git a/plugin/local/code/repos.css b/plugin/local/code/repos.css index cb8f85ff..f31f8443 100644 --- a/plugin/local/code/repos.css +++ b/plugin/local/code/repos.css @@ -2,7 +2,7 @@ fieldset.repos div.output>* { margin:auto; } fieldset.repos div.output table { - border:solid 1px #e2e2e2; + border: #e2e2e2solid 1px; border-radius:5px; color:#4183c4; margin-top:20px; @@ -107,4 +107,4 @@ fieldset.repos div.output>div.commit>span { flex:1; text-align:center; margin:auto; -} \ No newline at end of file +} diff --git a/plugin/local/code/vimer.css b/plugin/local/code/vimer.css index b71e37e1..0ff1a565 100644 --- a/plugin/local/code/vimer.css +++ b/plugin/local/code/vimer.css @@ -6,7 +6,7 @@ fieldset.vimer>div.output>div.layout>div.layout div.content div.complete { backg fieldset.vimer>div.output>div.layout>div.layout div.content div.complete div.prefix { color:transparent; white-space:pre; float:left; } fieldset.vimer>div.output>div.layout>div.layout div.content div.complete table.content thead { display:none; } fieldset.vimer>div.output>div.layout>div.layout div.content div.complete table.content { padding-left:5px; width:unset; max-width:600px; display:block; } -fieldset.vimer>div.output>div.layout>div.layout>div.layout div.content { border-left:gray solid 1px; border-top:gray solid 1px; } +fieldset.vimer>div.output>div.layout>div.layout>div.layout div.content { border-left:var(--box-border); border-top:var(--box-border); } fieldset.vimer>div.output>div.layout>div.layout div.content.normal tr.line.select>td.line { background-color:blue; color:white; } fieldset.vimer>div.output>div.layout>div.layout div.content.insert tr.line.select>td.line { background-color:red; color:white; } fieldset.vimer>div.output>div.layout>div.layout div.content.insert div.complete:not(.hide) { display:block; top:unset; } @@ -20,4 +20,4 @@ body.black fieldset.vimer>div.output>div.layout>div.layout div.content.normal in body.black fieldset.vimer>div.output>div.layout>div.layout div.content.insert input.current { caret-color:yellow; } body.black fieldset.vimer>div.output>div.layout>div.layout div.content div.complete table.content { background-color:#061c3ceb; } body.white fieldset.vimer>div.output>div.layout>div.layout div.content div.complete table.content { background-color:aliceblue; } -body.white fieldset.vimer>div.output>div.layout>div.layout div.content.insert input.current { caret-color:black; } \ No newline at end of file +body.white fieldset.vimer>div.output>div.layout>div.layout div.content.insert input.current { caret-color:black; } diff --git a/plugin/local/team/plan.css b/plugin/local/team/plan.css index 8c47dcd7..6c8f1760 100644 --- a/plugin/local/team/plan.css +++ b/plugin/local/team/plan.css @@ -1,18 +1,18 @@ fieldset.plan>div.output td.content { position:relative; } -fieldset.plan>div.output table.content.plan th { text-align:center; } -fieldset.plan>div.output table.content.plan td { vertical-align:top; } -fieldset.plan>div.output table.content.plan td.over { border:red solid 1px; } -fieldset.plan>div.output table.content.plan td.select { background-color:var(--hover-bg-color); } -fieldset.plan>div.output table.content.plan td:hover { background-color:var(--hover-bg-color); } -fieldset.plan>div.output table.content.plan td.over { background-color:var(--hover-bg-color); } -fieldset.plan>div.output table.content.plan td div { color:white; } -fieldset.plan>div.output table.content.plan td div.date { color:gray; } -fieldset.plan>div.output table.content.plan td div.date span.lunar { font-size:12px; } -fieldset.plan>div.output table.content.plan td div.date span.lunar.fest { color:red; } -fieldset.plan>div.output table.content.plan td div.date span.lunar.term { color:green; } -fieldset.plan>div.output table.content.plan td div.prepare { background-color:#0000ff70; } -fieldset.plan>div.output table.content.plan td div.process { background-color:#00800070; } -fieldset.plan>div.output table.content.plan td div.cancel { background-color:#ff000070; } -fieldset.plan>div.output table.content.plan td div.finish { background-color:gray; } -fieldset.plan>div.output table.content.plan tr:first-child { height:30px; position:sticky; top:2px; } -fieldset.plan>div.output table.content.plan th:first-child { width:40px; position:sticky; left:2px; } +fieldset.plan>div.output>div.layout>div.layout>div.content>table.content td { vertical-align:top; } +fieldset.plan>div.output>div.layout>div.layout>div.content>table.content td.over { border:red solid 1px; } +fieldset.plan>div.output>div.layout>div.layout>div.content>table.content td.select { background-color:var(--hover-bg-color); box-shadow:var(--box-shadow); } +fieldset.plan>div.output>div.layout>div.layout>div.content>table.content td:hover { background-color:var(--hover-bg-color); } +fieldset.plan>div.output>div.layout>div.layout>div.content>table.content td.over { background-color:var(--hover-bg-color); } +fieldset.plan>div.output>div.layout>div.layout>div.content>table.content td div { color:white; padding:10px; margin:10px; } +fieldset.plan>div.output>div.layout>div.layout>div.content>table.content td div.date { color:gray; } +fieldset.plan>div.output>div.layout>div.layout>div.content>table.content td div.date span.lunar { font-size:12px; } +fieldset.plan>div.output>div.layout>div.layout>div.content>table.content td div.date span.lunar.fest { color:red; } +fieldset.plan>div.output>div.layout>div.layout>div.content>table.content td div.date span.lunar.term { color:green; } +fieldset.plan>div.output>div.layout>div.layout>div.content>table.content td div.prepare { background-color:#0000ff70; } +fieldset.plan>div.output>div.layout>div.layout>div.content>table.content td div.process { background-color:#00800070; } +fieldset.plan>div.output>div.layout>div.layout>div.content>table.content td div.cancel { background-color:#ff000070; text-decoration:line-through; } +fieldset.plan>div.output>div.layout>div.layout>div.content>table.content td div.finish { background-color:gray; } +fieldset.plan>div.output>div.layout>div.layout>div.content>table.content tr:first-child { height:30px; position:sticky; top:2px; } +fieldset.plan>div.output>div.layout>div.layout>div.content>table.content th:first-child { width:40px; position:sticky; left:2px; } +fieldset.plan>div.output>div.layout>div.layout>div.profile>table.content tr:first-child { height:30px; position:sticky; top:2px; } diff --git a/plugin/local/team/plan.js b/plugin/local/team/plan.js index 17b8b9c2..25c94b82 100644 --- a/plugin/local/team/plan.js +++ b/plugin/local/team/plan.js @@ -1,9 +1,7 @@ -Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear(can, target), can._display_heights = {} - can.list = {}; var ls = can.misc.SearchHash(can) - can.ui = can.onappend.layout(can), can.onmotion.hidden(can, can.ui.profile), can.onmotion.hidden(can, can.ui.display) - can.onmotion.hidden(can, can.ui.project) - can.onimport[can.Option("scale")||team.WEEK](can, msg), can.Status(mdb.COUNT, msg.Length()), can.onimport.layout(can) - var item; if (can.isCmdMode() && ls.length > 0) { item = can.list[can.core.Keys(ls[0], ls[1])] } else if (can.sup.task) { item = can.list[can.core.Keys(can.sup.task.zone, can.sup.task.id)] } item && item.click() +Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear(can, target), can._display_heights = {}, can.list = {}; var ls = can.misc.SearchHash(can) + can.ui = can.onappend.layout(can), can.onmotion.hidden(can, can.ui.profile), can.onmotion.hidden(can, can.ui.display), can.isCmdMode() || can.onmotion.hidden(can, can.ui.project) + can.onimport[can.Option("scale")||team.WEEK](can, msg), can.Status(mdb.COUNT, msg.Length()), can.ui.filter.placeholder = `search in ${ msg.Length() } items`, can.onimport.layout(can) + var item; if (can.isCmdMode() && ls.length > 0) { item = can.list[can.core.Keys(ls)] } else if (can.sup.task) { item = can.list[can.core.Keys(can.sup.task.pod, can.sup.task.zone, can.sup.task.id)] } item && item.click() }, _content: function(can, msg, head, list, key, get, set) { var begin_time = can.base.Date(can.Option(team.BEGIN_TIME)); can.sup.task && (can.sup.task._target = null) var hash = {}; msg.Table(function(value, index) { var k = key(can.base.Date(value.begin_time)); hash[k] = (hash[k]||[]).concat([value]) }) @@ -25,7 +23,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear( } }, draggable: time != undefined, title: can.onexport.title(can, task), _init: function(target) { var item = can.onimport.item(can, {nick: task.name+nfs.DF+task.text}, function() { can.onmotion.delay(can, function() { can.onmotion.select(can, can.ui.content, html.TD, target.parentNode), can.onimport._profile(can, task), can.onimport._display(can, task), can.onimport.layout(can) - }) }, null, can.ui.project); task._target = target, target.onclick = function(event) { item.click() }, can.list[can.core.Keys(task.zone, task.id)] = target + }) }, null, can.ui.project); task._target = target, target.onclick = function(event) { item.click() }, can.list[can.core.Keys(task.pod, task.zone, task.id)] = target }} }), } }, @@ -43,7 +41,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear( }, _display: function(can, task) { can.onmotion.toggle(can, can.ui.display, true) if (can.onmotion.cache(can, function() { return can.sup.task = task, can.Status(task), [task.pod, task.zone, task.id].join(nfs.PT) }, can.ui.display)) { return } - task[ctx.EXTRA_INDEX] && can.onappend.plugin(can, {index: task[ctx.EXTRA_INDEX], args: task[ctx.EXTRA_ARGS], height: can.ConfHeight()/2-2*html.ACTION_HEIGHT}, function(sub, meta) { + task[ctx.EXTRA_INDEX] && can.onappend.plugin(can, {space: task.pod, index: task[ctx.EXTRA_INDEX], args: task[ctx.EXTRA_ARGS], height: can.ConfHeight()/2-2*html.ACTION_HEIGHT}, function(sub, meta) { sub.run = function(event, cmds, cb) { can.request(event, kit.Dict(team.TASK_POD, task.pod, team.TASK_ZONE, task.zone, team.TASK_ID, task.id)) can.page.style(can, sub._output, html.MAX_HEIGHT, ""), can.runAction(event, ice.RUN, [task[mdb.ZONE], task[mdb.ID]].concat(cmds), cb) } @@ -62,7 +60,6 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear( }, week: function(can, msg) { var head = can.onexport.head(can, team.HOUR) var list = [0]; for (var i = 7; i < 24; i++) { list.push(can.base.Number(i, 2)) } - // var list = [0]; for (var i = 7; i < 24; i++) { list.push(can.base.Number(i, 2)+":00") } function key(time) { return time.getDay()+" "+can.base.Number(time.getHours(), 2) } function get(begin_time, col, row, hash) { return hash[col-1+" "+list[row]] } function set(begin_time, col, row) { return can.base.Time(can.base.DateAdd(begin_time, -begin_time.getDay()+col-1), "%y-%m-%d ")+list[row] } @@ -130,7 +127,7 @@ Volcanos(chat.ONACTION, {list: [ }, insertTask: function(event, can, time) { var msg = can.sup.request(event, {begin_time: time}) can.user.input(event, can, can.Conf([ctx.FEATURE, mdb.INSERT]), function(args) { - can.runAction(event, mdb.INSERT, [mdb.ZONE, args[1], team.BEGIN_TIME, time].concat(args)) + can.runAction(event, mdb.INSERT, [web.SPACE, args[1], mdb.ZONE, args[3], team.BEGIN_TIME, time].concat(args.slice(4))) }) }, modifyTask: function(event, can, task, key, value) { can.runAction(can.request(event, task, can.Option()), mdb.MODIFY, [key, value], function() { can.Update() }) }, @@ -147,9 +144,9 @@ Volcanos(chat.ONACTION, {list: [ score: function(event, can, key, value) { can.onaction._filter(event, can, key, value) }, view: function(event, can, key, value) { can.Action(key, value), can.onmotion.clear(can, can.ui.project), can.onmotion.clear(can, can.ui.content), can.core.CallFunc([can.onimport, can.Option("scale")], [can, can._msg]) }, }) -Volcanos(chat.ONEXPORT, {list: [mdb.COUNT, team.BEGIN_TIME, mdb.ZONE, mdb.ID, mdb.TYPE, mdb.NAME, mdb.TEXT], - span: function(can) { return kit.Dict(team.DAY, 24*3600*1000, team.WEEK, 7*24*3600*1000, team.MONTH, 30*24*3600*1000, team.YAER, 365*24*3600*1000, team.LONG, 365*24*3600*1000)[can.Option("scale")]||0 }, - hash: function(can, task) { if (!can.isCmdMode()) { return } location.hash = [task.zone, task.id].join(nfs.DF) }, +Volcanos(chat.ONEXPORT, {list: [mdb.COUNT, ice.POD, team.BEGIN_TIME, mdb.ZONE, mdb.ID, mdb.TYPE, mdb.NAME, mdb.TEXT], + span: function(can) { return kit.Dict(team.DAY, 24*3600*1000, team.WEEK, 7*24*3600*1000, team.MONTH, 30*24*3600*1000, team.YEAR, 365*24*3600*1000, team.LONG, 365*24*3600*1000)[can.Option("scale")]||0 }, + hash: function(can, task) { if (!can.isCmdMode()) { return } location.hash = [task.pod, task.zone, task.id].join(nfs.DF) }, head: function(can, scale) { if ([team.YEAR, team.LONG].indexOf(scale) > -1) { return } return [scale].concat(can.user.time(can, "", "%W")) }, name: function(can, task) { return task.name }, text: function(can, task) { return task.name+": "+(task.text||"") }, diff --git a/plugin/local/wiki/word.css b/plugin/local/wiki/word.css index 0caa7fac..eea070c0 100644 --- a/plugin/local/wiki/word.css +++ b/plugin/local/wiki/word.css @@ -14,8 +14,8 @@ fieldset.word>div.output img { max-height:100%; max-width:100%; } fieldset.word>div.output video { max-height:100%; width:100%; } fieldset.word>div.output iframe { height:480px; width:100%; } fieldset.word>div.output svg.story[data-index] text { cursor:pointer; } -fieldset.word>div.output input.story[type=button] { font-family:system-ui; font-weight:bold; padding:20px 40px; margin:10px; height:64px; } -fieldset.word>div.output fieldset.web.code.inner.output div.output td.line { border-right:gray solid 1px; } +fieldset.word>div.output input.story[type=button] { font-family:system-ui; font-weight:bold; padding:20px 40px; margin:10px; height:64px; box-shadow:var(--box-shadow); } +fieldset.word>div.output fieldset.web.code.inner.output div.output td.line { border-right:var(--box-border); } fieldset.word>div.output fieldset.story { margin:20px 0; } fieldset.word>div.output fieldset.story>form.option>div.icon.delete { display:none; } diff --git a/plugin/state.js b/plugin/state.js index 43005576..3e92e602 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -194,13 +194,13 @@ Volcanos(chat.ONACTION, {list: [ }) Volcanos(chat.ONEXPORT, { args: function(can) { return can.page.SelectArgs(can, can._option, "", function(target) { return target.value }) }, - output: function(can, msg) {}, action: function(can, button, line) {}, record: function(can, value, key, line) {}, + output: function(can, msg) {}, action: function(can, button, line) {}, record: function(can, value, key, data) {}, marginTop: function() { return 0 }, marginBottom: function() { return 0 }, actionHeight: function(can) { return can.page.ClassList.has(can, can._target, html.OUTPUT)? 0: html.ACTION_HEIGHT }, statusHeight: function(can) { return can.page.ClassList.has(can, can._target, html.OUTPUT) || !can.page.isDisplay(can._status) || can._status.innerHTML == "" || (can._target.offsetHeight > 0 && can._status.offsetHeight == 0)? 0: html.ACTION_HEIGHT }, title: function(can, title) { can.isCmdMode() && can.user.title(title) }, link: function(can) { var meta = can.Conf(), args = can.Option(); can.misc.Search(can, log.DEBUG) == ice.TRUE && (args[log.DEBUG] = ice.TRUE) - args.pod = meta.space||meta.pod, args.cmd = meta.index||can.core.Keys(meta.ctx, meta.cmd) + args.pod = meta._space||meta.space||meta.pod, args.cmd = meta.index||can.core.Keys(meta.ctx, meta.cmd) return can.misc.MergePodCmd(can, args, true) }, }) diff --git a/plugin/story/json.css b/plugin/story/json.css index 72c29b5f..9082e32c 100644 --- a/plugin/story/json.css +++ b/plugin/story/json.css @@ -1,6 +1,6 @@ div.output.json div.item:hover { background-color:transparent; color:unset; } div.output.json div.item div.item { padding-left:15px; border:transparent solid 1px; border-left:lightblue dashed 1px; margin-left:5px; } -div.output.json div.item div.item:hover { border:gray solid 1px; } +div.output.json div.item div.item:hover { border:var(--box-border); } div.output.json div.item label.nonce { color:#9cbeca4f; } div.output.json div.item span.string { color:orange; } -div.output.json label { user-select:none; } \ No newline at end of file +div.output.json label { user-select:none; } diff --git a/plugin/table.js b/plugin/table.js index 4692cd49..592d6253 100644 --- a/plugin/table.js +++ b/plugin/table.js @@ -93,33 +93,47 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear( }, zone._target = sub._target, can.ui.zone[zone.name].refresh = function() { sub.Update() } }, zone._target) } }, zone: function(can, list, target) { - return can.page.Append(can, target, can.core.List(list, function(zone) { can.base.isString(zone) && (zone = {name: zone}); return zone && {view: [[html.ZONE, zone.name]], list: [ - {view: html.ITEM, inner: can.user.trans(can, zone.name), _init: function(target) { zone._legend = target }, onclick: function() { - if (zone._delay_init) { zone._delay_init(zone._target, zone), delete(zone._delay_init) } - can.onmotion.toggle(can, zone._action), can.onmotion.toggle(can, zone._target) - }, oncontextmenu: function(event) { var menu = zone._menu - menu? can.user.carteRight(event, can, menu.meta, menu.list||can.core.Item(menu.meta), can.base.isFunc(menu)? menu: function(event, button, meta, carte) { - can.runAction(event, button), carte.close() - }): can.onmotion.clearCarte(can) - }}, - {view: html.ACTION, _init: function(target) { zone._action = target - can.onappend._action(can, [{type: html.TEXT, name: mdb.SEARCH, _init: function(target) { zone._search = target }, onkeyup: function(event) { - if (event.target.value == "") { can.page.Select(can, zone._target, html.DIV_EXPAND, function(target) { can.page.ClassList.del(can, target, cli.OPEN) }) } - can.page.Select(can, zone._target, html.DIV_LIST, function(item) { can.onmotion.toggle(can, item, event.target.value != "") }) - can.onmotion.delayOnce(can, function() { can.onkeymap.selectItems(event, can, zone._target) }, event.target.value.length<3? 500: 150) - }}], target, {}) - }}, - {view: html.LIST, _init: function(target) { can.ui.zone = can.ui.zone||{}, can.ui.zone[zone.name] = zone, zone._target = target - zone._total = function(total) { return can.page.Modify(can, zone._search, {placeholder: "search in "+total+" items"}), total } - zone._icon = function(list) { - can.page.Select(can, zone._legend, html.SPAN_ICON, function(target) { can.page.Remove(can, target) }) - can.core.Item(list, function(name, button) { can.onimport._icon(can, name, button, zone._legend) }) - } - zone.refresh = function() { can.onmotion.clear(can, target), zone._init(target, zone) } - can.base.isFunc(zone._init) && (zone._menu = zone._init(target, zone)||zone._menu) - if (zone._delay_init) { can.onmotion.hidden(can, zone._action), can.onmotion.hidden(can, zone._target) } - }}, - ]} })) + return can.page.Append(can, target, can.core.List(list, function(zone) { can.base.isString(zone) && (zone = {name: zone}); if (!zone) { return } + zone._layout = function() { var height = target.offsetHeight, count = 0 + can.page.SelectChild(can, target, "", function(target) { + can.page.SelectChild(can, target, html.DIV_ITEM, function(target) { height -= target.offsetHeight }) + can.page.SelectChild(can, target, html.DIV_ACTION, function(target) { height -= target.offsetHeight }) + can.page.SelectChild(can, target, html.DIV_LIST, function(target) { count += can.page.isDisplay(target)? 1: 0 }) + }) + count && can.page.SelectChild(can, target, "", function(target) { + can.page.SelectChild(can, target, html.DIV_LIST, function(target) { + can.page.style(can, target, html.HEIGHT, can.page.isDisplay(target)? height/count: "") + }) + }) + } + return {view: [[html.ZONE, zone.name]], list: [ + {view: html.ITEM, inner: can.user.trans(can, zone.name), _init: function(target) { zone._legend = target }, onclick: function() { + if (zone._delay_init) { zone._delay_init(zone._target, zone), delete(zone._delay_init) } + can.onmotion.toggle(can, zone._action), can.onmotion.toggle(can, zone._action.nextSibling), zone._toggle && zone._toggle() + }, oncontextmenu: function(event) { var menu = zone._menu + menu? can.user.carteRight(event, can, menu.meta, menu.list||can.core.Item(menu.meta), can.base.isFunc(menu)? menu: function(event, button, meta, carte) { + can.runAction(event, button), carte.close() + }): can.onmotion.clearCarte(can) + }}, + {view: html.ACTION, _init: function(target) { zone._action = target + can.onappend._action(can, [{type: html.TEXT, name: mdb.SEARCH, _init: function(target) { zone._search = target }, onkeyup: function(event) { + if (event.target.value == "") { can.page.Select(can, zone._target, html.DIV_EXPAND, function(target) { can.page.ClassList.del(can, target, cli.OPEN) }) } + can.page.Select(can, zone._target, html.DIV_LIST, function(item) { can.onmotion.toggle(can, item, event.target.value != "") }) + can.onmotion.delayOnce(can, function() { can.onkeymap.selectItems(event, can, zone._target) }, event.target.value.length<3? 500: 150) + }}], target, {}) + }}, + {view: html.LIST, _init: function(target) { can.ui.zone = can.ui.zone||{}, can.ui.zone[zone.name] = zone, zone._target = target + zone._total = function(total) { return can.page.Modify(can, zone._search, {placeholder: "search in "+total+" items"}), total } + zone._icon = function(list) { + can.page.Select(can, zone._legend, html.SPAN_ICON, function(target) { can.page.Remove(can, target) }) + can.core.Item(list, function(name, button) { can.onimport._icon(can, name, button, zone._legend) }) + } + zone.refresh = function() { can.onmotion.clear(can, target), zone._init(target, zone) } + can.base.isFunc(zone._init) && (zone._menu = zone._init(target, zone)||zone._menu) + if (zone._delay_init) { can.onmotion.hidden(can, zone._action), can.onmotion.hidden(can, zone._target) } + }}, + ]} + })) }, tree: function(can, list, field, split, cb, target, node) { node = node||{"": target}; can.core.List(list, function(item) { item[field] && can.core.List(item[field].split(split), function(value, index, array) { if (!value) { return } diff --git a/proto.js b/proto.js index 5c3910b2..cbfb687a 100644 --- a/proto.js +++ b/proto.js @@ -78,11 +78,12 @@ var mdb = { QS: ice.QS, AT: ice.AT, EQ: ice.EQ, FS: ice.FS, } -var web = {CHAT: "chat", +var web = {CHAT: "chat", LINK: "link", SPACE: "space", DREAM: "dream", SHARE: "share", SPIDE: "spide", WEBSITE: "website", DRAW: "draw", PLAY: "play", CLEAR: "clear", REFRESH: "refresh", RESIZE: "resize", FILTER: "filter", INPUT: "input", CANCEL: "cancel", SUBMIT: "submit", UPLOAD: "upload", DOWNLOAD: "download", TOIMAGE: "toimage", SHARE_CACHE: "/share/cache/", SHARE_LOCAL: "/share/local/", + WORKER: "worker", SERVER: "server", GATEWAY: "gateway", AT: "@", QS: "?", HTTP: "http", GET: "GET", PUT: "PUT", POST: "POST", DELETE: "DELETE",