@plotdb/chart 0.0.2 → 1.0.3

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.
Files changed (164) hide show
  1. package/README.md +3 -3
  2. package/dist/chart.js +18 -12
  3. package/dist/chart.min.js +1 -1
  4. package/dist/index.css +8 -0
  5. package/dist/index.js +609 -0
  6. package/dist/index.min.css +1 -0
  7. package/dist/index.min.js +1 -0
  8. package/dist/utils/axis.js +6 -0
  9. package/dist/utils/axis.min.js +1 -1
  10. package/package.json +22 -11
  11. package/CHANGELOG.md +0 -11
  12. package/build +0 -39
  13. package/doc/charts.md +0 -58
  14. package/doc/config.md +0 -44
  15. package/doc/draft/chart.md +0 -146
  16. package/doc/draft/data.md +0 -8
  17. package/doc/draft/definition.md +0 -0
  18. package/doc/draft/events.md +0 -0
  19. package/doc/draft/filter.md +0 -0
  20. package/doc/draft/lifecycle.md +0 -89
  21. package/doc/spec.md +0 -89
  22. package/doc/todo.md +0 -27
  23. package/doc/utils/tip.md +0 -84
  24. package/src/chart.ls +0 -320
  25. package/src/chart.styl +0 -6
  26. package/src/data/en-US/category +0 -20
  27. package/src/data/en-US/fruit +0 -39
  28. package/src/data/en-US/movie +0 -125
  29. package/src/data/en-US/name +0 -58
  30. package/src/data/index.ls +0 -34
  31. package/src/data/zh-TW/category +0 -20
  32. package/src/data/zh-TW/fruits +0 -38
  33. package/src/data/zh-TW/movie +0 -125
  34. package/src/data/zh-TW/names +0 -105
  35. package/src/utils/axis.ls +0 -229
  36. package/src/utils/config.ls +0 -11
  37. package/src/utils/data.ls +0 -104
  38. package/src/utils/format.ls +0 -30
  39. package/src/utils/legend.ls +0 -134
  40. package/src/utils/legend.styl +0 -37
  41. package/src/utils/tint.ls +0 -66
  42. package/src/utils/tip.ls +0 -97
  43. package/web/src/pug/base.pug +0 -19
  44. package/web/src/pug/block/axis/0.0.1/index.ls +0 -38
  45. package/web/src/pug/block/axis/0.0.1/index.pug +0 -1
  46. package/web/src/pug/block/axis-bubble/0.0.1/index.ls +0 -141
  47. package/web/src/pug/block/axis-bubble/0.0.1/index.pug +0 -1
  48. package/web/src/pug/block/bar/0.0.1/index.ls +0 -274
  49. package/web/src/pug/block/bar/0.0.1/index.pug +0 -35
  50. package/web/src/pug/block/bar-list/0.0.1/index.ls +0 -85
  51. package/web/src/pug/block/bar-list/0.0.1/index.pug +0 -30
  52. package/web/src/pug/block/bar-race/0.0.1/index.ls +0 -83
  53. package/web/src/pug/block/bar-race/0.0.1/index.pug +0 -21
  54. package/web/src/pug/block/base/0.0.1/index.ls +0 -67
  55. package/web/src/pug/block/base/0.0.1/index.pug +0 -5
  56. package/web/src/pug/block/blank/0.0.1/index.ls +0 -25
  57. package/web/src/pug/block/blank/0.0.1/index.pug +0 -1
  58. package/web/src/pug/block/bubble/0.0.1/index.ls +0 -220
  59. package/web/src/pug/block/bubble/0.0.1/index.pug +0 -28
  60. package/web/src/pug/block/curve-bar/0.0.1/index.ls +0 -89
  61. package/web/src/pug/block/curve-bar/0.0.1/index.pug +0 -16
  62. package/web/src/pug/block/curve-bar/0.0.1/sample.js +0 -338
  63. package/web/src/pug/block/dumbbell/0.0.1/index.ls +0 -90
  64. package/web/src/pug/block/dumbbell/0.0.1/index.pug +0 -1
  65. package/web/src/pug/block/empty/0.0.1/index.ls +0 -27
  66. package/web/src/pug/block/empty/0.0.1/index.pug +0 -2
  67. package/web/src/pug/block/gauge/0.0.1/index.ls +0 -100
  68. package/web/src/pug/block/gauge/0.0.1/index.pug +0 -31
  69. package/web/src/pug/block/gauge/0.0.1/sample.js +0 -338
  70. package/web/src/pug/block/line/0.0.1/index.ls +0 -265
  71. package/web/src/pug/block/line/0.0.1/index.pug +0 -33
  72. package/web/src/pug/block/number/0.0.1/index.ls +0 -69
  73. package/web/src/pug/block/number/0.0.1/index.pug +0 -20
  74. package/web/src/pug/block/percent-list/0.0.1/index.ls +0 -167
  75. package/web/src/pug/block/percent-list/0.0.1/index.pug +0 -34
  76. package/web/src/pug/block/pie/0.0.1/index.ls +0 -125
  77. package/web/src/pug/block/pie/0.0.1/index.pug +0 -19
  78. package/web/src/pug/block/pie/0.0.1/sample.js +0 -338
  79. package/web/src/pug/block/pie-bubble/0.0.1/index.ls +0 -185
  80. package/web/src/pug/block/pie-bubble/0.0.1/index.pug +0 -40
  81. package/web/src/pug/block/radar/0.0.1/index.ls +0 -113
  82. package/web/src/pug/block/radar/0.0.1/index.pug +0 -1
  83. package/web/src/pug/block/radar/0.0.1/xx +0 -285
  84. package/web/src/pug/block/scatter/0.0.1/index.ls +0 -128
  85. package/web/src/pug/block/scatter/0.0.1/index.pug +0 -30
  86. package/web/src/pug/block/sheet/0.0.1/index.ls +0 -38
  87. package/web/src/pug/block/sheet/0.0.1/index.pug +0 -5
  88. package/web/src/pug/block/table/0.0.1/index.ls +0 -40
  89. package/web/src/pug/block/table/0.0.1/index.pug +0 -3
  90. package/web/src/pug/block/taiwantown/0.0.1/index.ls +0 -48
  91. package/web/src/pug/block/taiwantown/0.0.1/index.pug +0 -52
  92. package/web/src/pug/block/taiwanvillage/0.0.1/index.ls +0 -53
  93. package/web/src/pug/block/taiwanvillage/0.0.1/index.pug +0 -52
  94. package/web/src/pug/block/treemap/0.0.1/index.ls +0 -172
  95. package/web/src/pug/block/treemap/0.0.1/index.pug +0 -42
  96. package/web/src/pug/block/voronoi-treemap/0.0.1/index.ls +0 -174
  97. package/web/src/pug/block/voronoi-treemap/0.0.1/index.pug +0 -17
  98. package/web/src/pug/block/voronoi-treemap/0.0.1/sample.js +0 -241
  99. package/web/src/pug/block/wordcloud/0.0.1/index.ls +0 -61
  100. package/web/src/pug/block/wordcloud/0.0.1/index.pug +0 -1
  101. package/web/src/pug/block/worldmap/0.0.1/index.ls +0 -83
  102. package/web/src/pug/block/worldmap/0.0.1/index.pug +0 -12
  103. package/web/src/pug/index.ls +0 -72
  104. package/web/src/pug/index.pug +0 -52
  105. package/web/src/styl/index.styl +0 -0
  106. package/web/static/assets/block/cache.js +0 -4
  107. package/web/static/assets/custom-lib/d3/d3-array.v2.min.js +0 -2
  108. package/web/static/assets/custom-lib/d3/d3-axis.v2.min.js +0 -2
  109. package/web/static/assets/custom-lib/d3/d3-brush.v2.min.js +0 -2
  110. package/web/static/assets/custom-lib/d3/d3-color.v2.min.js +0 -2
  111. package/web/static/assets/custom-lib/d3/d3-dispatch.v2.min.js +0 -2
  112. package/web/static/assets/custom-lib/d3/d3-drag.v2.min.js +0 -2
  113. package/web/static/assets/custom-lib/d3/d3-ease.v2.min.js +0 -2
  114. package/web/static/assets/custom-lib/d3/d3-force-boundary.v0.0.1.min.js +0 -2
  115. package/web/static/assets/custom-lib/d3/d3-force.v2.min.js +0 -2
  116. package/web/static/assets/custom-lib/d3/d3-format.v2.min.js +0 -2
  117. package/web/static/assets/custom-lib/d3/d3-hierarchy.v2.min.js +0 -2
  118. package/web/static/assets/custom-lib/d3/d3-interpolate.v2.min.js +0 -2
  119. package/web/static/assets/custom-lib/d3/d3-path.v2.min.js +0 -2
  120. package/web/static/assets/custom-lib/d3/d3-quadtree.v2.min.js +0 -2
  121. package/web/static/assets/custom-lib/d3/d3-random.v2.min.js +0 -2
  122. package/web/static/assets/custom-lib/d3/d3-scale-chromatic.v1.min.js +0 -2
  123. package/web/static/assets/custom-lib/d3/d3-selection.v2.min.js +0 -2
  124. package/web/static/assets/custom-lib/d3/d3-shape.v2.min.js +0 -2
  125. package/web/static/assets/custom-lib/d3/d3-timer.v2.min.js +0 -2
  126. package/web/static/assets/custom-lib/d3/d3-transition.v2.min.js +0 -2
  127. package/web/static/assets/custom-lib/d3/d3.v4.js +0 -17178
  128. package/web/static/assets/custom-lib/d3/d3.v4.min.js +0 -2
  129. package/web/static/assets/data/countrycode.json +0 -1
  130. package/web/static/assets/data/world-110m.json +0 -1
  131. package/web/static/assets/data/zh-to-alpha2.json +0 -1
  132. package/web/static/assets/img/fluid.svg +0 -16
  133. package/web/static/block/axis/0.0.1/index.html +0 -79
  134. package/web/static/block/axis-bubble/0.0.1/index.html +0 -222
  135. package/web/static/block/bar/0.0.1/index.html +0 -581
  136. package/web/static/block/bar-list/0.0.1/index.html +0 -231
  137. package/web/static/block/bar-race/0.0.1/index.html +0 -184
  138. package/web/static/block/base/0.0.1/index.html +0 -197
  139. package/web/static/block/blank/0.0.1/index.html +0 -42
  140. package/web/static/block/bubble/0.0.1/index.html +0 -402
  141. package/web/static/block/bubble/0.0.1/test.html +0 -0
  142. package/web/static/block/curve-bar/0.0.1/index.html +0 -148
  143. package/web/static/block/dumbbell/0.0.1/index.html +0 -178
  144. package/web/static/block/empty/0.0.1/index.html +0 -76
  145. package/web/static/block/gauge/0.0.1/index.html +0 -150
  146. package/web/static/block/line/0.0.1/index.html +0 -540
  147. package/web/static/block/number/0.0.1/index.html +0 -152
  148. package/web/static/block/percent-list/0.0.1/index.html +0 -316
  149. package/web/static/block/pie/0.0.1/index.html +0 -281
  150. package/web/static/block/pie-bubble/0.0.1/index.html +0 -358
  151. package/web/static/block/radar/0.0.1/index.html +0 -149
  152. package/web/static/block/scatter/0.0.1/index.html +0 -251
  153. package/web/static/block/sheet/0.0.1/index.html +0 -103
  154. package/web/static/block/table/0.0.1/index.html +0 -73
  155. package/web/static/block/taiwantown/0.0.1/index.html +0 -210
  156. package/web/static/block/taiwanvillage/0.0.1/index.html +0 -220
  157. package/web/static/block/treemap/0.0.1/index.html +0 -360
  158. package/web/static/block/voronoi-treemap/0.0.1/index.html +0 -350
  159. package/web/static/block/wordcloud/0.0.1/index.html +0 -92
  160. package/web/static/block/worldmap/0.0.1/index.html +0 -207
  161. package/web/static/css/index.css +0 -0
  162. package/web/static/css/index.min.css +0 -0
  163. package/web/static/favicon.ico +0 -0
  164. package/web/static/index.html +0 -153
