@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.
Files changed (164) hide show
  1. package/package.json +3 -1
  2. package/CHANGELOG.md +0 -29
  3. package/build +0 -45
  4. package/doc/charts.md +0 -58
  5. package/doc/config.md +0 -44
  6. package/doc/draft/chart.md +0 -146
  7. package/doc/draft/data.md +0 -8
  8. package/doc/draft/definition.md +0 -0
  9. package/doc/draft/events.md +0 -0
  10. package/doc/draft/filter.md +0 -0
  11. package/doc/draft/lifecycle.md +0 -89
  12. package/doc/spec.md +0 -89
  13. package/doc/todo.md +0 -27
  14. package/doc/utils/tip.md +0 -84
  15. package/src/data/en-US/category +0 -20
  16. package/src/data/en-US/fruit +0 -39
  17. package/src/data/en-US/movie +0 -125
  18. package/src/data/en-US/name +0 -58
  19. package/src/data/index.ls +0 -34
  20. package/src/data/zh-TW/category +0 -20
  21. package/src/data/zh-TW/fruits +0 -38
  22. package/src/data/zh-TW/movie +0 -125
  23. package/src/data/zh-TW/names +0 -105
  24. package/src/index.ls +0 -323
  25. package/src/index.styl +0 -6
  26. package/src/utils/axis.ls +0 -229
  27. package/src/utils/config.ls +0 -11
  28. package/src/utils/data.ls +0 -104
  29. package/src/utils/format.ls +0 -30
  30. package/src/utils/legend.ls +0 -134
  31. package/src/utils/legend.styl +0 -37
  32. package/src/utils/tint.ls +0 -66
  33. package/src/utils/tip.ls +0 -97
  34. package/web/src/pug/base.pug +0 -21
  35. package/web/src/pug/block/axis/0.0.1/index.ls +0 -32
  36. package/web/src/pug/block/axis/0.0.1/index.pug +0 -1
  37. package/web/src/pug/block/axis-bubble/0.0.1/index.ls +0 -137
  38. package/web/src/pug/block/axis-bubble/0.0.1/index.pug +0 -1
  39. package/web/src/pug/block/bar/0.0.1/index.ls +0 -270
  40. package/web/src/pug/block/bar/0.0.1/index.pug +0 -35
  41. package/web/src/pug/block/bar-list/0.0.1/index.ls +0 -81
  42. package/web/src/pug/block/bar-list/0.0.1/index.pug +0 -30
  43. package/web/src/pug/block/bar-race/0.0.1/index.ls +0 -79
  44. package/web/src/pug/block/bar-race/0.0.1/index.pug +0 -21
  45. package/web/src/pug/block/base/0.0.1/index.ls +0 -66
  46. package/web/src/pug/block/base/0.0.1/index.pug +0 -5
  47. package/web/src/pug/block/blank/0.0.1/index.ls +0 -21
  48. package/web/src/pug/block/blank/0.0.1/index.pug +0 -1
  49. package/web/src/pug/block/bubble/0.0.1/index.ls +0 -218
  50. package/web/src/pug/block/bubble/0.0.1/index.pug +0 -42
  51. package/web/src/pug/block/curve-bar/0.0.1/index.ls +0 -85
  52. package/web/src/pug/block/curve-bar/0.0.1/index.pug +0 -16
  53. package/web/src/pug/block/curve-bar/0.0.1/sample.js +0 -338
  54. package/web/src/pug/block/dumbbell/0.0.1/index.ls +0 -86
  55. package/web/src/pug/block/dumbbell/0.0.1/index.pug +0 -1
  56. package/web/src/pug/block/empty/0.0.1/index.ls +0 -28
  57. package/web/src/pug/block/empty/0.0.1/index.pug +0 -2
  58. package/web/src/pug/block/gauge/0.0.1/index.ls +0 -96
  59. package/web/src/pug/block/gauge/0.0.1/index.pug +0 -31
  60. package/web/src/pug/block/gauge/0.0.1/sample.js +0 -338
  61. package/web/src/pug/block/line/0.0.1/index.ls +0 -297
  62. package/web/src/pug/block/line/0.0.1/index.pug +0 -33
  63. package/web/src/pug/block/number/0.0.1/index.ls +0 -65
  64. package/web/src/pug/block/number/0.0.1/index.pug +0 -20
  65. package/web/src/pug/block/percent-list/0.0.1/index.ls +0 -161
  66. package/web/src/pug/block/percent-list/0.0.1/index.pug +0 -34
  67. package/web/src/pug/block/pie/0.0.1/index.ls +0 -121
  68. package/web/src/pug/block/pie/0.0.1/index.pug +0 -19
  69. package/web/src/pug/block/pie/0.0.1/sample.js +0 -338
  70. package/web/src/pug/block/pie-bubble/0.0.1/index.ls +0 -181
  71. package/web/src/pug/block/pie-bubble/0.0.1/index.pug +0 -40
  72. package/web/src/pug/block/radar/0.0.1/index.ls +0 -109
  73. package/web/src/pug/block/radar/0.0.1/index.pug +0 -1
  74. package/web/src/pug/block/radar/0.0.1/xx +0 -285
  75. package/web/src/pug/block/scatter/0.0.1/index.ls +0 -124
  76. package/web/src/pug/block/scatter/0.0.1/index.pug +0 -30
  77. package/web/src/pug/block/sheet/0.0.1/index.ls +0 -34
  78. package/web/src/pug/block/sheet/0.0.1/index.pug +0 -5
  79. package/web/src/pug/block/table/0.0.1/index.ls +0 -36
  80. package/web/src/pug/block/table/0.0.1/index.pug +0 -3
  81. package/web/src/pug/block/taiwancounty/0.0.1/index.ls +0 -70
  82. package/web/src/pug/block/taiwancounty/0.0.1/index.pug +0 -64
  83. package/web/src/pug/block/taiwantown/0.0.1/index.ls +0 -44
  84. package/web/src/pug/block/taiwantown/0.0.1/index.pug +0 -52
  85. package/web/src/pug/block/taiwanvillage/0.0.1/index.ls +0 -49
  86. package/web/src/pug/block/taiwanvillage/0.0.1/index.pug +0 -52
  87. package/web/src/pug/block/treemap/0.0.1/index.ls +0 -168
  88. package/web/src/pug/block/treemap/0.0.1/index.pug +0 -42
  89. package/web/src/pug/block/voronoi-treemap/0.0.1/index.ls +0 -170
  90. package/web/src/pug/block/voronoi-treemap/0.0.1/index.pug +0 -17
  91. package/web/src/pug/block/voronoi-treemap/0.0.1/sample.js +0 -241
  92. package/web/src/pug/block/wordcloud/0.0.1/index.ls +0 -57
  93. package/web/src/pug/block/wordcloud/0.0.1/index.pug +0 -1
  94. package/web/src/pug/block/worldmap/0.0.1/index.ls +0 -77
  95. package/web/src/pug/block/worldmap/0.0.1/index.pug +0 -12
  96. package/web/src/pug/index.ls +0 -72
  97. package/web/src/pug/index.pug +0 -51
  98. package/web/src/styl/index.styl +0 -6
  99. package/web/static/assets/block/cache.js +0 -4
  100. package/web/static/assets/custom-lib/d3/d3-array.v2.js +0 -1182
  101. package/web/static/assets/custom-lib/d3/d3-array.v2.min.js +0 -2
  102. package/web/static/assets/custom-lib/d3/d3-array.v3.js +0 -1273
  103. package/web/static/assets/custom-lib/d3/d3-array.v3.min.js +0 -1273
  104. package/web/static/assets/custom-lib/d3/d3-axis.v2.min.js +0 -2
  105. package/web/static/assets/custom-lib/d3/d3-brush.v2.min.js +0 -2
  106. package/web/static/assets/custom-lib/d3/d3-color.v2.min.js +0 -2
  107. package/web/static/assets/custom-lib/d3/d3-dispatch.v2.min.js +0 -2
  108. package/web/static/assets/custom-lib/d3/d3-drag.v2.min.js +0 -2
  109. package/web/static/assets/custom-lib/d3/d3-ease.v2.min.js +0 -2
  110. package/web/static/assets/custom-lib/d3/d3-force-boundary.v0.0.1.min.js +0 -2
  111. package/web/static/assets/custom-lib/d3/d3-force.v2.min.js +0 -2
  112. package/web/static/assets/custom-lib/d3/d3-format.v2.min.js +0 -2
  113. package/web/static/assets/custom-lib/d3/d3-geo.v2.js +0 -3127
  114. package/web/static/assets/custom-lib/d3/d3-geo.v2.min.js +0 -2
  115. package/web/static/assets/custom-lib/d3/d3-hierarchy.v2.min.js +0 -2
  116. package/web/static/assets/custom-lib/d3/d3-interpolate.v2.min.js +0 -2
  117. package/web/static/assets/custom-lib/d3/d3-path.v2.min.js +0 -2
  118. package/web/static/assets/custom-lib/d3/d3-quadtree.v2.min.js +0 -2
  119. package/web/static/assets/custom-lib/d3/d3-random.v2.min.js +0 -2
  120. package/web/static/assets/custom-lib/d3/d3-scale-chromatic.v1.min.js +0 -2
  121. package/web/static/assets/custom-lib/d3/d3-selection.v2.min.js +0 -2
  122. package/web/static/assets/custom-lib/d3/d3-shape.v2.min.js +0 -2
  123. package/web/static/assets/custom-lib/d3/d3-timer.v2.min.js +0 -2
  124. package/web/static/assets/custom-lib/d3/d3-transition.v2.min.js +0 -2
  125. package/web/static/assets/custom-lib/d3/d3.v4.js +0 -17178
  126. package/web/static/assets/custom-lib/d3/d3.v4.min.js +0 -2
  127. package/web/static/assets/custom-lib/d3/d3.v6.js +0 -19708
  128. package/web/static/assets/data/countrycode.json +0 -1
  129. package/web/static/assets/data/world-110m.json +0 -1
  130. package/web/static/assets/data/zh-to-alpha2.json +0 -1
  131. package/web/static/assets/img/fluid.svg +0 -16
  132. package/web/static/block/axis/0.0.1/index.html +0 -74
  133. package/web/static/block/axis-bubble/0.0.1/index.html +0 -217
  134. package/web/static/block/bar/0.0.1/index.html +0 -576
  135. package/web/static/block/bar-list/0.0.1/index.html +0 -226
  136. package/web/static/block/bar-race/0.0.1/index.html +0 -179
  137. package/web/static/block/base/0.0.1/index.html +0 -197
  138. package/web/static/block/blank/0.0.1/index.html +0 -37
  139. package/web/static/block/bubble/0.0.1/index.html +0 -422
  140. package/web/static/block/bubble/0.0.1/test.html +0 -0
  141. package/web/static/block/curve-bar/0.0.1/index.html +0 -143
  142. package/web/static/block/dumbbell/0.0.1/index.html +0 -173
  143. package/web/static/block/empty/0.0.1/index.html +0 -76
  144. package/web/static/block/gauge/0.0.1/index.html +0 -145
  145. package/web/static/block/line/0.0.1/index.html +0 -566
  146. package/web/static/block/number/0.0.1/index.html +0 -147
  147. package/web/static/block/percent-list/0.0.1/index.html +0 -311
  148. package/web/static/block/pie/0.0.1/index.html +0 -276
  149. package/web/static/block/pie-bubble/0.0.1/index.html +0 -353
  150. package/web/static/block/radar/0.0.1/index.html +0 -144
  151. package/web/static/block/scatter/0.0.1/index.html +0 -246
  152. package/web/static/block/sheet/0.0.1/index.html +0 -98
  153. package/web/static/block/table/0.0.1/index.html +0 -67
  154. package/web/static/block/taiwancounty/0.0.1/index.html +0 -197
  155. package/web/static/block/taiwantown/0.0.1/index.html +0 -205
  156. package/web/static/block/taiwanvillage/0.0.1/index.html +0 -215
  157. package/web/static/block/treemap/0.0.1/index.html +0 -355
  158. package/web/static/block/voronoi-treemap/0.0.1/index.html +0 -345
  159. package/web/static/block/wordcloud/0.0.1/index.html +0 -87
  160. package/web/static/block/worldmap/0.0.1/index.html +0 -202
  161. package/web/static/css/index.css +0 -6
  162. package/web/static/css/index.min.css +0 -1
  163. package/web/static/favicon.ico +0 -0
  164. package/web/static/index.html +0 -153
@@ -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
@@ -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,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