diff --git a/frame.js b/frame.js index e6898b26..11f53dfb 100644 --- a/frame.js +++ b/frame.js @@ -570,12 +570,15 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) { }, }, scrollHold: function(can, cb, target) { target = target || can._output; var left = target.scrollLeft; cb(), target.scrollLeft = left }, - scrollIntoView: function(can, target) { - var offset = target.offsetTop - target.parentNode.scrollTop - can.core.Timer({interval: 10, length: offset/10}, function() { - target.parentNode.scrollTop += 10 + scrollIntoView: function(can, target) { if (can._scroll) { return } can._scroll = true + var offset = target.offsetTop - target.parentNode.scrollTop, step = offset < 0? -20: 20 + if (Math.abs(offset) > 1000) { + return target.parentNode.scrollTop = target.offsetTop, delete(can._scroll) + } + can.core.Timer({interval: 10, length: offset/step}, function() { + target.parentNode.scrollTop += step }, function() { - target.parentNode.scrollTop = target.offsetTop + target.parentNode.scrollTop = target.offsetTop, delete(can._scroll) }) }, clearFloat: function(can) { diff --git a/index.css b/index.css index cb1a6bd9..c37e6f48 100644 --- a/index.css +++ b/index.css @@ -532,9 +532,10 @@ body.windows fieldset.inner>div.output { overflow:hidden; } body.windows fieldset.inner>div.output>div.layout>div.layout>div.profile { overflow:hidden; } /* scrollbar */ div.scrollbar { -background-color:#0000ff66; -font-size:8px !important; line-height:10px; -border-radius:10px; position:absolute; visibility:hidden; + /* background-color:#0000ff66; */ + background-color:var(--hover-bg-color); + font-size:8px !important; line-height:10px; + border-radius:10px; position:absolute; visibility:hidden; } div.scrollbar.vertical { writing-mode:tb; width:10px; right:0; top:0; transition:width .3s 1s; } div.scrollbar.vertical:hover { width:30px; transition:width .1s; font-size:24px !important; } diff --git a/lib/user.js b/lib/user.js index e6ac4d24..40e8b26a 100644 --- a/lib/user.js +++ b/lib/user.js @@ -125,9 +125,10 @@ Volcanos("user", { function remove_sub(carte) { carte._sub && can.page.Remove(can, carte._sub._target), delete(carte._sub) } parent? remove_sub(parent): can.onmotion.clearCarte(can) meta = meta||can.ondetail||can.onaction||{}, list = can.base.getValid(list, meta.list, can.core.Item(meta)), trans = trans||meta._trans; if (!list || list.length == 0) { return } var _events = event._events||event - function click(event, button) { can.misc.Event(event, can, function() { can.request(event, {action: button}), can.onkeymap.prevent(event), event._events = _events - if (can.base.isFunc(cb) && cb(event, button, meta, carte)) { return } - (meta[button]? can.core.CallFunc([meta, button], {event: event, can: can, msg: msg, button: button}): can.Update(event, [ctx.ACTION, button])) || can.onmotion.clearCarte(can) + function click(event, button) { can.misc.Event(event, can, function() { can.request(event, {action: button}), can.onkeymap.prevent(event), event._events = _events; + (can.base.isFunc(cb)? cb(event, button, meta, carte): + meta[button]? can.core.CallFunc([meta, button], {event: event, can: can, msg: msg, button: button}): + can.Update(event, [ctx.ACTION, button])) || can.onmotion.clearCarte(can) }) } var isinput = can.page.tagis(event.target, html.INPUT) var ui = can.page.Append(can, document.body, [{view: [[chat.CARTE, meta._style||can.base.replaceAll(can.ConfIndex()||"", nfs.PT, lex.SP)||"", chat.FLOAT]], list: can.core.List(list, function(item, index) { diff --git a/plugin/local/wiki/data.js b/plugin/local/wiki/data.js index 4f51f1d5..bc23976f 100644 --- a/plugin/local/wiki/data.js +++ b/plugin/local/wiki/data.js @@ -1,7 +1,7 @@ -Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.clear(can) +Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { if (can.Option(mdb.TYPE)) { return can.onimport[can.Option(mdb.TYPE)](can, msg, can.Option(mdb.FIELD)) } - can.ui = can.onlayout.display(can), can.table = can.onappend.table(can, msg, function(value, key, index, line) { return can.onimport._value(can, value) }, can.ui.content) - can.base.isFunc(cb) && cb(msg), can.onappend._status(can, msg.append), can.onaction._compute(event, can) + can.ui = can.onappend.layout(can), can.table = can.onappend.table(can, msg, function(value, key, index, line) { return can.onimport._value(can, value) }, can.ui.content) + cb && cb(msg), can.onappend._status(can, msg.append), can.onaction._compute(event, can) }, _value: function(can, value) { return {text: [value, html.TD], oncontextmenu: function(event) { @@ -19,7 +19,7 @@ Volcanos(chat.ONFIGURE, { "最小": function(event, can, res, td, index) { (res[index] === undefined || parseFloat(td.innerText) < parseFloat(res[index])) && (res[index] = parseFloat(td.innerText)) }, "平均": function(event, can, res, td, index, cols, rows, nrow) { res[index] = parseFloat(td.innerText) + (res[index]||0); if (nrow == rows.length - 1) { res[index] = res[index] / nrow } }, }) -Volcanos(chat.ONACTION, {list: [ice.SAVE, +Volcanos(chat.ONACTION, {list: [nfs.SAVE, [ice.MODE, "全选", "多选", "块选", "反选", "拖动", "编辑"], [ice.EXEC, "求和", "最大", "最小", "平均"], ], diff --git a/plugin/local/wiki/word.css b/plugin/local/wiki/word.css index 363393d1..999ec899 100644 --- a/plugin/local/wiki/word.css +++ b/plugin/local/wiki/word.css @@ -3,7 +3,6 @@ fieldset.word>div.output>p { margin:20px auto; } fieldset.word>div.output div.story.flex { display:flex; justify-content:center; } fieldset.word>div.output div.story.flex>* { padding:20px; } fieldset.word>div.output h2.story[data-type=spark][data-name=title] { text-align:center; } -// fieldset.word>div.output h2 { margin-top:40px; } fieldset.word>div.output h3 { margin-top:20px; } fieldset.word>div.output table { width:100%; } fieldset.word>div.output img { max-height:100%; max-width:100%; } @@ -29,15 +28,13 @@ div.story[data-type=spark_tabs]>div.story:not(.select) { display:none; } fieldset.word.play.float { top:0; } fieldset.word.play.float>div.action { display:contents; } -fieldset.word.play.float>div.status { clear:none; } +fieldset.word.play.float>div.status { clear:none; display:contents; } fieldset.word.play.float>div.output>div.project { background-color:#4682b46b; padding:10px; position:fixed; right:0; top:32px; z-index:10; } fieldset.word.play.float div.content div.page { display:none; } -// fieldset.word.play.float div.content div.page { text-align:center; display:none; } fieldset.word.play.float div.content div.page.show { display:block; } fieldset.word.play.float div.content div.page ul { text-align:left; } -// fieldset.word.play.float div.content div.page fieldset { text-align:center; } fieldset.word.play.float div.content.grid div.page { background-color:#a4cbecb5; margin:10px; height:320px; width:30%; overflow:auto; display:block; float:left; } fieldset.word.play.float h1 { text-align:center; } fieldset.word.play.float h2 { text-align:center; } -fieldset.word.play.float svg { display:block; margin:0 auto; } fieldset.word.play.float h3 { text-align:center; } +fieldset.word.play.float svg { display:block; margin:0 auto; } diff --git a/plugin/local/wiki/word.js b/plugin/local/wiki/word.js index aa3b62ca..ee8f925d 100644 --- a/plugin/local/wiki/word.js +++ b/plugin/local/wiki/word.js @@ -1,14 +1,14 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.Conf(html.PADDING, 10) - can.onmotion.clear(can), can.page.Modify(can, target, msg.Result()), can.onimport._display(can, target) + can.page.Modify(can, target, msg.Results()), can.onimport._content(can, target) can.onmotion.delay(can, function() { can.onappend.scroll(can, can._output) }) }, - _display: function(can, target, cb) { can.onappend.style(can, web.WIKI_WORD) + _content: function(can, target, cb) { can.onappend.style(can, web.WIKI_WORD) can.page.Select(can, target, wiki.STORY_ITEM, function(target) { var meta = target.dataset||{}; cb && cb(target, meta) can.core.CallFunc([can.onimport, can.onimport[meta.name]? meta.name: meta.type||target.tagName.toLowerCase()], [can, meta, target]) var _meta = can.base.Obj(meta.meta); _meta && _meta.style && can.page.style(can, target, can.base.Obj(_meta.style)) meta.style && can.page.style(can, target, can.base.Obj(meta.style)) }) - can.page.Select(can, target, "a", function(target) { + can.page.Select(can, target, html.A, function(target) { target.innerText = target.innerText || target.href, target.href = target.href || target.innerText, target.target = target || "_blank" }) }, @@ -16,20 +16,20 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.Conf(html.PADDI nav = can.onmotion.clear(can, nav||can.page.insertBefore(can, [wiki.NAVMENU], can._output)), can.sup._navmenu = nav can.onimport.list(can, can.base.Obj(meta.data), function(event, item) { var link = item.meta.link; if (!link || link == can.Option(nfs.PATH)) { return false } - if (can.base.beginWith(link, web.HTTP, nfs.PS)) { return can.user.opens(link) } - if (can.onmotion.cache(can, function() { can.isCmdMode() && can.user.title(item.meta.name); return can.Option(nfs.PATH, link) })) { return } + if (can.base.beginWith(link, nfs.PS, web.HTTP)) { return can.user.opens(link) } + if (can.onmotion.cache(can, function() { return can.onexport.title(can, item.meta.name), can.Option(nfs.PATH, link) })) { return } return can.sup.Update(event, [link]) }, nav) + can.onimport.layout(can) }, - premenu: function(can, meta, target) { can.page.Select(can, can._output, can.page.Keys(wiki.H2, wiki.H3), function(_target) { - can.onimport.item(can, {name: _target.innerHTML}, function() { _target.scrollIntoView() }, function() {}, target), _target.onclick = function(event) { target.scrollIntoView() } + premenu: function(can, meta, target) { can.page.Select(can, can._output, can.page.Keys(html.H2, html.H3), function(_target) { + can.onimport.item(can, {name: _target.innerHTML}, function() { can.onmotion.scrollIntoView(can, _target) }, function() {}, target) + _target.onclick = function(event) { can.onmotion.scrollIntoView(can, target) } }) }, - endmenu: function(can, meta, target) { can.page.Select(can, can._output, can.page.Keys(wiki.H2, wiki.H3), function(_target) { - can.onimport.item(can, {name: _target.innerHTML}, function() { _target.scrollIntoView() }, function() {}, target) + endmenu: function(can, meta, target) { can.page.Select(can, can._output, can.page.Keys(html.H2, html.H3), function(_target) { + can.onimport.item(can, {name: _target.innerHTML}, function() { can.onmotion.scrollIntoView(can, _target) }, function() {}, target) }) }, - title: function(can, meta, target) { - can.isCmdMode() && target.tagName == "H1" && can.user.title(meta.text) - }, + title: function(can, meta, target) { can.page.tagis(target, html.H1) && can.onexport && can.onexport.title(can, meta.text) }, spark: function(can, meta, target) { if (meta[mdb.NAME] == html.INNER) { return can.onmotion.copy(can, target) } can.page.Select(can, target, "kbd,samp", function(item) { can.onmotion.copy(can, item, function() { @@ -46,6 +46,9 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.Conf(html.PADDI field: function(can, meta, target) { var item = can.base.Obj(meta.meta), width = item.width can.onappend.plugin(can, item, function(sub) { can._plugins = (can._plugins||[]).concat([sub]) sub.onimport.size(sub, can.base.Min(can.ConfHeight()/2, 300, 600), sub.Conf("_width", width)||(can.ConfWidth()-2*can.Conf(html.PADDING)), true) + var size = sub.onimport.size; sub.onimport.size = function(can, height, width, auto, mode) { size(can, height, width, auto, mode) + can.page.style(can, sub._output, html.MAX_HEIGHT, "", "overflow-y", "hidden") + } can.core.Value(item, "auto.cmd") && can.onmotion.delay(function() { sub.runAction(sub.request({}, can.core.Value(item, "opts")), can.core.Value(item, "auto.cmd")) }) }, can._output, target) }, @@ -64,19 +67,19 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.Conf(html.PADDI })); can.page.style(can, ui._target, {left: event.clientX, top: event.clientY}) }) } }, - - layout: function(can, height, width) { can.onmotion.delay(can, function() { padding = can.Conf(html.PADDING) - if (can.isCmdMode()) { can.ConfHeight(can.page.height()), can.ConfWidth(can.page.width()) } - if (can.sup._navmenu) { can.page.style(can, can.sup._navmenu, html.HEIGHT, can.ConfHeight()) - can.page.style(can, can._output, html.HEIGHT, height, html.WIDTH, width = can.ConfWidth()-can.sup._navmenu.offsetWidth, "clear", "none", "float", "left") + layout: function(can) { can.onmotion.delay(can, function() { padding = can.Conf(html.PADDING) + if (can.isCmdMode()) { can.ConfHeight(can.page.height()-html.ACTION_HEIGHT-1), can.ConfWidth(can.page.width()) } + if (can.sup._navmenu) { + can.ConfWidth(can.ConfWidth()-can.sup._navmenu.offsetWidth) + can.page.style(can, can.sup._navmenu, html.HEIGHT, can.ConfHeight()) + can.page.style(can, can._output, html.HEIGHT, can.ConfHeight(), html.WIDTH, can.ConfWidth(), "clear", "none", "float", "left") } else { can.isCmdMode() && can.page.styleHeight(can, can._output, "") } can.core.List(can._plugins, function(sub) { sub.onimport.size(sub, can.base.Min(can.ConfHeight()/2, 300, 600), sub.Conf("_width")||(can.ConfWidth()-2*padding), true) }) - }, 100) }, + }, 0) }, }, [""]) -Volcanos(chat.ONACTION, {_trans: {view: "视图"}, - onkeydown: function(event, can) { can.keylist = can.onkeymap._parse(event, can, "normal", can.keylist) }, +Volcanos(chat.ONACTION, { play: function(event, can) { var list = [], current = [] can.page.Select(can, can._output, wiki.STORY_ITEM, function(item) { can.page.tagis(item, "h1", "h2", "h3") && list.push(current = []), current.push(item) }) can.onappend._init(can, {type: "story word play float", height: can.page.height(), width: can.page.width(), padding: 10}, [], function(sub) { sub._legend.onclick = can._legend.onclick @@ -107,7 +110,7 @@ Volcanos(chat.ONACTION, {_trans: {view: "视图"}, }, can._root._target) }, }) -Volcanos(chat.ONDETAIL, {list: ["删除"], +Volcanos(chat.ONDETAIL, { show: function(sub, which) { sub.page.styleClass(sub, sub.ui.content, chat.CONTENT) sub.page.Select(sub, sub.ui.content, html.DIV_PAGE, function(page, index) { if (index == which || page == which) { @@ -158,14 +161,13 @@ Volcanos(chat.ONDETAIL, {list: ["删除"], }) Volcanos(chat.ONKEYMAP, { _mode: { - normal: { - "n": function(event, can) { can.ondetail.next(can.sub) }, + plugin: { "j": function(event, can) { can.ondetail.next(can.sub) }, + "k": function(event, can) { can.ondetail.prev(can.sub) }, + "n": function(event, can) { can.ondetail.next(can.sub) }, + "p": function(event, can) { can.ondetail.prev(can.sub) }, "ArrowRight": function(event, can) { can.ondetail.next(can.sub) }, "ArrowLeft": function(event, can) { can.ondetail.prev(can.sub) }, - "k": function(event, can) { can.ondetail.prev(can.sub) }, - "p": function(event, can) { can.ondetail.prev(can.sub) }, - "q": function(event, can) { can.ondetail["结束"](event, can.sub) }, "h": function(event, can) { can.ondetail["隐藏"](event, can.sub) }, }, diff --git a/plugin/state.js b/plugin/state.js index 1e34daad..cd1b2412 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -41,11 +41,13 @@ Volcanos(chat.ONIMPORT, { can.page.Select(can, input.parentNode, "span.value", function(target) { target.innerText = value }) return input.value = value, can.Update(event, can.Input([], true), cb), input })[0] }, + _size: function(can, height, width, auto, mode) {}, size: function(can, height, width, auto, mode) { can.Conf("_auto", auto), can.Mode(mode), can.ConfHeight(height), can.ConfWidth(width), height -= can.onexport.actionHeight(can)+can.onexport.statusHeight(can) auto || auto == undefined? (can.page.style(can, can._output, html.HEIGHT, "", html.WIDTH, "", html.MAX_HEIGHT, height, html.MAX_WIDTH, width), can.page.style(can, can._target, html.HEIGHT, "", html.WIDTH, "")): (can.page.style(can, can._output, html.HEIGHT, height, html.WIDTH, width, html.MAX_HEIGHT, "", html.MAX_WIDTH, ""), can.page.style(can, can._target, html.WIDTH, width)) var sub = can.sub; if (!sub) { return auto } sub.Mode(mode), sub.ConfHeight(height), sub.ConfWidth(width) + can.onimport._size(can) mode? sub.onlayout[mode](sub, height, width): sub.onlayout._init(sub, height, width); return auto }, display_size: function(can, sub) { var border = 1 diff --git a/plugin/story/spide.js b/plugin/story/spide.js index 7301b44a..0f691974 100644 --- a/plugin/story/spide.js +++ b/plugin/story/spide.js @@ -17,7 +17,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { can.page.requireDraw(ca } can.core.List(tree.list, function(item) { tree.width += can.onimport._width(can, item) }); return tree.width }, _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.page.ClassList.has(can, can._fields, html.FLOAT) || can.page.style(can, can._output, html.MAX_HEIGHT, "", "overflow", "hidden") can.ui.svg && can.ui.svg.Val(svg.FONT_SIZE, can.size = parseInt(can.Action(html.SIZE)||24)), can.margin = parseInt(can.Action(html.MARGIN)||10) can._tree && can._tree[can.dir_root] && can.core.CallFunc(can.onaction[can.Action(html.VIEW)||"横向"], [event, can, can.Action(html.VIEW)]) },