@@ -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
@@ -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
@@ -1,19 +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/bootstrap.ldui/main/bootstrap.ldui.min.css")
11
- +css("/assets/lib/@loadingio/loading.css/main/loading.min.css")
12
- +css("/css/index.css")
13
- block head
14
- body
15
- block body
16
- +script("https://polyfill.io/v3/polyfill.min.js?features=ResizeObserver")
17
- +script("/assets/lib/@loadingio/ldquery/main/ldq.min.js")
18
- +script("/assets/lib/ldview/main/index.min.js")
19
- block script
@@ -1,38 +0,0 @@
1
- <-(->it!) _
2
-
3
- block-factory =
4
- pkg:
5
- name: 'axis', version: '0.0.1'
6
- extend: {name: "base", version: "0.0.1"}
7
- dependencies: []
8
- init: ({root, context, pubsub}) ->
9
- pubsub.fire \init, mod: mod {context} .then ~> it.0
10
-
11
- mod = ({context}) ->
12
- {d3,forceBoundary,ldcolor,repeatString$,infinite} = context
13
- sample: ->
14
- raw: [0 to 7].map (val) ~> {val: val, name: val}
15
- binding:
16
- name: {key: \name}
17
- value: {key: \val}
18
- config: {}
19
- dimension:
20
- value: {type: \R, name: "value"}
21
- name: {type: \N, name: "name"}
22
- init: ->
23
- @ab = d3.axisBottom!
24
- @scale = x: d3.scaleLinear!
25
- @g = d3.select @svg .append \g
26
-
27
- parse: ->
28
-
29
- resize: ->
30
- @scale.x.domain [0, 20] .range [20, @box.width - 20]
31
- @ab.scale @scale.x .tickValues [0 to 20]
32
-
33
- render: ->
34
- @g.call @ab
35
-
36
-
37
-
38
- return block-factory
@@ -1 +0,0 @@
1
- div: script(type="@plotdb/block"): include:lsc index.ls
@@ -1,141 +0,0 @@
1
- <- (->it!) _
2
-
3
- block-factory =
4
- pkg:
5
- name: 'axis-bubble', version: '0.0.1'
6
- extend: {name: "base", version: "0.0.1"}
7
- dependencies: []
8
- init: ({root, context, pubsub}) ->
9
- pubsub.fire \init, mod: mod {context} .then ~> it.0
10
-
11
- mod = ({context}) ->
12
- {d3, forceBoundary, ldcolor, repeatString$} = context
13
- sample: ->
14
- raw: [0 to 200].map (val) ~>
15
- {val: Math.random! * 50 + 10, x: Math.random!, cat: Math.ceil(5 * Math.random!)}
16
- binding: do
17
- color: {key: \cat}
18
- radius: {key: \val}
19
- xpos: {key: \x}
20
- config: {}
21
- dimension:
22
- color: {type: \R, name: "顏色"}
23
- radius: {type: \R, name: "半徑"}
24
- xpos: {type: \R, name: "X座標"}
25
- init: ->
26
- @svg.addEventListener \click, ~>
27
- @type = !@type
28
- @resize!
29
- @render!
30
- @sim.stop!
31
- @sim.alpha 0.9
32
- @svg.appendChild t = document.createElementNS('http://www.w3.org/2000/svg', 'text')
33
- @text = d3.select(t)
34
- @text
35
- .attr \x, 20
36
- .attr \y, 20
37
- parse: ->
38
- @xextent = d3.extent(@data.map -> it.xpos)
39
- @rextent = d3.extent @data.map -> it.radius
40
- @cextent = d3.extent @data.map -> it.color
41
- resize: ->
42
- rng = d3.randomUniform.source(d3.randomLcg(root.seed))(0, 1)
43
- @scale-x = d3.scaleLinear!domain @xextent .range [0, @box.width]
44
- if @type =>
45
- @scale-y = d3.scaleLinear!domain @cextent .range [0, @box.height]
46
- else
47
- @scale-y = ~> @box.height / 2
48
- @data.map (v) ~>
49
- v <<< {
50
- x: v.x or @scale-x(v.xpos)
51
- y: v.y or @box.height / 2
52
- ty: @scale-y(v.color)
53
- val: v.radius
54
- r: v.radius
55
- c: v.color
56
- }
57
- @area = @box.width * @box.height
58
- @rate = 0.5
59
- render: ->
60
- rate = @rate
61
- @scale = do
62
- color: d3.interpolateTurbo
63
- r: d3.scaleLinear!domain(@rextent).range([0,1])
64
- c: d3.scaleLinear!domain(@cextent).range([0,1])
65
- pal = if @cfg.palette => @cfg.palette.colors.map -> ldcolor.web(it.value or it) else <[#f00 #0f0 #00f #f90 #9f0 #0f9]>
66
- int-color = d3.interpolateDiscrete pal
67
- @scale.color = ~> int-color(@scale.c it)
68
-
69
- d3.select @svg .selectAll \circle.bubble .data @data
70
- ..exit!remove!
71
- ..enter!append \circle
72
- .attr \class, \bubble
73
- .attr \r, (d,i) ~> 0
74
- .attr \fill, (d,i) ~> @scale.color d.c
75
-
76
- d3.select @svg .selectAll \circle.bubble
77
- .attr \cx, (d,i) -> d.x
78
- .attr \cy, (d,i) -> d.y
79
- .attr \fill, (d,i) ~> @scale.color d.c #@scale.r(d.c)
80
- .attr \r, (d,i) ~> (d.r >? 2) * @rate
81
-
82
- d3.select @svg .selectAll \g.label .data @data
83
- ..exit!remove!
84
- ..enter!append \g
85
- .attr \class, \label
86
- .each (d,i) ->
87
- [0] #[0,1]
88
- .map ~> d3.select(@).append \text
89
- .map ->
90
- it
91
- .attr \dy, \-.28em
92
- .attr \text-anchor, \middle
93
- .attr \font-size, \.7em
94
- .attr \font-family, \Rubik
95
- .style \pointer-event, \none
96
- d3.select @svg .selectAll \g.label
97
- .attr \transform, (d,i) -> "translate(#{d.x},#{d.y})"
98
- .each (d,i) ->
99
- d3.select(@).selectAll \text
100
- .attr \opacity, (if ( d.r * 2 * rate ) < "#{(d.val).toFixed(2)}".length * 7 => 0 else 1)
101
- .attr \dy, (e,i) -> \.38em #if i == 0 => '-.28em' else '.88em'
102
- .text (e,i) ->
103
- if i == 0 =>
104
- if d.val > 1000000 => (d.val/1000000).toFixed(2) + "M"
105
- else if d.val > 1000 => (d.val/1000).toFixed(2) + "K"
106
- else (d.val).toFixed(2)
107
- else return d._idx
108
-
109
- tick: ->
110
- if !@sim =>
111
- kickoff = true
112
- @fc = fc = d3.forceCollide!
113
- @sim = d3.forceSimulation!
114
- .force \center, @fg = d3.forceCenter @box.width/2, @box.height/2
115
- .force \x, @fx = d3.forceX(@box.width / 2).strength(0.15)
116
- .force \y, @fy = d3.forceY((@box.height) / 2).strength(0.1)
117
- .force \b, @fb = forceBoundary((->it.r), (->it.r), (~>@box.width - it.r), (~>@box.height - it.r))
118
- .force \collide, fc
119
- @sim.stop!
120
- @sim.alpha 0.9
121
- @sim.nodes(@data)
122
- @fc.strength 1.0
123
- @fc.radius ~> @rate * it.r + 2
124
- @fg.x @box.width/2
125
- @fg.y @box.height/2
126
- @fx.strength 0.15
127
- @fy.strength 0.01
128
- @sim.tick if kickoff => 20 else 1
129
- alpha = @sim.alpha!
130
- @text.text alpha
131
- if alpha < 0.001 => @stop!
132
- @data.map -> it.y = it.y + (it.ty - it.y) * alpha * 0.1
133
-
134
- d3.select @svg .selectAll \circle.bubble
135
- .attr \cx, (d,i) -> d.x
136
- .attr \cy, (d,i) -> d.y
137
- d3.select @svg .selectAll \g.label
138
- .attr \transform, (d,i) -> "translate(#{d.x},#{d.y})"
139
- @render!
140
-
141
- return block-factory
@@ -1 +0,0 @@
1
- div: script(type="@plotdb/block"): include:lsc index.ls