@plotdb/chart 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +3 -1
- package/CHANGELOG.md +0 -29
- package/build +0 -45
- package/doc/charts.md +0 -58
- package/doc/config.md +0 -44
- package/doc/draft/chart.md +0 -146
- package/doc/draft/data.md +0 -8
- package/doc/draft/definition.md +0 -0
- package/doc/draft/events.md +0 -0
- package/doc/draft/filter.md +0 -0
- package/doc/draft/lifecycle.md +0 -89
- package/doc/spec.md +0 -89
- package/doc/todo.md +0 -27
- package/doc/utils/tip.md +0 -84
- package/src/data/en-US/category +0 -20
- package/src/data/en-US/fruit +0 -39
- package/src/data/en-US/movie +0 -125
- package/src/data/en-US/name +0 -58
- package/src/data/index.ls +0 -34
- package/src/data/zh-TW/category +0 -20
- package/src/data/zh-TW/fruits +0 -38
- package/src/data/zh-TW/movie +0 -125
- package/src/data/zh-TW/names +0 -105
- package/src/index.ls +0 -323
- package/src/index.styl +0 -6
- package/src/utils/axis.ls +0 -229
- package/src/utils/config.ls +0 -11
- package/src/utils/data.ls +0 -104
- package/src/utils/format.ls +0 -30
- package/src/utils/legend.ls +0 -134
- package/src/utils/legend.styl +0 -37
- package/src/utils/tint.ls +0 -66
- package/src/utils/tip.ls +0 -97
- package/web/src/pug/base.pug +0 -21
- package/web/src/pug/block/axis/0.0.1/index.ls +0 -32
- package/web/src/pug/block/axis/0.0.1/index.pug +0 -1
- package/web/src/pug/block/axis-bubble/0.0.1/index.ls +0 -137
- package/web/src/pug/block/axis-bubble/0.0.1/index.pug +0 -1
- package/web/src/pug/block/bar/0.0.1/index.ls +0 -270
- package/web/src/pug/block/bar/0.0.1/index.pug +0 -35
- package/web/src/pug/block/bar-list/0.0.1/index.ls +0 -81
- package/web/src/pug/block/bar-list/0.0.1/index.pug +0 -30
- package/web/src/pug/block/bar-race/0.0.1/index.ls +0 -79
- package/web/src/pug/block/bar-race/0.0.1/index.pug +0 -21
- package/web/src/pug/block/base/0.0.1/index.ls +0 -66
- package/web/src/pug/block/base/0.0.1/index.pug +0 -5
- package/web/src/pug/block/blank/0.0.1/index.ls +0 -21
- package/web/src/pug/block/blank/0.0.1/index.pug +0 -1
- package/web/src/pug/block/bubble/0.0.1/index.ls +0 -218
- package/web/src/pug/block/bubble/0.0.1/index.pug +0 -42
- package/web/src/pug/block/curve-bar/0.0.1/index.ls +0 -85
- package/web/src/pug/block/curve-bar/0.0.1/index.pug +0 -16
- package/web/src/pug/block/curve-bar/0.0.1/sample.js +0 -338
- package/web/src/pug/block/dumbbell/0.0.1/index.ls +0 -86
- package/web/src/pug/block/dumbbell/0.0.1/index.pug +0 -1
- package/web/src/pug/block/empty/0.0.1/index.ls +0 -28
- package/web/src/pug/block/empty/0.0.1/index.pug +0 -2
- package/web/src/pug/block/gauge/0.0.1/index.ls +0 -96
- package/web/src/pug/block/gauge/0.0.1/index.pug +0 -31
- package/web/src/pug/block/gauge/0.0.1/sample.js +0 -338
- package/web/src/pug/block/line/0.0.1/index.ls +0 -297
- package/web/src/pug/block/line/0.0.1/index.pug +0 -33
- package/web/src/pug/block/number/0.0.1/index.ls +0 -65
- package/web/src/pug/block/number/0.0.1/index.pug +0 -20
- package/web/src/pug/block/percent-list/0.0.1/index.ls +0 -161
- package/web/src/pug/block/percent-list/0.0.1/index.pug +0 -34
- package/web/src/pug/block/pie/0.0.1/index.ls +0 -121
- package/web/src/pug/block/pie/0.0.1/index.pug +0 -19
- package/web/src/pug/block/pie/0.0.1/sample.js +0 -338
- package/web/src/pug/block/pie-bubble/0.0.1/index.ls +0 -181
- package/web/src/pug/block/pie-bubble/0.0.1/index.pug +0 -40
- package/web/src/pug/block/radar/0.0.1/index.ls +0 -109
- package/web/src/pug/block/radar/0.0.1/index.pug +0 -1
- package/web/src/pug/block/radar/0.0.1/xx +0 -285
- package/web/src/pug/block/scatter/0.0.1/index.ls +0 -124
- package/web/src/pug/block/scatter/0.0.1/index.pug +0 -30
- package/web/src/pug/block/sheet/0.0.1/index.ls +0 -34
- package/web/src/pug/block/sheet/0.0.1/index.pug +0 -5
- package/web/src/pug/block/table/0.0.1/index.ls +0 -36
- package/web/src/pug/block/table/0.0.1/index.pug +0 -3
- package/web/src/pug/block/taiwancounty/0.0.1/index.ls +0 -70
- package/web/src/pug/block/taiwancounty/0.0.1/index.pug +0 -64
- package/web/src/pug/block/taiwantown/0.0.1/index.ls +0 -44
- package/web/src/pug/block/taiwantown/0.0.1/index.pug +0 -52
- package/web/src/pug/block/taiwanvillage/0.0.1/index.ls +0 -49
- package/web/src/pug/block/taiwanvillage/0.0.1/index.pug +0 -52
- package/web/src/pug/block/treemap/0.0.1/index.ls +0 -168
- package/web/src/pug/block/treemap/0.0.1/index.pug +0 -42
- package/web/src/pug/block/voronoi-treemap/0.0.1/index.ls +0 -170
- package/web/src/pug/block/voronoi-treemap/0.0.1/index.pug +0 -17
- package/web/src/pug/block/voronoi-treemap/0.0.1/sample.js +0 -241
- package/web/src/pug/block/wordcloud/0.0.1/index.ls +0 -57
- package/web/src/pug/block/wordcloud/0.0.1/index.pug +0 -1
- package/web/src/pug/block/worldmap/0.0.1/index.ls +0 -77
- package/web/src/pug/block/worldmap/0.0.1/index.pug +0 -12
- package/web/src/pug/index.ls +0 -72
- package/web/src/pug/index.pug +0 -51
- package/web/src/styl/index.styl +0 -6
- package/web/static/assets/block/cache.js +0 -4
- package/web/static/assets/custom-lib/d3/d3-array.v2.js +0 -1182
- package/web/static/assets/custom-lib/d3/d3-array.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-array.v3.js +0 -1273
- package/web/static/assets/custom-lib/d3/d3-array.v3.min.js +0 -1273
- package/web/static/assets/custom-lib/d3/d3-axis.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-brush.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-color.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-dispatch.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-drag.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-ease.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-force-boundary.v0.0.1.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-force.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-format.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-geo.v2.js +0 -3127
- package/web/static/assets/custom-lib/d3/d3-geo.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-hierarchy.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-interpolate.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-path.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-quadtree.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-random.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-scale-chromatic.v1.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-selection.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-shape.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-timer.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3-transition.v2.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3.v4.js +0 -17178
- package/web/static/assets/custom-lib/d3/d3.v4.min.js +0 -2
- package/web/static/assets/custom-lib/d3/d3.v6.js +0 -19708
- package/web/static/assets/data/countrycode.json +0 -1
- package/web/static/assets/data/world-110m.json +0 -1
- package/web/static/assets/data/zh-to-alpha2.json +0 -1
- package/web/static/assets/img/fluid.svg +0 -16
- package/web/static/block/axis/0.0.1/index.html +0 -74
- package/web/static/block/axis-bubble/0.0.1/index.html +0 -217
- package/web/static/block/bar/0.0.1/index.html +0 -576
- package/web/static/block/bar-list/0.0.1/index.html +0 -226
- package/web/static/block/bar-race/0.0.1/index.html +0 -179
- package/web/static/block/base/0.0.1/index.html +0 -197
- package/web/static/block/blank/0.0.1/index.html +0 -37
- package/web/static/block/bubble/0.0.1/index.html +0 -422
- package/web/static/block/bubble/0.0.1/test.html +0 -0
- package/web/static/block/curve-bar/0.0.1/index.html +0 -143
- package/web/static/block/dumbbell/0.0.1/index.html +0 -173
- package/web/static/block/empty/0.0.1/index.html +0 -76
- package/web/static/block/gauge/0.0.1/index.html +0 -145
- package/web/static/block/line/0.0.1/index.html +0 -566
- package/web/static/block/number/0.0.1/index.html +0 -147
- package/web/static/block/percent-list/0.0.1/index.html +0 -311
- package/web/static/block/pie/0.0.1/index.html +0 -276
- package/web/static/block/pie-bubble/0.0.1/index.html +0 -353
- package/web/static/block/radar/0.0.1/index.html +0 -144
- package/web/static/block/scatter/0.0.1/index.html +0 -246
- package/web/static/block/sheet/0.0.1/index.html +0 -98
- package/web/static/block/table/0.0.1/index.html +0 -67
- package/web/static/block/taiwancounty/0.0.1/index.html +0 -197
- package/web/static/block/taiwantown/0.0.1/index.html +0 -205
- package/web/static/block/taiwanvillage/0.0.1/index.html +0 -215
- package/web/static/block/treemap/0.0.1/index.html +0 -355
- package/web/static/block/voronoi-treemap/0.0.1/index.html +0 -345
- package/web/static/block/wordcloud/0.0.1/index.html +0 -87
- package/web/static/block/worldmap/0.0.1/index.html +0 -202
- package/web/static/css/index.css +0 -6
- package/web/static/css/index.min.css +0 -1
- package/web/static/favicon.ico +0 -0
- package/web/static/index.html +0 -153
package/src/utils/format.ls
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
format = {}
|
|
2
|
-
format.auto = (list = []) ->
|
|
3
|
-
return d3.format ".3s"
|
|
4
|
-
list = list.map(->+it).filter -> !isNaN(it)
|
|
5
|
-
if !list.length => return d3.format "d"
|
|
6
|
-
list.sort (a,b) -> a - b
|
|
7
|
-
s = Math.max.apply Math, list.map ->
|
|
8
|
-
s = 1
|
|
9
|
-
while it
|
|
10
|
-
if it % 10 => break
|
|
11
|
-
it = Math.floor(it / 10)
|
|
12
|
-
s++
|
|
13
|
-
Math.ceil((Math.log(it or 1) / Math.log(10)) - s) >? 0
|
|
14
|
-
int-rate = list.filter(-> Math.floor(it) == it).length / list.length
|
|
15
|
-
diffs = [Math.abs(list[i] - list[i - 1]) for i from 1 til list.length].map ->
|
|
16
|
-
Math.log(if it => it else 1) / Math.log(10)
|
|
17
|
-
diff-avg = diffs.reduce(((a,b) -> a + b),0) / list.length
|
|
18
|
-
type = if int-rate > 0.9 => "s" else "f"
|
|
19
|
-
size = (if diff-avg >= 0 => (s >? 0) else Math.ceil(Math.abs(diff-avg)))
|
|
20
|
-
return d3.format ".#size#type"
|
|
21
|
-
|
|
22
|
-
format.simple = (v) ->
|
|
23
|
-
if isNaN(v = +v) => return v
|
|
24
|
-
return if v >= 1000000000 => (v / 1000000000).toFixed(0) + "G"
|
|
25
|
-
else if v >= 1000000 => (v / 1000000).toFixed(0) + "M"
|
|
26
|
-
else if v >= 1000 => (v / 1000).toFixed(0) + "K"
|
|
27
|
-
else if Math.floor(v) == v => (v).toFixed(0)
|
|
28
|
-
else v.toFixed(2)
|
|
29
|
-
|
|
30
|
-
if chart? => chart.{}utils.format = format
|
package/src/utils/legend.ls
DELETED
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
svgns = "http://www.w3.org/2000/svg"
|
|
2
|
-
|
|
3
|
-
legend = (opt = {}) ->
|
|
4
|
-
@_data = opt.data or []
|
|
5
|
-
@name = opt.name or \legend
|
|
6
|
-
@cfg = opt.cfg or {}
|
|
7
|
-
@root = if typeof(opt.root) == \string => document.querySelector(opt.root) else opt.root
|
|
8
|
-
@dir = opt.direction or 'vertical'
|
|
9
|
-
@evt-handler = {}
|
|
10
|
-
@_picked = Object.fromEntries @_data.map -> [it.key, true]
|
|
11
|
-
@layout = opt.layout or new layout root: @root
|
|
12
|
-
@layout
|
|
13
|
-
..on \update, ~> @update!
|
|
14
|
-
..on \render, ~> @render!
|
|
15
|
-
@id = Math.random!toString(36)substring(2)
|
|
16
|
-
node-layout = @layout.get-node @name
|
|
17
|
-
node-render = @layout.get-group @name
|
|
18
|
-
if !node-layout.querySelector('[ld-each=legend]') =>
|
|
19
|
-
node-layout.innerHTML = """
|
|
20
|
-
<div class="pdlg #{@dir}">
|
|
21
|
-
<div ld-each="legend">
|
|
22
|
-
<div class="pdl-cell" ld="shape" data-only></div>
|
|
23
|
-
<div class="pdl-cell" ld="text" data-only></div>
|
|
24
|
-
</div>
|
|
25
|
-
</div>
|
|
26
|
-
"""
|
|
27
|
-
if !node-render.querySelector('[ld-each=legend]') =>
|
|
28
|
-
gl = document.createElementNS(svgns, "g")
|
|
29
|
-
gs = document.createElementNS(svgns, "g")
|
|
30
|
-
gt = document.createElementNS(svgns, "g")
|
|
31
|
-
gl.classList.add \pdlg-g
|
|
32
|
-
gl.setAttribute \ld-each, \legend
|
|
33
|
-
gs.setAttribute \ld, \shape
|
|
34
|
-
gt.setAttribute \ld, \text
|
|
35
|
-
gl.appendChild gs
|
|
36
|
-
gl.appendChild gt
|
|
37
|
-
node-render.appendChild gl
|
|
38
|
-
|
|
39
|
-
@_func = [
|
|
40
|
-
{key: "all", type: "func", text: "全選"}
|
|
41
|
-
{key: "none", type: "func", text: "全不選"}
|
|
42
|
-
]
|
|
43
|
-
|
|
44
|
-
@view =
|
|
45
|
-
layout: new ldview do
|
|
46
|
-
root: @layout.get-node @name
|
|
47
|
-
init-render: false
|
|
48
|
-
handler:
|
|
49
|
-
legend:
|
|
50
|
-
list: ~> @_data ++ (if @cfg.selectable => @_func else [])
|
|
51
|
-
key: -> it.key
|
|
52
|
-
view:
|
|
53
|
-
handler:
|
|
54
|
-
shape: ({node, ctx}) ~>
|
|
55
|
-
node.setAttribute \data-name, @_name ctx, "shape"
|
|
56
|
-
text: ({node, ctx}) ~>
|
|
57
|
-
node.setAttribute \data-name, @_name ctx, "text"
|
|
58
|
-
node.innerText = ctx.text
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
render: new ldview do
|
|
62
|
-
root: @layout.get-group @name
|
|
63
|
-
init-render: false
|
|
64
|
-
handler:
|
|
65
|
-
legend:
|
|
66
|
-
list: ~> @_data ++ (if @cfg.selectable => @_func else [])
|
|
67
|
-
key: -> it.key
|
|
68
|
-
view:
|
|
69
|
-
action: click: "@": ({node, ctx}) ~>
|
|
70
|
-
if !@cfg.selectable => return
|
|
71
|
-
if ctx.type == \func =>
|
|
72
|
-
for k of @_picked => @_picked[k] = if ctx.key == \all => true else false
|
|
73
|
-
else @_picked[ctx.key] = !@_picked[ctx.key]
|
|
74
|
-
@view.render.render \legend
|
|
75
|
-
@fire \select, @_picked
|
|
76
|
-
handler:
|
|
77
|
-
"@": ({node, ctx}) ~>
|
|
78
|
-
node.style.opacity = if !@cfg.selectable or ctx.type == \func or (@_picked[ctx.key]) => 1 else 0.3
|
|
79
|
-
"shape": ({node, ctx}) ~>
|
|
80
|
-
if ctx.type == \func =>
|
|
81
|
-
node.style.display = \none
|
|
82
|
-
return
|
|
83
|
-
if !node.querySelector \circle => node.appendChild document.createElementNS(svgns, \circle)
|
|
84
|
-
n = node.querySelector \circle
|
|
85
|
-
box = @layout.get-box @_name(ctx, \shape)
|
|
86
|
-
rbox = @layout.get-box @name
|
|
87
|
-
n.setAttribute \cx, ".5em"
|
|
88
|
-
n.setAttribute \cy, ".5em"
|
|
89
|
-
n.setAttribute \r, ".5em"
|
|
90
|
-
n.setAttribute \transform, "translate(#{box.x - rbox.x}, #{box.y - rbox.y})"
|
|
91
|
-
if typeof(opt.shape) == \function => opt.shape.call n, ctx
|
|
92
|
-
|
|
93
|
-
"text": ({node,ctx}) ~>
|
|
94
|
-
n = @layout.get-node(@_name ctx, \text)
|
|
95
|
-
nbox = @layout.get-box(@_name ctx, \text)
|
|
96
|
-
rbox = @layout.get-box(@name)
|
|
97
|
-
node.setAttribute \transform, "translate(#{nbox.x - rbox.x}, #{nbox.y - rbox.y})"
|
|
98
|
-
node.textContent = ""
|
|
99
|
-
ret = wrap-svg-text node: n, use-range: true
|
|
100
|
-
node.appendChild ret
|
|
101
|
-
@update!
|
|
102
|
-
@
|
|
103
|
-
|
|
104
|
-
legend.prototype = Object.create(Object.prototype) <<< do
|
|
105
|
-
_name: (ctx,type="s") -> "pdlg-#{type}-#{@id}-#{ctx.type or ''}-#{ctx.key}"
|
|
106
|
-
enabled: -> @_data and @_data.length and (!(@cfg.enabled?) or @cfg.enabled)
|
|
107
|
-
update: ->
|
|
108
|
-
val = if @enabled! => '' else '0px'
|
|
109
|
-
@layout.get-node \legend .style <<< {width: val, height: val, padding: val, margin: val}
|
|
110
|
-
@view.layout.render!
|
|
111
|
-
render: ->
|
|
112
|
-
enabled = @enabled!
|
|
113
|
-
g = @layout.get-group(@name)
|
|
114
|
-
g.style.display = if enabled => '' else 'none'
|
|
115
|
-
if enabled => @view.render.render!
|
|
116
|
-
config: (cfg) ->
|
|
117
|
-
if !(cfg?) => return @cfg
|
|
118
|
-
@cfg = cfg
|
|
119
|
-
@dir = if @cfg.position == \bottom => \horizontal else \vertical
|
|
120
|
-
node = @layout.get-node(@name).querySelector \.pdlg
|
|
121
|
-
<[horizontal vertical]>.map ~> node.classList.toggle it, @dir == it
|
|
122
|
-
data: (data = []) ->
|
|
123
|
-
hash = {}
|
|
124
|
-
data.map (d,i) -> hash[d.key] = i
|
|
125
|
-
@_data = data.filter (d,i) -> hash[d.key] == i
|
|
126
|
-
@_picked = Object.fromEntries @_data.map (d) -> [d.key, true]
|
|
127
|
-
@update!
|
|
128
|
-
@layout.update false
|
|
129
|
-
@view.render.render!
|
|
130
|
-
on: (n, cb) -> (if Array.isArray(n) => n else [n]).map (n) ~> @evt-handler.[][n].push cb
|
|
131
|
-
fire: (n, ...v) -> for cb in (@evt-handler[n] or []) => cb.apply @, v
|
|
132
|
-
is-selected: (key) -> return !!@_picked[key]
|
|
133
|
-
|
|
134
|
-
if chart? => chart.{}utils.legend = legend
|
package/src/utils/legend.styl
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
.pdlg
|
|
2
|
-
height: 100%
|
|
3
|
-
width: 100%
|
|
4
|
-
display: flex
|
|
5
|
-
align-items: start
|
|
6
|
-
justify-content: center
|
|
7
|
-
|
|
8
|
-
.pdlg > div
|
|
9
|
-
display: flex
|
|
10
|
-
align-items: center
|
|
11
|
-
line-height: 1em
|
|
12
|
-
[ld=shape]
|
|
13
|
-
display: inline-block
|
|
14
|
-
width: 1em
|
|
15
|
-
height: 1em
|
|
16
|
-
margin-right: .5em
|
|
17
|
-
background: #999
|
|
18
|
-
flex: 0 0 auto
|
|
19
|
-
line-height: 1em
|
|
20
|
-
[ld=text]
|
|
21
|
-
color: #999
|
|
22
|
-
padding-right: .25em
|
|
23
|
-
line-height: 1.2em
|
|
24
|
-
|
|
25
|
-
.pdlg.vertical
|
|
26
|
-
flex-direction: column
|
|
27
|
-
align-items: start
|
|
28
|
-
& > div
|
|
29
|
-
margin-bottom: .5em
|
|
30
|
-
|
|
31
|
-
.pdlg.horizontal
|
|
32
|
-
& > div
|
|
33
|
-
margin-right: .5em
|
|
34
|
-
|
|
35
|
-
g.pdlg-g
|
|
36
|
-
cursor: pointer
|
|
37
|
-
transition: opacity .15s ease-in-out
|
package/src/utils/tint.ls
DELETED
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
tint = (opt = {}) ->
|
|
2
|
-
@is-unique = if opt.unique? => opt.unique else true
|
|
3
|
-
@map = {} # calculated name to index map
|
|
4
|
-
@nmap = [] # predefined name to index map
|
|
5
|
-
@wm = new WeakMap!
|
|
6
|
-
@count = 0
|
|
7
|
-
@set opt.palette or opt.colors
|
|
8
|
-
@
|
|
9
|
-
|
|
10
|
-
tint.default = <[#e15c64 #f7b26a #f3ed9d #a4bd81 #a0d7d2 #8db1da #daaedb]>
|
|
11
|
-
|
|
12
|
-
tint.prototype = Object.create(Object.prototype) <<< do
|
|
13
|
-
set: (pal = [], reset = false) ->
|
|
14
|
-
@colors = if Array.isArray(pal) and pal.length => pal
|
|
15
|
-
else if pal.colors and Array.isArray(pal.colors) => pal.colors
|
|
16
|
-
else tint.default
|
|
17
|
-
@nmap = pal.maps or []
|
|
18
|
-
@colors = @colors.map -> it.value or it
|
|
19
|
-
if @colors.length == 1 => @colors.push ldcolor.complement(@colors.0)
|
|
20
|
-
@colors = @colors.map -> ldcolor.hsl(it)
|
|
21
|
-
@len = @colors.length >? 2
|
|
22
|
-
if reset => @reset!
|
|
23
|
-
else @nmap.map (d,i) ~> (if Array.isArray(d) => d else [d]).map ~> @get it, 0, i
|
|
24
|
-
|
|
25
|
-
unique: -> return if it? => @is-unique = !!it else @is-unique
|
|
26
|
-
reset: ->
|
|
27
|
-
@map = {}
|
|
28
|
-
@wm = new WeakMap!
|
|
29
|
-
@count = 0
|
|
30
|
-
(@nmap or []).map (d,i) ~> (if Array.isArray(d) => d else [d]).map ~> @get it, 0, i
|
|
31
|
-
get: (data, variant = 0, idx) ->
|
|
32
|
-
if idx? =>
|
|
33
|
-
if @count < idx => @count = idx + 1
|
|
34
|
-
val = idx % @len
|
|
35
|
-
if typeof(data) == \object => @wm.set data, val
|
|
36
|
-
else @map[data] = val
|
|
37
|
-
else
|
|
38
|
-
if typeof(data) == \object =>
|
|
39
|
-
if !(val = @wm.get data)? => @wm.set data, (val = @count++)
|
|
40
|
-
else if !(val = @map[data])? => @map[data] = (val = @count++)
|
|
41
|
-
if !@is-unique => val = val % @len
|
|
42
|
-
if val >= @len =>
|
|
43
|
-
seg = val % ( @len - 1 )
|
|
44
|
-
pos = Math.floor(val / (@len - 1))
|
|
45
|
-
[fz,fm] = [0,1]
|
|
46
|
-
while pos > 0
|
|
47
|
-
[fz,fm] = [fz * 2, fm * 2]
|
|
48
|
-
if pos % 2 => fz += 1
|
|
49
|
-
pos = pos .>>. 1
|
|
50
|
-
pos = fz/fm
|
|
51
|
-
[c1,c2] = [@colors[seg], @colors[seg + 1]]
|
|
52
|
-
[h,s,l] = <[h s l]>.map (k) ->
|
|
53
|
-
pos * (c2[k] - c1[k]) + c1[k]
|
|
54
|
-
ret = {h,s,l}
|
|
55
|
-
else ret = @colors[val]
|
|
56
|
-
if variant > 0 => ret = ldcolor.lighter(ret, variant)
|
|
57
|
-
else if variant < 0 => ret = ldcolor.darker(ret, -variant)
|
|
58
|
-
return ldcolor.web(ret)
|
|
59
|
-
|
|
60
|
-
text: (v, opt = {}) ->
|
|
61
|
-
hcl = ldcolor.hcl(@get v)
|
|
62
|
-
return ldcolor.web(if hcl.l > 50 => (opt.text-dark or \#000) else (opt.text-light or \#fff))
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
if chart? => chart.{}utils.tint = tint
|
package/src/utils/tip.ls
DELETED
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
tip = (opt = {}) ->
|
|
2
|
-
@root = if typeof(opt.root) == \string => document.querySelector(opt.root) else opt.root
|
|
3
|
-
@tip = if typeof(opt.node) == \string => @root.querySelector(opt.node) else opt.node
|
|
4
|
-
@margin = if opt.margin? => opt.margin else 10
|
|
5
|
-
@type = if opt.type == \over => \over else \move
|
|
6
|
-
@accessor = opt.accessor
|
|
7
|
-
@range = opt.range
|
|
8
|
-
@zmgr = opt.zmgr
|
|
9
|
-
@_z = 0
|
|
10
|
-
@enabled = true
|
|
11
|
-
if !@tip =>
|
|
12
|
-
@tip = document.createElement \div
|
|
13
|
-
@tip.innerHTML = """
|
|
14
|
-
<div ld="name" style="font-size:.85em"></div>
|
|
15
|
-
<div ld="value" style="font-weight:bold;font-size:1.1em;line-height:1.2em"></div>
|
|
16
|
-
"""
|
|
17
|
-
@root.appendChild @tip
|
|
18
|
-
@tip.style <<<
|
|
19
|
-
padding: '.4em .5em'
|
|
20
|
-
background: \#13171a
|
|
21
|
-
color: \#fff
|
|
22
|
-
borderRadius: \3px
|
|
23
|
-
boxShadow: '0 2px 4px rgba(0,0,0,.3)'
|
|
24
|
-
lineHeight: \1.2em
|
|
25
|
-
fontSize: \.9em
|
|
26
|
-
maxWidth: "10em"
|
|
27
|
-
wordBreak: "break-all"
|
|
28
|
-
|
|
29
|
-
@tip.style <<<
|
|
30
|
-
position: \absolute
|
|
31
|
-
z-index: 1
|
|
32
|
-
top: 0
|
|
33
|
-
left: 0
|
|
34
|
-
pointerEvents: \none
|
|
35
|
-
userSelect: \none
|
|
36
|
-
opacity: 0
|
|
37
|
-
transition: 'opacity .15s ease-in-out' + (if @type == \over => ', transform .15s ease-in-out' else '')
|
|
38
|
-
|
|
39
|
-
@view = new ldview do
|
|
40
|
-
root: @tip
|
|
41
|
-
text: opt.view or {
|
|
42
|
-
name: ({ctx}) -> if ctx => ctx.name else ''
|
|
43
|
-
value: ({ctx}) -> if ctx => ctx.value else ''
|
|
44
|
-
}
|
|
45
|
-
@hide = debounce 3000, ->
|
|
46
|
-
@tip.style <<< opacity: 0
|
|
47
|
-
if @zmgr => @zmgr.remove @_z
|
|
48
|
-
@_evthdr = {}
|
|
49
|
-
if @accessor =>
|
|
50
|
-
@root.addEventListener (if @type == \over => \mouseover else \mousemove), @_evthdr.over = (e) ~>
|
|
51
|
-
if !(e.target and data = @accessor {evt: e}) => return
|
|
52
|
-
@render {data, node: e.target, evt: e}
|
|
53
|
-
@root.addEventListener \mouseout, @_evthdr.out = ~> @hide!now!
|
|
54
|
-
|
|
55
|
-
@
|
|
56
|
-
|
|
57
|
-
tip.prototype = Object.create(Object.prototype) <<<
|
|
58
|
-
destroy: ->
|
|
59
|
-
if @_evthdr.over => @root.removeEventListener (if @type == \over => \mouseover else \mousemove), @_evthdr.over
|
|
60
|
-
if @_evthdr.out => @root.removeEventListener \mouseout, @_evthdr.out
|
|
61
|
-
toggle: -> return if !(it?) => @enabled else @enabled = it
|
|
62
|
-
render: (opt = {}) ->
|
|
63
|
-
if !@enabled => return
|
|
64
|
-
@view.set-ctx opt.data
|
|
65
|
-
@view.render!
|
|
66
|
-
rbox = @root.getBoundingClientRect!
|
|
67
|
-
nbox = if opt.node? =>
|
|
68
|
-
ret = opt.node.getBoundingClientRect!
|
|
69
|
-
ret <<< {x: ret.x - rbox.x, y: ret.y - rbox.y}
|
|
70
|
-
else if opt.box? => opt.box
|
|
71
|
-
else {x: opt.x, y: opt.y, width: opt.width, height: opt.height}
|
|
72
|
-
tbox = @tip.getBoundingClientRect!
|
|
73
|
-
[mx, my] = [opt.evt.clientX - rbox.x, opt.evt.clientY - rbox.y] # point relative to root origin
|
|
74
|
-
m = @margin # margin
|
|
75
|
-
[nx, ny] = [ # centroid of target element
|
|
76
|
-
nbox.x + (if nbox.width? => nbox.width/2 else 0)
|
|
77
|
-
nbox.y + (if nbox.height? => nbox.height/2 else 0)
|
|
78
|
-
]
|
|
79
|
-
# expected tip offset: by default, centered at mouse position
|
|
80
|
-
[tx, ty] = [mx - tbox.width/2, my - tbox.height/2]
|
|
81
|
-
[tx, ty] = [ # then, offset to direction against centroid
|
|
82
|
-
tx + (if nx < mx => 1 else -1 ) * (m + tbox.width / 2),
|
|
83
|
-
ty + (if ny < my => 1 else -1 ) * (m + tbox.height / 2)
|
|
84
|
-
]
|
|
85
|
-
range-box = if @range => range-box = @range! else rbox
|
|
86
|
-
|
|
87
|
-
[tx, ty] = [ # last, bound in @root
|
|
88
|
-
(((tx >? range-box.x - rbox.x) + tbox.width) <? range-box.width + range-box.x - rbox.x) - tbox.width,
|
|
89
|
-
(((ty >? range-box.y - rbox.y) + tbox.height) <? range-box.height + range-box.y - rbox.y) - tbox.height
|
|
90
|
-
]
|
|
91
|
-
@tip.style <<<
|
|
92
|
-
transform: "translate(#{tx}px,#{ty}px)"
|
|
93
|
-
opacity: 1
|
|
94
|
-
z-index: @_z = (if !@zmgr => 10 else @zmgr.add 10)
|
|
95
|
-
@hide!
|
|
96
|
-
|
|
97
|
-
if chart? => chart.{}utils.tip = tip
|
package/web/src/pug/base.pug
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
//- view
|
|
2
|
-
doctype html
|
|
3
|
-
html
|
|
4
|
-
include @/@loadingio/bootstrap.ext/dist/index.pug
|
|
5
|
-
include @/ldview/dist/index.pug
|
|
6
|
-
block vars
|
|
7
|
-
head
|
|
8
|
-
block prehead
|
|
9
|
-
+css("/assets/lib/bootstrap/main/css/bootstrap.min.css")
|
|
10
|
-
+css("/assets/lib/@loadingio/bootstrap.ext/main/index.min.css")
|
|
11
|
-
+css("/assets/lib/@loadingio/loading.css/main/loading.min.css")
|
|
12
|
-
+css("/assets/lib/ldiconfont/main/ldif.min.css")
|
|
13
|
-
+css("/css/index.css")
|
|
14
|
-
block head
|
|
15
|
-
body
|
|
16
|
-
block body
|
|
17
|
-
+script("/assets/lib/bootstrap.native/main/bootstrap-native-v4.min.js")
|
|
18
|
-
+script("https://polyfill.io/v3/polyfill.min.js?features=ResizeObserver")
|
|
19
|
-
+script("/assets/lib/@loadingio/ldquery/main/ldq.min.js")
|
|
20
|
-
+script("/assets/lib/ldview/main/index.min.js")
|
|
21
|
-
block script
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
module.exports =
|
|
2
|
-
pkg:
|
|
3
|
-
name: 'axis', version: '0.0.1'
|
|
4
|
-
extend: {name: "base", version: "0.0.1"}
|
|
5
|
-
dependencies: []
|
|
6
|
-
init: ({root, context, pubsub}) ->
|
|
7
|
-
pubsub.fire \init, mod: mod {context} .then ~> it.0
|
|
8
|
-
|
|
9
|
-
mod = ({context}) ->
|
|
10
|
-
{d3,forceBoundary,ldcolor,repeatString$,infinite} = context
|
|
11
|
-
sample: ->
|
|
12
|
-
raw: [0 to 7].map (val) ~> {val: val, name: val}
|
|
13
|
-
binding:
|
|
14
|
-
name: {key: \name}
|
|
15
|
-
value: {key: \val}
|
|
16
|
-
config: {}
|
|
17
|
-
dimension:
|
|
18
|
-
value: {type: \R, name: "value"}
|
|
19
|
-
name: {type: \N, name: "name"}
|
|
20
|
-
init: ->
|
|
21
|
-
@ab = d3.axisBottom!
|
|
22
|
-
@scale = x: d3.scaleLinear!
|
|
23
|
-
@g = d3.select @svg .append \g
|
|
24
|
-
|
|
25
|
-
parse: ->
|
|
26
|
-
|
|
27
|
-
resize: ->
|
|
28
|
-
@scale.x.domain [0, 20] .range [20, @box.width - 20]
|
|
29
|
-
@ab.scale @scale.x .tickValues [0 to 20]
|
|
30
|
-
|
|
31
|
-
render: ->
|
|
32
|
-
@g.call @ab
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
div: script(type="@plotdb/block"): include:lsc index.ls
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
module.exports =
|
|
2
|
-
pkg:
|
|
3
|
-
name: 'axis-bubble', version: '0.0.1'
|
|
4
|
-
extend: {name: "base", version: "0.0.1"}
|
|
5
|
-
dependencies: []
|
|
6
|
-
init: ({root, context, pubsub}) ->
|
|
7
|
-
pubsub.fire \init, mod: mod {context} .then ~> it.0
|
|
8
|
-
|
|
9
|
-
mod = ({context}) ->
|
|
10
|
-
{d3, forceBoundary, ldcolor, repeatString$} = context
|
|
11
|
-
sample: ->
|
|
12
|
-
raw: [0 to 200].map (val) ~>
|
|
13
|
-
{val: Math.random! * 50 + 10, x: Math.random!, cat: Math.ceil(5 * Math.random!)}
|
|
14
|
-
binding: do
|
|
15
|
-
color: {key: \cat}
|
|
16
|
-
radius: {key: \val}
|
|
17
|
-
xpos: {key: \x}
|
|
18
|
-
config: {}
|
|
19
|
-
dimension:
|
|
20
|
-
color: {type: \R, name: "顏色"}
|
|
21
|
-
radius: {type: \R, name: "半徑"}
|
|
22
|
-
xpos: {type: \R, name: "X座標"}
|
|
23
|
-
init: ->
|
|
24
|
-
@svg.addEventListener \click, ~>
|
|
25
|
-
@type = !@type
|
|
26
|
-
@resize!
|
|
27
|
-
@render!
|
|
28
|
-
@sim.stop!
|
|
29
|
-
@sim.alpha 0.9
|
|
30
|
-
@svg.appendChild t = document.createElementNS('http://www.w3.org/2000/svg', 'text')
|
|
31
|
-
@text = d3.select(t)
|
|
32
|
-
@text
|
|
33
|
-
.attr \x, 20
|
|
34
|
-
.attr \y, 20
|
|
35
|
-
parse: ->
|
|
36
|
-
@xextent = d3.extent(@data.map -> it.xpos)
|
|
37
|
-
@rextent = d3.extent @data.map -> it.radius
|
|
38
|
-
@cextent = d3.extent @data.map -> it.color
|
|
39
|
-
resize: ->
|
|
40
|
-
rng = d3.randomUniform.source(d3.randomLcg(root.seed))(0, 1)
|
|
41
|
-
@scale-x = d3.scaleLinear!domain @xextent .range [0, @box.width]
|
|
42
|
-
if @type =>
|
|
43
|
-
@scale-y = d3.scaleLinear!domain @cextent .range [0, @box.height]
|
|
44
|
-
else
|
|
45
|
-
@scale-y = ~> @box.height / 2
|
|
46
|
-
@data.map (v) ~>
|
|
47
|
-
v <<< {
|
|
48
|
-
x: v.x or @scale-x(v.xpos)
|
|
49
|
-
y: v.y or @box.height / 2
|
|
50
|
-
ty: @scale-y(v.color)
|
|
51
|
-
val: v.radius
|
|
52
|
-
r: v.radius
|
|
53
|
-
c: v.color
|
|
54
|
-
}
|
|
55
|
-
@area = @box.width * @box.height
|
|
56
|
-
@rate = 0.5
|
|
57
|
-
render: ->
|
|
58
|
-
rate = @rate
|
|
59
|
-
@scale = do
|
|
60
|
-
color: d3.interpolateTurbo
|
|
61
|
-
r: d3.scaleLinear!domain(@rextent).range([0,1])
|
|
62
|
-
c: d3.scaleLinear!domain(@cextent).range([0,1])
|
|
63
|
-
pal = if @cfg.palette => @cfg.palette.colors.map -> ldcolor.web(it.value or it) else <[#f00 #0f0 #00f #f90 #9f0 #0f9]>
|
|
64
|
-
int-color = d3.interpolateDiscrete pal
|
|
65
|
-
@scale.color = ~> int-color(@scale.c it)
|
|
66
|
-
|
|
67
|
-
d3.select @svg .selectAll \circle.bubble .data @data
|
|
68
|
-
..exit!remove!
|
|
69
|
-
..enter!append \circle
|
|
70
|
-
.attr \class, \bubble
|
|
71
|
-
.attr \r, (d,i) ~> 0
|
|
72
|
-
.attr \fill, (d,i) ~> @scale.color d.c
|
|
73
|
-
|
|
74
|
-
d3.select @svg .selectAll \circle.bubble
|
|
75
|
-
.attr \cx, (d,i) -> d.x
|
|
76
|
-
.attr \cy, (d,i) -> d.y
|
|
77
|
-
.attr \fill, (d,i) ~> @scale.color d.c #@scale.r(d.c)
|
|
78
|
-
.attr \r, (d,i) ~> (d.r >? 2) * @rate
|
|
79
|
-
|
|
80
|
-
d3.select @svg .selectAll \g.label .data @data
|
|
81
|
-
..exit!remove!
|
|
82
|
-
..enter!append \g
|
|
83
|
-
.attr \class, \label
|
|
84
|
-
.each (d,i) ->
|
|
85
|
-
[0] #[0,1]
|
|
86
|
-
.map ~> d3.select(@).append \text
|
|
87
|
-
.map ->
|
|
88
|
-
it
|
|
89
|
-
.attr \dy, \-.28em
|
|
90
|
-
.attr \text-anchor, \middle
|
|
91
|
-
.attr \font-size, \.7em
|
|
92
|
-
.attr \font-family, \Rubik
|
|
93
|
-
.style \pointer-event, \none
|
|
94
|
-
d3.select @svg .selectAll \g.label
|
|
95
|
-
.attr \transform, (d,i) -> "translate(#{d.x},#{d.y})"
|
|
96
|
-
.each (d,i) ->
|
|
97
|
-
d3.select(@).selectAll \text
|
|
98
|
-
.attr \opacity, (if ( d.r * 2 * rate ) < "#{(d.val).toFixed(2)}".length * 7 => 0 else 1)
|
|
99
|
-
.attr \dy, (e,i) -> \.38em #if i == 0 => '-.28em' else '.88em'
|
|
100
|
-
.text (e,i) ->
|
|
101
|
-
if i == 0 =>
|
|
102
|
-
if d.val > 1000000 => (d.val/1000000).toFixed(2) + "M"
|
|
103
|
-
else if d.val > 1000 => (d.val/1000).toFixed(2) + "K"
|
|
104
|
-
else (d.val).toFixed(2)
|
|
105
|
-
else return d._idx
|
|
106
|
-
|
|
107
|
-
tick: ->
|
|
108
|
-
if !@sim =>
|
|
109
|
-
kickoff = true
|
|
110
|
-
@fc = fc = d3.forceCollide!
|
|
111
|
-
@sim = d3.forceSimulation!
|
|
112
|
-
.force \center, @fg = d3.forceCenter @box.width/2, @box.height/2
|
|
113
|
-
.force \x, @fx = d3.forceX(@box.width / 2).strength(0.15)
|
|
114
|
-
.force \y, @fy = d3.forceY((@box.height) / 2).strength(0.1)
|
|
115
|
-
.force \b, @fb = forceBoundary((->it.r), (->it.r), (~>@box.width - it.r), (~>@box.height - it.r))
|
|
116
|
-
.force \collide, fc
|
|
117
|
-
@sim.stop!
|
|
118
|
-
@sim.alpha 0.9
|
|
119
|
-
@sim.nodes(@data)
|
|
120
|
-
@fc.strength 1.0
|
|
121
|
-
@fc.radius ~> @rate * it.r + 2
|
|
122
|
-
@fg.x @box.width/2
|
|
123
|
-
@fg.y @box.height/2
|
|
124
|
-
@fx.strength 0.15
|
|
125
|
-
@fy.strength 0.01
|
|
126
|
-
@sim.tick if kickoff => 20 else 1
|
|
127
|
-
alpha = @sim.alpha!
|
|
128
|
-
@text.text alpha
|
|
129
|
-
if alpha < 0.001 => @stop!
|
|
130
|
-
@data.map -> it.y = it.y + (it.ty - it.y) * alpha * 0.1
|
|
131
|
-
|
|
132
|
-
d3.select @svg .selectAll \circle.bubble
|
|
133
|
-
.attr \cx, (d,i) -> d.x
|
|
134
|
-
.attr \cy, (d,i) -> d.y
|
|
135
|
-
d3.select @svg .selectAll \g.label
|
|
136
|
-
.attr \transform, (d,i) -> "translate(#{d.x},#{d.y})"
|
|
137
|
-
@render!
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
div: script(type="@plotdb/block"): include:lsc index.ls
|