@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,302 +0,0 @@
1
- <-(->it!) _
2
-
3
- block-factory =
4
- pkg:
5
- name: 'line', version: '0.0.1'
6
- extend: {name: "base", version: "0.0.1"}
7
- dependencies: []
8
- i18n:
9
- "zh-TW":
10
- "y axis": "Y軸"
11
- "x axis": "X軸"
12
- "rank": "順位"
13
-
14
- init: ({root, context, pubsub, t}) ->
15
- pubsub.fire \init, mod: mod {context, t}
16
-
17
- mod = ({context, t}) ->
18
- {d3,chart,axis,format} = context
19
- sample-count = 4
20
- sample: ->
21
- raw: [0 to 30].map (val) ~>
22
- ret = {}
23
- [1 to sample-count].map (i) -> ret["val#i"] = (i * Math.random! * (10 - Math.abs(10 - val)) + val) >? 0
24
- ret.order = val
25
- ret
26
- binding:
27
- value: [1 to sample-count].map -> {key: "val#it"}
28
- order: {key: \order}
29
- config:
30
- mode: type: \choice, values: <[line area streamgraph bump]>, default: \line
31
- stack: type: \boolean
32
- line: type: \choice, values: <[curve linear]>, default: \linear
33
- show-dot: type: \boolean, default: true
34
- dimension:
35
- value: {type: \R, name: "y axis", multiple: true}
36
- order: {type: \ON, name: "x axis"}
37
- init: ->
38
- svg = d3.select @svg
39
- <[view yaxis xaxis legend]>.map ~> @{}g[it] = d3.select(@layout.get-group(it))
40
- @tint = tint = new chart.utils.tint!
41
- @line = d3.line!
42
- .defined ~>
43
- !isNaN(it.y1)
44
- .x ~> @scale.x it.x
45
- .y ~> @scale.y it.y1
46
- @area = d3.area!
47
- .defined ~>
48
- !isNaN(it.y1) and !isNaN(it.y0)
49
- .x ~> @scale.x it.x
50
- .y0 ~> @scale.y it.y0
51
- .y1 ~> @scale.y it.y1
52
- @xaxis = new chart.utils.axis layout: @layout, name: \xaxis, direction: \bottom
53
- @yaxis = new chart.utils.axis layout: @layout, name: \yaxis, direction: \left
54
- @tip = new chart.utils.tip {
55
- root: @root,
56
- range: ~> return @layout.get-node \view .getBoundingClientRect!
57
- }
58
- @_evthdr = {}
59
- @root.addEventListener \mouseout, @_evthdr.out = (evt) ~> @tip.hide!now!
60
- @root.addEventListener \mousemove, @_evthdr.move = (evt) ~>
61
- x = evt.clientX - @layout.get-node(\view).getBoundingClientRect!x
62
- y = evt.clientY - @layout.get-node(\view).getBoundingClientRect!y
63
- min = {d: -1, p: null, series: null}
64
- for i from 0 til @parsed.length =>
65
- series = @parsed[i]
66
- for j from 0 til series.pts.length =>
67
- p = series.pts[j]
68
- if isNaN(p.y1) or isNaN(p.x) => continue
69
- dx = Math.abs(@scale.x(p.x) - x)
70
- dy = Math.abs(@scale.y(p.y1) - y)
71
- d = (dx ** 2) + (dy ** 2)
72
- if min.d < 0 or min.d > d => min <<< {d, p, series}
73
- if !(min.p and min.d and min.series) => return
74
- bind = min.series.bind
75
- pt = min.p
76
-
77
- data = {
78
- name: """#{if bind => bind.name or bind.key or ''} /
79
- #{pt.data.orderText or pt.data.order or pt.x}#{@binding.order.unit or ''}
80
- """
81
- value: if isNaN(pt.v) => '-' else "#{(pt.v).toFixed(2)}#{if bind => (bind.unit or '') else ''}"
82
- }
83
- box = x: @scale.x(pt.x), y: @scale.y(pt.y)
84
- @tip.render {data, evt: evt, box}
85
-
86
- @legend = new chart.utils.legend do
87
- layout: @layout
88
- root: @root
89
- name: \legend
90
- shape: (d) -> d3.select(@).attr \fill, tint.get d.text
91
- direction: \vertical
92
- cfg: selectable: true
93
- @legend.on \select, ~> @bind!; @resize!; @render!
94
- @scale = { x: d3.scaleLinear!, y: d3.scaleLinear! }
95
-
96
- destroy: ->
97
- @root.removeEventListener \mouseout, @_evthdr.out
98
- @root.removeEventListener \mousemove, @_evthdr.move
99
- @tip.destroy!
100
-
101
- parse: ->
102
- @data.map (d,i) ->
103
- d.order-text = '' + (if !(d.order?) => i else d.order)
104
- d._order = if !(d.order?) or isNaN(+d.order) => i else +d.order
105
- @data.sort (a,b) -> if a._order > b._order => 1 else if a._order == b._order => 0 else -1
106
- @legend.data @binding.value.map -> {key: it.key, text: it.key}
107
-
108
- bind: ->
109
- binds = @binding.value
110
- binds = @binding.value.map((b,i) -> {b, i}).filter (d,i) ~> @legend.is-selected d.b.key
111
-
112
- # if bump
113
- if @cfg.mode == \bump =>
114
- @parsed = []
115
- dd = @data.map (d) ~>
116
- ret = {} <<< d
117
- v = ret.value.map (d,i) ~> {i: i, v: if @legend.is-selected(@binding.value[i].key) => d else NaN}
118
- v.sort (a,b) ->
119
- if isNaN(a.v) and isNaN(b.v) => return 0
120
- else if isNaN(b.v) => return -1
121
- else if isNaN(a.v) => return 1
122
- return b.v - a.v
123
- v.map (d,i) -> d.r = i + 1
124
- v.sort (a,b) -> a.i - b.i
125
- ret.value = v.map -> if isNaN(it.v) => NaN else it.r
126
- ret.original-value = v.map -> it.v
127
- ret
128
-
129
- dd = dd or @data
130
-
131
- if @cfg.mode == \streamgraph =>
132
- sums = dd.map (d) ->
133
- sum = 0
134
- for i from 0 til d.value.length => sum += d.value[i]
135
- sum
136
- [smin, smax] = [Math.min.apply(Math, sums), Math.max.apply(Math, sums)]
137
- else
138
- [sums, smin, smax] = [dd.map(-> 0), 0, 0]
139
- @parsed = []
140
- line0 = dd.map -> 0
141
- for i from 0 til binds.length =>
142
- [p,b] = [(if i > 0 => binds[i - 1] else null), binds[i]]
143
- line1 = dd.map (d,j) -> d.value[b.i] + line0[j]
144
- @parsed.push {
145
- pts: (dd or @data).map (d,j) ->
146
- data: d
147
- y0: line0[j] - (sums[j] / 2) + (smax - smin) / 2
148
- y1: line1[j] - (sums[j] / 2) + (smax - smin) / 2
149
- x: d._order
150
- v: if d.original-value => d.original-value[i] else d.value[i]
151
- bind: b.b
152
- color: b.b.name or b.b.key
153
- }
154
- if (@cfg.stack and @cfg.mode != \bump) or (@cfg.mode in <[streamgraph area]>) => line0 = line1
155
- /*
156
- @parsed = binds.map (b,i) ~>
157
- pts: (dd or @data).map (d,j) ->
158
- data: d
159
- y0: 0
160
- y1: d.value[b.i]
161
- x: d._order
162
- v: if d.original-value => d.original-value[i] else d.value[i]
163
- bind: b.b
164
- color: b.b.name or b.b.key
165
- */
166
- # if stacked
167
- /*
168
- if @cfg.stack =>
169
- ys = @data.map -> it.value.reduce(((a,b)-> a + b),0)
170
- @parsed = []
171
- for i from 0 til binds.length =>
172
- b = binds[i].b
173
- last = @parsed[i - 1] or null
174
- @parsed.push do
175
- pts: @data.map (d,j) ->
176
- y1: (d.value[i] + if !last => 0 else last.pts[j].y1)
177
- y0: if !last => 0 else last.pts[j].y1
178
- x: d._order
179
- v: if d.original-value => d.original-value[i] else d.value[i]
180
- bind: b
181
- color: b.name or b.key
182
- */
183
- resize: ->
184
- @line.curve if @cfg.line == \curve => d3.curveCatmullRom else d3.curveLinear
185
- @area.curve if @cfg.line == \curve => d3.curveCatmullRom else d3.curveLinear
186
- @tip.toggle(if @cfg.{}tip.enabled? => @cfg.tip.enabled else true)
187
- [miny,maxy] = [0,0]
188
- for i from 0 til @parsed.length =>
189
- for j from 0 til @parsed[i].pts.length =>
190
- p = @parsed[i].pts[j]
191
- if !isNaN(p.y0) and miny > p.y0 => miny = p.y0
192
- if !isNaN(p.y1) and miny > p.y1 => miny = p.y1
193
- if !isNaN(p.y0) and maxy < p.y0 => maxy = p.y0
194
- if !isNaN(p.y1) and maxy < p.y1 => maxy = p.y1
195
-
196
- @extent =
197
- x: d3.extent @data, -> (it._order)
198
- y: [(if @cfg.mode == \bump => miny >? 1 else miny), if maxy == miny => miny + 1 else maxy]
199
-
200
- @scale.x.domain @extent.x
201
- @scale.y.domain (if @cfg.mode == \bump => [@extent.y.1, @extent.y.0] else @extent.y)
202
-
203
- [w,h] = [@box.width, @box.height]
204
- max-tick = Math.ceil(@layout.get-box \yaxis .height / 40) >? 2
205
- yticks = if @cfg.mode == \bump => [1 to ((@parsed.length or 1) >? 1)]
206
- else @scale.y.ticks((@cfg.{}yaxis.tick-count or 4) <? max-tick)
207
- yfmt = chart.utils.format.auto yticks
208
-
209
- @legend.config @cfg.legend
210
- @legend.update!
211
-
212
- @yaxis.config @cfg.yaxis
213
- @yaxis.ticks yticks
214
- @yaxis.scale @scale.y
215
- if @cfg.mode == \bump =>
216
- @yaxis.caption t \rank
217
- else
218
- if @parsed.length > 1 =>
219
- units = Array.from(new Set(@parsed.map -> it.bind.unit)).filter -> it
220
- if units.length > 1 => @yaxis.caption('')
221
- else @yaxis.caption( units.0 or '')
222
- else
223
- v = (@parsed.0 or {}).bind or {}
224
- @yaxis.caption( (v.name or v.key or '') + if v.unit => "(#{v.unit})" else '')
225
-
226
- @xaxis.config @cfg.xaxis
227
- @xaxis.ticks @data.map -> {v: it._order, t: it.order-text}
228
- @xaxis.scale @scale.x
229
- @xaxis.caption(
230
- (@binding.order.name or @binding.order.key) +
231
- if @binding.order.unit => "(#{@binding.order.unit})" else ''
232
- )
233
-
234
- # xaxis and yaxis affect each other and they all affect view.
235
- # we may need to update them until stable but for now we simply layout twice.
236
- for i from 0 til 2 =>
237
- @layout.update false
238
- box = @layout.get-box('view')
239
- [w,h] = [box.width, box.height]
240
- @tint.set @cfg.palette
241
- r = @cfg.dot-size or 3
242
- @scale.x.range [0, w - r]
243
- @scale.y.range [h, r]
244
- @xaxis.render!
245
- @yaxis.render!
246
-
247
- render: ->
248
- {scale,tint,extent} = @
249
- r = @cfg.dot-size or 3
250
- vbox = @layout.get-box \view
251
- lbox = @layout.get-box \yaxis
252
- @g.view.selectAll \path.data .data(@parsed, -> it.bind.key)
253
- ..exit!remove!
254
- ..enter!append \path .attr \class, \data
255
- .attr \fill, \none
256
- .attr \d, (d,i) ~>
257
- if @cfg.mode in <[streamgraph area]> => @area d.pts
258
- else @line d.pts
259
- .attr \stroke, (d,i) ~> @tint.get d.color
260
- .attr \stroke-width, 1
261
- @g.view.selectAll \path.data
262
- .transition!duration 150
263
- .style \opacity, (d,i) ~> if @legend.is-selected(d.bind.key) => 1 else 0.3
264
- .attr \d, (d,i) ~>
265
- if @cfg.mode in <[streamgraph area]> => @area d.pts
266
- else @line d.pts
267
- .attr \stroke, (d,i) ~> @tint.get d.color
268
- .attr \fill, (d,i) ~> if @cfg.mode in <[streamgraph area]> => @tint.get(d.color) else \none
269
- .attr \fill-opacity, ~> \0.5
270
- @g.view.selectAll \g.dot .data((if @cfg.show-dot => @parsed else []), -> it.bind.key)
271
- ..exit!remove!
272
- ..enter!append \g .attr \class, \dot
273
- @g.view.selectAll \g.dot
274
- .style \opacity, (d,i) ~> if @legend.is-selected(d.bind.key) => 1 else 0.3
275
- .each (d,i) ->
276
- d3.select(@).selectAll \circle.dot .data d.pts
277
- ..exit!remove!
278
- ..enter!append \circle .attr \class, \dot
279
- .attr \r, r
280
- .attr \fill, \#fff
281
- .attr \stroke, tint.get(d.bind.name or d.bind.key)
282
- d3.select(@).selectAll \circle.dot
283
- .filter (d,i) -> isNaN d.y1
284
- .attr \cx, (d,i) -> if isNaN(scale.x d.x) => scale.x(extent.x.0) else scale.x(d.x)
285
- .attr \cy, (d,i) -> scale.y(extent.y.0)
286
- .transition 150
287
- .attr \opacity, 0
288
- d3.select(@).selectAll \circle.dot
289
- .filter (d,i) -> !isNaN d.y1
290
- .attr \cx, (d,i) -> scale.x d.x
291
- .attr \cy, (d,i) -> scale.y d.y1
292
- .attr \r, r
293
- .attr \fill, tint.get d.color
294
- .attr \stroke, tint.get d.color
295
- .transition 150
296
- .attr \opacity, 1
297
- @legend.render!
298
- @xaxis.render!
299
- @yaxis.render!
300
-
301
-
302
- return block-factory
@@ -1,33 +0,0 @@
1
- div
2
- div(plug="layout")
3
- .pdl-layout
4
- div(data-type="layout")
5
- .pdl-cell(data-name="yaxis") &nbsp;
6
- .pdl-cell(data-name="view")
7
- .pdl-cell
8
- .pdl-cell(data-name="xaxis") &nbsp;
9
- .pdl-cell(data-name="legend")
10
- div(data-type="render")
11
- style(type="text/css"): :stylus
12
- [data-name=xaxis] { font-size: 0.8em }
13
- [data-name=yaxis] { font-size: 0.8em }
14
- .pdl-layout > div[data-type=layout]
15
- display: grid
16
- grid-template-columns: fit-content(2em) 1fr fit-content(7em)
17
- grid-template-rows: 1fr fit-content(1em)
18
- /* 0.5em for axis label at the boundary */
19
- padding: 0 0.5em
20
- .pdl-cell[data-name=legend]
21
- padding-left: 1em
22
- grid-column: 3
23
- grid-row: 1 / span 2
24
-
25
- .pdl-layout.legend-below > div[data-type=layout]
26
- grid-template-columns: 2em 1fr
27
- grid-template-rows: 1fr fit-content(2em) fit-content(3em)
28
- .pdl-cell[data-name=legend]
29
- padding-top: 1em
30
- grid-column: 1 / span 2
31
- grid-row: 3
32
-
33
- script(type="@plotdb/block"): include:lsc index.ls
@@ -1,69 +0,0 @@
1
- <-(->it!) _
2
-
3
- block-factory =
4
- pkg:
5
- name: 'number', version: '0.0.1'
6
- extend: {name: "base", version: "0.0.1"}
7
- dependencies: []
8
-
9
- init: ({root, context, pubsub}) ->
10
- pubsub.fire \init, {mod: mod {context}} .then ~> it.0
11
-
12
- mod = ({context}) ->
13
- {d3,ldcolor,repeatString$,infinite} = context
14
- sample: ->
15
- raw: [{val: 12777216, name: "票房", unit: "新臺幣"}]
16
- binding:
17
- name: {key: \name}
18
- value: {key: \val, unit: '百萬元新臺幣'}
19
- config:
20
- enlarge: type: \boolean, default: false
21
- dimension:
22
- value: {type: \R, name: "value"}
23
- name: {type: \N, name: "name"}
24
- init: ->
25
- @n = Object.fromEntries <[number unit]>.map ~> [it, @layout.get-node(it)]
26
- @g = Object.fromEntries <[number unit]>.map ~> [it, d3.select(@layout.get-group it)]
27
- @g.number.append \text
28
- @g.unit.append \text
29
- @v = number: 0, unit: '', run: 0
30
-
31
- resize: ->
32
- [w,h] = [@box.width, @box.height]
33
- @size-rate = number: (@cfg.number-size-rate or 3), unit: (@cfg.unit-size-rate or 1)
34
- @v <<< do
35
- number: (@data.0 or {value: 0}).value
36
- unit: @binding.value.unit or (@data.0 or {unit: ''}).unit or ''
37
- @n.number
38
- ..style.fontSize = "#{@size-rate.number}em"
39
- ..textContent = @v.number
40
- @n.unit
41
- ..style.fontSize = \1em
42
- ..textContent = @v.unit
43
- @r = r = Object.fromEntries <[number unit]>.map ~> [it, (w / (@n[it]getBoundingClientRect!width or 1))]
44
- (if !@cfg.enlarge => <[number unit]> else <[unit]>).map ~> @r[it] = (r[it] <? 1)
45
- @n.number.style.fontSize = "#{@size-rate.number * r.number}em"
46
- @n.unit.style.fontSize = "#{@size-rate.unit * r.unit}em"
47
- @layout.update false
48
-
49
- tick: ->
50
- @g.number.select \text .text ~>
51
- @v.run = (@v.number - @v.run) * 0.1 + @v.run
52
- if @v.run == @v.number => @stop!
53
- return Math.round(@v.run)
54
-
55
- render: ->
56
- @g.number.select \text
57
- .attr \x, (@n.number.getBoundingClientRect!width / 2)
58
- .attr \font-size, "#{@size-rate.number * @r.number}em"
59
- .attr \font-weight, \bold
60
- .attr \dominant-baseline, \hanging
61
- .attr \text-anchor, \middle
62
- .text @v.run
63
- @g.unit.select \text
64
- .attr \font-size, "#{@size-rate.unit * @r.unit}em"
65
- .attr \dominant-baseline, \hanging
66
- .text @v.unit
67
- @start!
68
-
69
- return block-factory
@@ -1,20 +0,0 @@
1
- div
2
- div(plug="layout")
3
- .pdl-layout
4
- div(data-type="layout")
5
- .pdl-cell(data-name="number")
6
- .pdl-cell(data-name="unit")
7
- div(data-type="render")
8
- style(type="text/css"): :stylus
9
- .pdl-layout > [data-type=layout]
10
- flex-direction: column
11
- display: flex
12
- align-items: center
13
- justify-content: center
14
- .pdl-cell
15
- line-height: 1em
16
- white-space: nowrap
17
- .pdl-cell[data-name=number]
18
- font-weight: bold
19
-
20
- script(type="@plotdb/block"): include:lsc index.ls
@@ -1,167 +0,0 @@
1
- <-(->it!) _
2
-
3
- block-factory =
4
- pkg:
5
- name: 'percent-list', version: '0.0.1'
6
- extend: {name: "base", version: "0.0.1"}
7
- dependencies: []
8
- i18n:
9
- "zh-TW": "other": "其它"
10
- init: ({root, context, pubsub, t}) ->
11
- pubsub.fire \init, mod: mod {context, t}
12
-
13
- mod = ({context, t}) ->
14
- {chart,d3,wrapSvgText,debounce} = context
15
- sample: ->
16
- raw: [
17
- "Bachchan Pandey", "The Good Maharaja", "Ramprasad Ki Tehrvi",
18
- "Madam Chief Minister", "Satya Sai Baba", "Lahore Confidential",
19
- "Sandeep Aur Pinky Faraar", "Silence... Can You Hear It?"
20
- "Hum Bhi Akele Tum Bhi Akele", "Radhe", "Shaadisthan",
21
- "Chandigarh Kare Aashiqui", "Gangubai Kathiawadi", "Attack",
22
- "The Battle of Bhima Koregaon", "Tadap", "Looop Lapeta"
23
- ].map (val) ~> {val: Math.random!, name: val}
24
- binding:
25
- name: {key: \name}
26
- value: {key: \val}
27
- config: {}
28
- dimension:
29
- value: {type: \R, name: "value", priority: 20}
30
- name: {type: \N, name: "name", priority: 10}
31
- init: ->
32
- @g =
33
- view: d3.select @layout.get-group \view
34
- link: d3.select @layout.get-group \link
35
- legend: d3.select @layout.get-group \legend
36
- @tint = tint = new chart.utils.tint!
37
- @scale =
38
- y: d3.scaleLinear!
39
- @layout.get-group \view .addEventListener \mousemove, (evt) ~>
40
- if !((n = evt.target) and n.nodeName.toLowerCase! == \rect) => return
41
- @idx = Array.from(n.parentNode.childNodes).indexOf(n)
42
- @render-debounced!
43
- @render-debounced = debounce 350, ~> @render!
44
-
45
- parse: ->
46
- @cfg.{}collapse.enabled = false
47
- @parsed = @data.map -> {} <<< it
48
- @parsed.sort (a,b) -> b.value - a.value
49
- if @cfg.collapse.enabled =>
50
- if @cfg.collapse.method == \count =>
51
- other = @parsed.splice(@cfg.collapse.threshold or 7)
52
- if other.length => @parsed.push {name: t("other"), value: other.reduce(((a,b) -> a + b.value),0)}
53
- else # == \percent
54
- [total,sum] = [@parsed.reduce(((a,b) -> a + b.value),0), 0]
55
- for idx from 0 til @parsed.length =>
56
- sum += @parsed[idx].value
57
- if (sum / total) > (@cfg.collapse.threshold or 0.75) => break
58
- other = @parsed.splice(idx + 1)
59
- if other.length => @parsed.push {name: t("other"), value: other.reduce(((a,b) -> a + b.value),0)}
60
- @tint.reset!
61
- @parsed.map ~> @tint.get(it.name or it._idx)
62
-
63
- offset = 0
64
- for i from 0 til @parsed.length =>
65
- ret = @parsed[i]
66
- ret.offset = offset
67
- offset += ret.value
68
- @total = offset or 1
69
-
70
- resize: ->
71
- @layout.update false
72
- node = @layout.get-node \legend
73
- node.textContent = ""
74
- @parsed.map ~>
75
- div = document.createElement \div
76
- p = (100 * (it.value / @total)).toFixed(1)
77
- div.textContent = it.text = "#{it.name} / #p%"
78
- node.appendChild div
79
-
80
- @nboxes = @parsed.map (d,i) ~> @layout.get-node \legend .childNodes[i] .getBoundingClientRect!
81
- @rbox = @layout.get-node \legend .getBoundingClientRect!
82
- @lbox = @layout.get-box \link
83
- box = @layout.get-box \view
84
- @layout.update false
85
- box = @layout.get-box \view
86
- [w,h] = [box.width, box.height]
87
- size = Math.min(w,h)
88
- @scale.y.range [0, box.height] .domain [0, @total]
89
- render: ->
90
- {total,cfg,layout,tint,scale,nboxes,rbox,lbox} = @
91
- if @cfg? and @cfg.palette => @tint.set(@cfg.palette.colors.map -> it.value or it)
92
- box = @layout.get-box \view
93
- offset = 0
94
- if (@idx?) and nboxes.length =>
95
- @idx = (@idx <? @nboxes.length - 1 >? 0)
96
- offset = nboxes[@idx]y - rbox.y
97
- last = nboxes[* - 1].y + nboxes[* - 1].height - rbox.y
98
- if last - offset < rbox.height => offset = last - rbox.height
99
-
100
- @g.view.selectAll \rect .data @parsed
101
- ..exit!remove!
102
- ..enter!append \rect
103
- @g.view.selectAll \rect
104
- ..attr \x, -> 0
105
- ..attr \y, (d,i) -> scale.y(d.offset)
106
- ..attr \width, -> box.width
107
- ..attr \height, (d,i) -> (scale.y(d.offset + d.value) - scale.y(d.offset) - 1) >? 1
108
- ..attr \fill, (d,i) ->
109
- return tint.get Math.ceil(((d.offset + d.value/2) / total) * 5)
110
- ret = tint.get 0, (((i % 3) - 1) / 5)
111
- if cfg.collapse.enabled =>
112
- nbox = nboxes[i]
113
- y1 = (nbox.y - rbox.y) + (nbox.height / 2)
114
- if y1 < rbox.height => return ret
115
- ret = ldcolor.hcl(ret)
116
- ret.c = ret.c * 0.1
117
- ret.l = ret.l * 1.1
118
- return ldcolor.web(ret)
119
- @g.legend.selectAll \g.label .data @parsed
120
- ..exit!remove!
121
- ..enter!append \g .attr \class, \label
122
- @g.legend.selectAll \g.label
123
- .each (d,i) ->
124
- if @_text != d.text =>
125
- @_text = d.text
126
- n = layout.get-node \legend .childNodes[i]
127
- ret = wrap-svg-text node: n, use-range: true
128
- @textContent = ""
129
- @appendChild ret
130
- .transition!duration 350
131
- .attr \opacity, (d,i) ->
132
- nbox = nboxes[i]
133
- y = nbox.y - rbox.y - offset
134
- if y < 0 or y > rbox.height - nbox.height/2 => 0 else 1
135
- .attr \transform, (d,i) ->
136
- nbox = nboxes[i]
137
- "translate(#{nbox.x - rbox.x}, #{nbox.y - rbox.y - offset})"
138
- @g.link.selectAll \path .data @parsed
139
- ..exit!remove!
140
- ..enter!append \path
141
- .attr \fill, \none
142
- .attr \stroke-width, 1
143
- @g.link.selectAll \path
144
- #.attr \stroke, cfg.line
145
- .attr \stroke, (d,i) ->
146
- return tint.get Math.ceil(((d.offset + d.value/2) / total) * 5)
147
- .transition!duration 350
148
- .attr \d, (d,i) ->
149
- x0 = 0
150
- x1 = lbox.width / 10
151
- x2 = 9 * lbox.width / 10
152
- x3 = lbox.width
153
- y0 = scale.y(d.offset + d.value / 2)
154
- nbox = nboxes[i]
155
- y1 = (nbox.y - rbox.y) + (nbox.height / 2) - offset
156
- if Math.abs(y1 - y0) < 2 => y1 = y0
157
- "M#x0 #y0 L#x1 #y0 L#x2 #y1 L#x3 #y1"
158
- .attr \opacity, (d,i) ->
159
- nbox = nboxes[i]
160
- y0 = scale.y(d.offset + d.value / 2)
161
- y1 = (nbox.y - rbox.y) + (nbox.height / 2) - offset
162
- if Math.abs(y1 - y0) < 2 => y1 = y0
163
- return if y1 > (rbox.height) or y1 < 0 => 0 else 1
164
-
165
-
166
-
167
- return block-factory
@@ -1,34 +0,0 @@
1
- div
2
- div(plug="layout")
3
- .pdl-layout
4
- div(data-type="layout")
5
- .pdl-cell(data-name="view")
6
- .pdl-cell(data-name="link")
7
- .pdl-cell(data-name="legend")
8
- div(data-type="render")
9
- style(type="text/css"): :stylus
10
- .pdl-layout > div[data-type=layout]
11
- display: flex
12
- justify-content: center
13
- align-items: center
14
- padding: .5em
15
- & > [data-name=view]
16
- height: 100%
17
- min-width: 2.5em
18
- margin-right: .5em
19
- flex: 1 0 2.5em
20
- & > [data-name=link]
21
- height: 100%
22
- width: 2.5em
23
- margin-right: .5em
24
- flex: 0 0 auto
25
- & > [data-name=legend]
26
- flex: 1 0 auto
27
- width: fit-content
28
- max-width: 60%
29
- height: 100%
30
- display: flex
31
- flex-direction: column
32
- justify-content: start
33
- align-items: start
34
- script(type="@plotdb/block"): include:lsc index.ls