@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,265 +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 100].map (val) ~>
22
- ret = {}
23
- [1 to sample-count].map (i) -> ret["val#i"] = Math.random! * (10 - Math.abs(10 - val)) + val
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
- dimension:
31
- value: {type: \R, name: "y axis", multiple: true}
32
- order: {type: \ON, name: "x axis"}
33
- init: ->
34
- svg = d3.select @svg
35
- <[view yaxis xaxis legend]>.map ~> @{}g[it] = d3.select(@layout.get-group(it))
36
- @tint = tint = new chart.utils.tint!
37
- @line = d3.line!
38
- .defined ~>
39
- !isNaN(it.y1)
40
- .x ~> @scale.x it.x
41
- .y ~> @scale.y it.y1
42
- #.curve d3.curveCatmullRom
43
- @area = d3.area!
44
- .defined ~>
45
- !isNaN(it.y1) and !isNaN(it.y0)
46
- .x ~> @scale.x it.x
47
- .y0 ~> @scale.y it.y0
48
- .y1 ~> @scale.y it.y1
49
- @xaxis = new chart.utils.axis layout: @layout, name: \xaxis, direction: \bottom
50
- @yaxis = new chart.utils.axis layout: @layout, name: \yaxis, direction: \left
51
- @tip = new chart.utils.tip {
52
- root: @root,
53
- range: ~> return @layout.get-node \view .getBoundingClientRect!
54
- }
55
- @_evthdr = {}
56
- @root.addEventListener \mouseout, @_evthdr.out = (evt) ~> @tip.hide!now!
57
- @root.addEventListener \mousemove, @_evthdr.move = (evt) ~>
58
- x = evt.clientX - @layout.get-node(\view).getBoundingClientRect!x
59
- y = evt.clientY - @layout.get-node(\view).getBoundingClientRect!y
60
- min = {d: -1, p: null, series: null}
61
- for i from 0 til @parsed.length =>
62
- series = @parsed[i]
63
- for j from 0 til series.pts.length =>
64
- p = series.pts[j]
65
- if isNaN(p.y1) or isNaN(p.x) => continue
66
- dx = Math.abs(@scale.x(p.x) - x)
67
- dy = Math.abs(@scale.y(p.y1) - y)
68
- d = (dx ** 2) + (dy ** 2)
69
- if min.d < 0 or min.d > d => min <<< {d, p, series}
70
- if !(min.p and min.d and min.series) => return
71
- bind = min.series.bind
72
- pt = min.p
73
-
74
- data = {
75
- name: """#{if bind => bind.name or bind.key or ''} /
76
- #{pt.data.orderText or pt.data.order or pt.x}#{@binding.order.unit or ''}
77
- """
78
- value: if isNaN(pt.v) => '-' else "#{(pt.v).toFixed(2)}#{if bind => (bind.unit or '') else ''}"
79
- }
80
- box = x: @scale.x(pt.x), y: @scale.y(pt.y)
81
- @tip.render {data, evt: evt, box}
82
-
83
- @legend = new chart.utils.legend do
84
- layout: @layout
85
- root: @root
86
- name: \legend
87
- shape: (d) -> d3.select(@).attr \fill, tint.get d.text
88
- direction: \vertical
89
- cfg: selectable: true
90
- @legend.on \select, ~> @bind!; @resize!; @render!
91
- @scale = { x: d3.scaleLinear!, y: d3.scaleLinear! }
92
-
93
- destroy: ->
94
- @root.removeEventListener \mouseout, @_evthdr.out
95
- @root.removeEventListener \mousemove, @_evthdr.move
96
- @tip.destroy!
97
-
98
- parse: ->
99
- @data.map (d,i) ->
100
- d.order-text = '' + (if !(d.order?) => i else d.order)
101
- d._order = if !(d.order?) or isNaN(+d.order) => i else +d.order
102
- @data.sort (a,b) -> if a._order > b._order => 1 else if a._order == b._order => 0 else -1
103
- @legend.data @binding.value.map -> {key: it.key, text: it.key}
104
-
105
- bind: ->
106
- binds = @binding.value
107
- binds = @binding.value.map((b,i) -> {b, i}).filter (d,i) ~> @legend.is-selected d.b.key
108
-
109
- # if bump
110
- if @cfg.bump =>
111
- @parsed = []
112
- dd = @data.map (d) ~>
113
- ret = {} <<< d
114
- v = ret.value.map (d,i) ~> {i: i, v: if @legend.is-selected(@binding.value[i].key) => d else NaN}
115
- v.sort (a,b) ->
116
- if isNaN(a.v) and isNaN(b.v) => return 0
117
- else if isNaN(b.v) => return -1
118
- else if isNaN(a.v) => return 1
119
- return b.v - a.v
120
- v.map (d,i) -> d.r = i + 1
121
- v.sort (a,b) -> a.i - b.i
122
- ret.value = v.map -> if isNaN(it.v) => NaN else it.r
123
- ret.original-value = v.map -> it.v
124
- ret
125
-
126
- @parsed = binds.map (b,i) ~>
127
- pts: (dd or @data).map (d,j) ->
128
- {data: d, y0: 0, y1: d.value[b.i], x: d._order, v: if d.original-value => d.original-value[i] else d.value[i]}
129
- bind: b.b
130
- color: b.b.name or b.b.key
131
-
132
- # if stacked
133
- if @cfg.stack =>
134
- ys = @data.map -> it.value.reduce(((a,b)-> a + b),0)
135
- @parsed = []
136
- for i from 0 til binds.length =>
137
- b = binds[i].b
138
- last = @parsed[i - 1] or null
139
- @parsed.push do
140
- pts: @data.map (d,j) ->
141
- y1: (d.value[i] + if !last => 0 else last.pts[j].y1)
142
- y0: if !last => 0 else last.pts[j].y1
143
- x: d._order
144
- v: if d.original-value => d.original-value[i] else d.value[i]
145
- bind: b
146
- color: b.name or b.key
147
-
148
- resize: ->
149
- @tip.toggle(if @cfg.{}tip.enabled? => @cfg.tip.enabled else true)
150
- [miny,maxy] = [0,0]
151
- for i from 0 til @parsed.length =>
152
- for j from 0 til @parsed[i].pts.length =>
153
- p = @parsed[i].pts[j]
154
- if !isNaN(p.y0) and miny > p.y0 => miny = p.y0
155
- if !isNaN(p.y1) and miny > p.y1 => miny = p.y1
156
- if !isNaN(p.y0) and maxy < p.y0 => maxy = p.y0
157
- if !isNaN(p.y1) and maxy < p.y1 => maxy = p.y1
158
-
159
- @extent =
160
- x: d3.extent @data, -> (it._order)
161
- y: [(if @cfg.bump => miny >? 1 else miny), if maxy == miny => miny + 1 else maxy]
162
-
163
- @scale.x.domain @extent.x
164
- @scale.y.domain (if @cfg.bump => [@extent.y.1, @extent.y.0] else @extent.y)
165
-
166
- [w,h] = [@box.width, @box.height]
167
- max-tick = Math.ceil(@layout.get-box \yaxis .height / 40) >? 2
168
- yticks = if @cfg.bump => [1 to ((@parsed.length or 1) >? 1)]
169
- else @scale.y.ticks((@cfg.{}yaxis.tick-count or 4) <? max-tick)
170
- yfmt = chart.utils.format.auto yticks
171
-
172
- @legend.config @cfg.legend
173
- @legend.update!
174
-
175
- @yaxis.config @cfg.yaxis
176
- @yaxis.ticks yticks
177
- @yaxis.scale @scale.y
178
- if @cfg.bump =>
179
- @yaxis.caption t \rank
180
- else
181
- if @parsed.length > 1 =>
182
- units = Array.from(new Set(@parsed.map -> it.bind.unit)).filter -> it
183
- if units.length > 1 => @yaxis.caption('')
184
- else @yaxis.caption( units.0 or '')
185
- else
186
- v = (@parsed.0 or {}).bind or {}
187
- @yaxis.caption( (v.name or v.key or '') + if v.unit => "(#{v.unit})" else '')
188
-
189
- @xaxis.config @cfg.xaxis
190
- @xaxis.ticks @data.map -> {v: it._order, t: it.order-text}
191
- @xaxis.scale @scale.x
192
- @xaxis.caption(
193
- (@binding.order.name or @binding.order.key) +
194
- if @binding.order.unit => "(#{@binding.order.unit})" else ''
195
- )
196
-
197
- # xaxis and yaxis affect each other and they all affect view.
198
- # we may need to update them until stable but for now we simply layout twice.
199
- for i from 0 til 2 =>
200
- @layout.update false
201
- box = @layout.get-box('view')
202
- [w,h] = [box.width, box.height]
203
- @tint.set @cfg.palette
204
- r = @cfg.dot-size or 3
205
- @scale.x.range [0, w - r]
206
- @scale.y.range [h, r]
207
- @xaxis.render!
208
- @yaxis.render!
209
-
210
- render: ->
211
- {scale,tint,extent} = @
212
- r = @cfg.dot-size or 3
213
- vbox = @layout.get-box \view
214
- lbox = @layout.get-box \yaxis
215
- @g.view.selectAll \path.data .data(@parsed, -> it.bind.key)
216
- ..exit!remove!
217
- ..enter!append \path .attr \class, \data
218
- .attr \fill, \none
219
- .attr \d, (d,i) ~>
220
- if @cfg.stack or @cfg.area => @area d.pts
221
- else @line d.pts
222
- .attr \stroke, (d,i) ~> @tint.get d.color
223
- .attr \stroke-width, 1
224
- @g.view.selectAll \path.data
225
- .transition!duration 150
226
- .style \opacity, (d,i) ~> if @legend.is-selected(d.bind.key) => 1 else 0.3
227
- .attr \d, (d,i) ~>
228
- if @cfg.stack or @cfg.area => @area d.pts
229
- else @line d.pts
230
- .attr \stroke, (d,i) ~> @tint.get d.color
231
- .attr \fill, (d,i) ~> if @cfg.stack or @cfg.area => @tint.get(d.color) else \none
232
- .attr \fill-opacity, ~> \0.5
233
- @g.view.selectAll \g.dot .data(@parsed, -> it.bind.key)
234
- ..exit!remove!
235
- ..enter!append \g .attr \class, \dot
236
- @g.view.selectAll \g.dot
237
- .style \opacity, (d,i) ~> if @legend.is-selected(d.bind.key) => 1 else 0.3
238
- .each (d,i) ->
239
- d3.select(@).selectAll \circle.dot .data d.pts
240
- ..exit!remove!
241
- ..enter!append \circle .attr \class, \dot
242
- .attr \r, r
243
- .attr \fill, \#fff
244
- .attr \stroke, tint.get(d.bind.name or d.bind.key)
245
- d3.select(@).selectAll \circle.dot
246
- .filter (d,i) -> isNaN d.y1
247
- .attr \cx, (d,i) -> if isNaN(scale.x d.x) => scale.x(extent.x.0) else scale.x(d.x)
248
- .attr \cy, (d,i) -> scale.y(extent.y.0)
249
- .transition 150
250
- .attr \opacity, 0
251
- d3.select(@).selectAll \circle.dot
252
- .filter (d,i) -> !isNaN d.y1
253
- .attr \cx, (d,i) -> scale.x d.x
254
- .attr \cy, (d,i) -> scale.y d.y1
255
- .attr \r, r
256
- .attr \fill, tint.get d.color
257
- .attr \stroke, tint.get d.color
258
- .transition 150
259
- .attr \opacity, 1
260
- @legend.render!
261
- @xaxis.render!
262
- @yaxis.render!
263
-
264
-
265
- 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