@plotdb/chart 0.0.3 → 2.0.0

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 (194) hide show
  1. package/CHANGELOG.md +34 -1
  2. package/README.md +3 -3
  3. package/{dist/data → data}/index.js +0 -0
  4. package/{dist/chart.css → index.css} +0 -0
  5. package/{dist/chart.js → index.js} +3 -1
  6. package/{dist/chart.min.css → index.min.css} +0 -0
  7. package/index.min.js +1 -0
  8. package/package.json +1 -89
  9. package/{dist/utils → utils}/axis.js +6 -0
  10. package/utils/axis.min.js +1 -0
  11. package/{dist/utils → utils}/config.js +0 -0
  12. package/utils/config.min.js +1 -0
  13. package/{dist/utils → utils}/data.js +0 -0
  14. package/utils/data.min.js +1 -0
  15. package/{dist/utils → utils}/format.js +0 -0
  16. package/utils/format.min.js +1 -0
  17. package/{dist/utils → utils}/legend.css +0 -0
  18. package/{dist/utils → utils}/legend.js +0 -0
  19. package/{dist/utils → utils}/legend.min.css +0 -0
  20. package/utils/legend.min.js +1 -0
  21. package/{dist/utils → utils}/tint.js +0 -0
  22. package/utils/tint.min.js +1 -0
  23. package/{dist/utils → utils}/tip.js +0 -0
  24. package/utils/tip.min.js +1 -0
  25. package/build +0 -39
  26. package/dist/chart.min.js +0 -1
  27. package/dist/utils/axis.min.js +0 -1
  28. package/dist/utils/config.min.js +0 -1
  29. package/dist/utils/data.min.js +0 -1
  30. package/dist/utils/format.min.js +0 -1
  31. package/dist/utils/legend.min.js +0 -1
  32. package/dist/utils/tint.min.js +0 -1
  33. package/dist/utils/tip.min.js +0 -1
  34. package/doc/charts.md +0 -58
  35. package/doc/config.md +0 -44
  36. package/doc/draft/chart.md +0 -146
  37. package/doc/draft/data.md +0 -8
  38. package/doc/draft/definition.md +0 -0
  39. package/doc/draft/events.md +0 -0
  40. package/doc/draft/filter.md +0 -0
  41. package/doc/draft/lifecycle.md +0 -89
  42. package/doc/spec.md +0 -89
  43. package/doc/todo.md +0 -27
  44. package/doc/utils/tip.md +0 -84
  45. package/src/chart.ls +0 -323
  46. package/src/chart.styl +0 -6
  47. package/src/data/en-US/category +0 -20
  48. package/src/data/en-US/fruit +0 -39
  49. package/src/data/en-US/movie +0 -125
  50. package/src/data/en-US/name +0 -58
  51. package/src/data/index.ls +0 -34
  52. package/src/data/zh-TW/category +0 -20
  53. package/src/data/zh-TW/fruits +0 -38
  54. package/src/data/zh-TW/movie +0 -125
  55. package/src/data/zh-TW/names +0 -105
  56. package/src/utils/axis.ls +0 -229
  57. package/src/utils/config.ls +0 -11
  58. package/src/utils/data.ls +0 -104
  59. package/src/utils/format.ls +0 -30
  60. package/src/utils/legend.ls +0 -134
  61. package/src/utils/legend.styl +0 -37
  62. package/src/utils/tint.ls +0 -66
  63. package/src/utils/tip.ls +0 -97
  64. package/web/src/pug/base.pug +0 -20
  65. package/web/src/pug/block/axis/0.0.1/index.ls +0 -38
  66. package/web/src/pug/block/axis/0.0.1/index.pug +0 -1
  67. package/web/src/pug/block/axis-bubble/0.0.1/index.ls +0 -141
  68. package/web/src/pug/block/axis-bubble/0.0.1/index.pug +0 -1
  69. package/web/src/pug/block/bar/0.0.1/index.ls +0 -274
  70. package/web/src/pug/block/bar/0.0.1/index.pug +0 -35
  71. package/web/src/pug/block/bar-list/0.0.1/index.ls +0 -85
  72. package/web/src/pug/block/bar-list/0.0.1/index.pug +0 -30
  73. package/web/src/pug/block/bar-race/0.0.1/index.ls +0 -83
  74. package/web/src/pug/block/bar-race/0.0.1/index.pug +0 -21
  75. package/web/src/pug/block/base/0.0.1/index.ls +0 -67
  76. package/web/src/pug/block/base/0.0.1/index.pug +0 -5
  77. package/web/src/pug/block/blank/0.0.1/index.ls +0 -25
  78. package/web/src/pug/block/blank/0.0.1/index.pug +0 -1
  79. package/web/src/pug/block/bubble/0.0.1/index.ls +0 -220
  80. package/web/src/pug/block/bubble/0.0.1/index.pug +0 -28
  81. package/web/src/pug/block/curve-bar/0.0.1/index.ls +0 -89
  82. package/web/src/pug/block/curve-bar/0.0.1/index.pug +0 -16
  83. package/web/src/pug/block/curve-bar/0.0.1/sample.js +0 -338
  84. package/web/src/pug/block/dumbbell/0.0.1/index.ls +0 -90
  85. package/web/src/pug/block/dumbbell/0.0.1/index.pug +0 -1
  86. package/web/src/pug/block/empty/0.0.1/index.ls +0 -27
  87. package/web/src/pug/block/empty/0.0.1/index.pug +0 -2
  88. package/web/src/pug/block/gauge/0.0.1/index.ls +0 -100
  89. package/web/src/pug/block/gauge/0.0.1/index.pug +0 -31
  90. package/web/src/pug/block/gauge/0.0.1/sample.js +0 -338
  91. package/web/src/pug/block/line/0.0.1/index.ls +0 -302
  92. package/web/src/pug/block/line/0.0.1/index.pug +0 -33
  93. package/web/src/pug/block/number/0.0.1/index.ls +0 -69
  94. package/web/src/pug/block/number/0.0.1/index.pug +0 -20
  95. package/web/src/pug/block/percent-list/0.0.1/index.ls +0 -167
  96. package/web/src/pug/block/percent-list/0.0.1/index.pug +0 -34
  97. package/web/src/pug/block/pie/0.0.1/index.ls +0 -125
  98. package/web/src/pug/block/pie/0.0.1/index.pug +0 -19
  99. package/web/src/pug/block/pie/0.0.1/sample.js +0 -338
  100. package/web/src/pug/block/pie-bubble/0.0.1/index.ls +0 -185
  101. package/web/src/pug/block/pie-bubble/0.0.1/index.pug +0 -40
  102. package/web/src/pug/block/radar/0.0.1/index.ls +0 -113
  103. package/web/src/pug/block/radar/0.0.1/index.pug +0 -1
  104. package/web/src/pug/block/radar/0.0.1/xx +0 -285
  105. package/web/src/pug/block/scatter/0.0.1/index.ls +0 -128
  106. package/web/src/pug/block/scatter/0.0.1/index.pug +0 -30
  107. package/web/src/pug/block/sheet/0.0.1/index.ls +0 -38
  108. package/web/src/pug/block/sheet/0.0.1/index.pug +0 -5
  109. package/web/src/pug/block/table/0.0.1/index.ls +0 -40
  110. package/web/src/pug/block/table/0.0.1/index.pug +0 -3
  111. package/web/src/pug/block/taiwancounty/0.0.1/index.ls +0 -74
  112. package/web/src/pug/block/taiwancounty/0.0.1/index.pug +0 -64
  113. package/web/src/pug/block/taiwantown/0.0.1/index.ls +0 -48
  114. package/web/src/pug/block/taiwantown/0.0.1/index.pug +0 -52
  115. package/web/src/pug/block/taiwanvillage/0.0.1/index.ls +0 -53
  116. package/web/src/pug/block/taiwanvillage/0.0.1/index.pug +0 -52
  117. package/web/src/pug/block/treemap/0.0.1/index.ls +0 -172
  118. package/web/src/pug/block/treemap/0.0.1/index.pug +0 -42
  119. package/web/src/pug/block/voronoi-treemap/0.0.1/index.ls +0 -174
  120. package/web/src/pug/block/voronoi-treemap/0.0.1/index.pug +0 -17
  121. package/web/src/pug/block/voronoi-treemap/0.0.1/sample.js +0 -241
  122. package/web/src/pug/block/wordcloud/0.0.1/index.ls +0 -61
  123. package/web/src/pug/block/wordcloud/0.0.1/index.pug +0 -1
  124. package/web/src/pug/block/worldmap/0.0.1/index.ls +0 -81
  125. package/web/src/pug/block/worldmap/0.0.1/index.pug +0 -12
  126. package/web/src/pug/index.ls +0 -72
  127. package/web/src/pug/index.pug +0 -51
  128. package/web/src/styl/index.styl +0 -0
  129. package/web/static/assets/block/cache.js +0 -4
  130. package/web/static/assets/custom-lib/d3/d3-array.v2.js +0 -1182
  131. package/web/static/assets/custom-lib/d3/d3-array.v2.min.js +0 -2
  132. package/web/static/assets/custom-lib/d3/d3-array.v3.js +0 -1273
  133. package/web/static/assets/custom-lib/d3/d3-array.v3.min.js +0 -1273
  134. package/web/static/assets/custom-lib/d3/d3-axis.v2.min.js +0 -2
  135. package/web/static/assets/custom-lib/d3/d3-brush.v2.min.js +0 -2
  136. package/web/static/assets/custom-lib/d3/d3-color.v2.min.js +0 -2
  137. package/web/static/assets/custom-lib/d3/d3-dispatch.v2.min.js +0 -2
  138. package/web/static/assets/custom-lib/d3/d3-drag.v2.min.js +0 -2
  139. package/web/static/assets/custom-lib/d3/d3-ease.v2.min.js +0 -2
  140. package/web/static/assets/custom-lib/d3/d3-force-boundary.v0.0.1.min.js +0 -2
  141. package/web/static/assets/custom-lib/d3/d3-force.v2.min.js +0 -2
  142. package/web/static/assets/custom-lib/d3/d3-format.v2.min.js +0 -2
  143. package/web/static/assets/custom-lib/d3/d3-geo.v2.js +0 -3127
  144. package/web/static/assets/custom-lib/d3/d3-geo.v2.min.js +0 -2
  145. package/web/static/assets/custom-lib/d3/d3-hierarchy.v2.min.js +0 -2
  146. package/web/static/assets/custom-lib/d3/d3-interpolate.v2.min.js +0 -2
  147. package/web/static/assets/custom-lib/d3/d3-path.v2.min.js +0 -2
  148. package/web/static/assets/custom-lib/d3/d3-quadtree.v2.min.js +0 -2
  149. package/web/static/assets/custom-lib/d3/d3-random.v2.min.js +0 -2
  150. package/web/static/assets/custom-lib/d3/d3-scale-chromatic.v1.min.js +0 -2
  151. package/web/static/assets/custom-lib/d3/d3-selection.v2.min.js +0 -2
  152. package/web/static/assets/custom-lib/d3/d3-shape.v2.min.js +0 -2
  153. package/web/static/assets/custom-lib/d3/d3-timer.v2.min.js +0 -2
  154. package/web/static/assets/custom-lib/d3/d3-transition.v2.min.js +0 -2
  155. package/web/static/assets/custom-lib/d3/d3.v4.js +0 -17178
  156. package/web/static/assets/custom-lib/d3/d3.v4.min.js +0 -2
  157. package/web/static/assets/custom-lib/d3/d3.v6.js +0 -19708
  158. package/web/static/assets/data/countrycode.json +0 -1
  159. package/web/static/assets/data/world-110m.json +0 -1
  160. package/web/static/assets/data/zh-to-alpha2.json +0 -1
  161. package/web/static/assets/img/fluid.svg +0 -16
  162. package/web/static/block/axis/0.0.1/index.html +0 -79
  163. package/web/static/block/axis-bubble/0.0.1/index.html +0 -222
  164. package/web/static/block/bar/0.0.1/index.html +0 -581
  165. package/web/static/block/bar-list/0.0.1/index.html +0 -231
  166. package/web/static/block/bar-race/0.0.1/index.html +0 -184
  167. package/web/static/block/base/0.0.1/index.html +0 -197
  168. package/web/static/block/blank/0.0.1/index.html +0 -42
  169. package/web/static/block/bubble/0.0.1/index.html +0 -402
  170. package/web/static/block/bubble/0.0.1/test.html +0 -0
  171. package/web/static/block/curve-bar/0.0.1/index.html +0 -148
  172. package/web/static/block/dumbbell/0.0.1/index.html +0 -178
  173. package/web/static/block/empty/0.0.1/index.html +0 -76
  174. package/web/static/block/gauge/0.0.1/index.html +0 -150
  175. package/web/static/block/line/0.0.1/index.html +0 -571
  176. package/web/static/block/number/0.0.1/index.html +0 -152
  177. package/web/static/block/percent-list/0.0.1/index.html +0 -316
  178. package/web/static/block/pie/0.0.1/index.html +0 -281
  179. package/web/static/block/pie-bubble/0.0.1/index.html +0 -358
  180. package/web/static/block/radar/0.0.1/index.html +0 -149
  181. package/web/static/block/scatter/0.0.1/index.html +0 -251
  182. package/web/static/block/sheet/0.0.1/index.html +0 -103
  183. package/web/static/block/table/0.0.1/index.html +0 -73
  184. package/web/static/block/taiwancounty/0.0.1/index.html +0 -202
  185. package/web/static/block/taiwantown/0.0.1/index.html +0 -210
  186. package/web/static/block/taiwanvillage/0.0.1/index.html +0 -220
  187. package/web/static/block/treemap/0.0.1/index.html +0 -360
  188. package/web/static/block/voronoi-treemap/0.0.1/index.html +0 -350
  189. package/web/static/block/wordcloud/0.0.1/index.html +0 -92
  190. package/web/static/block/worldmap/0.0.1/index.html +0 -207
  191. package/web/static/css/index.css +0 -0
  192. package/web/static/css/index.min.css +0 -0
  193. package/web/static/favicon.ico +0 -0
  194. 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,20 +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("/css/index.css")
13
- block head
14
- body
15
- block body
16
- +script("/assets/lib/bootstrap.native/main/bootstrap-native-v4.min.js")
17
- +script("https://polyfill.io/v3/polyfill.min.js?features=ResizeObserver")
18
- +script("/assets/lib/@loadingio/ldquery/main/ldq.min.js")
19
- +script("/assets/lib/ldview/main/index.min.js")
20
- 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